防火墙实现技术路线/多媒体数据库系统体系结构
在介绍Windows网络体系架构之前,先介绍一下Windows中的两个重要编程规范——TDI,NDIS.,然后再介绍网络体系的架构。TDI,Transport Driver Interface,传输驱动程序接口。\Windows\System32\Drivers\Tdi.sys。在实现网络API驱动程序时,由于牵涉到很多不同协议,会用到不同协议驱动提供的接口,使得开发的工作复杂化。所以Microsoft在网络API驱动程 序和协议驱动之间又增加了一层TDI。TDI接口只是一种“将网络请求格式化成IRP,以及申请网络地址和数据通信”的做法规范化。遵从TDI标准的传输 协议向他们的客户(如Socket emulator,Netbios emulator等)导出了TDI接口,有利于上下层之间的通信:
一方面,对于TDI上层的网络API驱动程序就不需要使用所有协议驱动程序所提供的接口,直接使用TDI提供的统一接口。
另一方面,对于下层协议驱动程序(也称为TDI Transport Provider传输器)直接由TDI接口来调用,发出请求。
在Windows VISTA版本之后,TDI就不再使用了,取而代之的是Windows filter platform和Winsock kernel。
NDIS,Network Driver Interface Specification,网络驱动程序接口规范,在操作系统中的位置\Windows\System32\Drivers\NDIS.sys。当一个协议驱动程序想要按照其协议的格式解析网上读写的数据时,而这些数据必须通过网络适配器才能取得,期望协议驱动程序能够理解市场上的每一款网络适配器的细微区别是不可能的。所以在1989年,由Microsoft和3Com联合开发的了NDIS,使得协议驱动程序可以以一种与设备无关的方式来跟网络适配器驱动程序进行通信。遵从NDIS的网络适配器驱动程序称为NDIS minport driver。
NDIS规范实现了与TDI标准类似的功能,都是将复杂的下层调用规范化、标准化,大大提高了Windows操作系统的可扩展性和兼容性。也表现在两个方面:
对于下层,让网络适配器制造商很easy的开发自己的设备驱动程序,也就是Ndis miniport driver。这些 miniport driver直接利用NDIS提供的接口发送指令,NDIS对这些格式化的指令进行解析,做进一步处理。
对于上层,多个协议驱动程序与下层minport driver之间的通信,也都是通过统一的NDIS接口,NidsAllocatePacket,NdisSend等函数来收发数据。
设备制造商开发的Ndis miniport driver直接调用NDIS库中的接口函数,因此不需要考虑重入的问题,就是一个请求尚未结束的时候,新的请求又进来了。NDIS库对请求进行了序列 化,但是这种序列化也妨碍了多处理器的扩展性。所以NDIS5中提供了非序列化的操作项。下面,我来介绍一下,Deserialized和 Serialized minport driver的区别:
Deserialized NDIS miniport driver自己序列化对MinportXxx函数的操作,排队和管理多个并发请求的任务都由驱动程序自己来完成。而Serialized NDIS miniport driver以上的工作都是依赖于NDIS库来完成的。从性能角度看,Deserialized NDIS miniport driver的性能是Serialized NDIS miniport driver性能的2倍多,所以到NDIS6.0之后的所有Miniport driver都是deserialize的。
以上是参考MSDN以及自己的一些理解画出来的windows网络架构图,下面从上到下来简单介绍一下其中的各个层。
1. 网络应用程,Network applicantion,用户态的应用程序调用Windows操作系统提供的网络API,网络API包括:
a) Windows套接字(winsock)
b) 远程过程调用RPC
c) Web访问API
d) 命名管道和邮件槽
e) 其他网络API
这些API既可以在用户模式下实现,也可以同时在用户模式和内核模式下实现。从本质上说这些API是下层提供接口的另一层封装而已。
2. TDI Clients,传输驱动程序接口客户,是内核模式的设备驱动程序,用于实现网络API的内核部分。将网络API的请求转换成IRP,通过TDI标准格式 化后,发送给下层的协议驱动(也就是TDI传输器)。从sockets emulator的架构图看到,TDI Clients的实现可以有用户态的部分,也有内核态的部分。AFD辅助功能驱动程序通过向协议驱动程序发送TDI IRP来执行网络套接字操作,比如发送和接受消息。AFD没有不是确定使用哪一个协议驱动,而是上层通知其要使用的协议名称,然后AFD去打开相应协议的设备对象。
3. TDI Transport Providers、TDI传输器、NDIS协议驱动程序、协议驱动程序,所有这些其实就是指的同一个东西,我在后面就称其为协议驱动程序。这个部分就是我们对某个协议的具体实现部分。做过网络协议开发的朋友一定知道,协议其实就是双发协商好的一套通信的规则。以IP 协议为例,实际上就是对网络数据的一种处理方式,根据网络数据包的解析结构,做出相应的处理。Windows的tcpip.sys就实现了多个协 议,ip、tcp、udp、arp、icmp、igmp,它为上层的TDI Clients提供了5个设备对象,用于访问使用这些协议,TDI Clients打开这些设备对象,向其发送IRP请求来实现自己的操作。通过DDK的DeviceTree我们可以得到这些设备对象:
a) \Device\Rawip
b) \Device\Tcp
c) \Device\Udp
d) \Device\IPMULTICAST
e) \Device\Ip
协议驱动程序处理的数据是通过NDIS库中提供的接口来获取的,不需要发送IRP来取得。在DDK XP中提供了一个协议驱动程序了源程序 Ndisuio,DDK XP后的版本提供的是Ndisport。在DriverEntry中我们可以看到,驱动程序一开始就注册了一个 NDIS_PROTOCOL_CHARACTERISTICS,这个结构体中是一堆NdisXxxx函数。NDIS规范在这里就开始发挥它的作用了。
协议驱动程序的另一个作用就是监听网络数据,自己开发一个网络协议通过Ndis API获得所有的网络数据,但是不能够拦截网络数据,因为其他协议驱动也可以通过Nids API获取数据。一个典型的应用就是Winpcap了,使用NPF.SYS来捕获网络数据,并且做好充分缓冲处理,防止大数据量到来时出现数据包丢失的情况。详情情节winpcap的开源代码。
具体的协议驱动开发过程,可以参看Ndisuio和DDK doc。
4. NDIS,Network Driver Interface Specification,网络协议接口标准。从图中我们可以看到包裹在其中的两个驱动程序,一个是NDIS intermediate driver,NDIS中间层驱动程序,另一个是NDIS minport driver,小端口驱动程序。下面简单介绍一下这两个驱动程序:
a) Ndis intermediate driver:NDIS中间层驱动程序。对于上层的protocol driver它充当 minport driver的作用,对于下层的minport driver它充当一个protocol driver的作用,所以在驱动程序 DriverEntry中就注册NDIS_PROTOCOL_CHARACTERISTICS和 NDIS_MINIPORT_CHARACTERISTICS,使用protocol characteristics中NDIS API从 miniport driver那里取得数据包,再用miniport characteristics的NDIS API向上层的 protocol driver发送数据包。Nids intermediate driver最大的优势就是所有miniport driver的数据包都要通过它这里倒手给protocol driver,所以网络防火墙就看上了这块风水宝地。现在很多网络防火墙都使用 NDIS intermediate driver做数据包的过滤和拦截工作,过滤的规则设置到 MPSendPackets,PTReceive,PTReceiveRacket这三个函数。
b) Ndis miniport driver:小端口驱动,其实是真正的网卡驱动。一般是由设备厂商提供的,在DDK中也提供了miniport driver的一个例子 e100bex,支持Intel EtherExpressTM PRO/100+ Ethernet PCI adapter 和 Intel EtherExpressTM PRO/100B PCI adapter两款网络适配器。在安全软件领域,小端口驱动的技术主要用于虚拟网络。
防火墙技术在网络安全领域是数据加密与签名外的另一个核心要点。基于Windows平台上的个人防火墙系统的实现需要理解Windows的网络编程的一些独特底层接口和网络协议底层,难度极大。另外,个人防火墙系统实现所用到的很多软件技术和企业级的网络防火墙、硬件防火墙原理基本是相同的,因此对个人防火墙系统的研究能极大地推动网络安全技术进步和人才涌现,具有重大工程意义。
国外在该领域发展得比较快,国内主要有天网防火墙和许多原来是开发杀病毒软件的开发商的个人防火墙,如KV系列、KILL系列、金山系列等,而且在实用性能上并不比国外知名品牌逊色。由于网络安全领域涉及机密多,无法得到商业个人防火墙的技术实现细节上的区别联系。
1,个人防火墙功能分析
(1)实时监控,根据安全规则对进出本机的网络封包进行过滤;
(2)受到攻击时向用户报警指示;
(3)日志记录网络访问动作的详细信息;
(4)电子邮件监控,可以根据自定义的过滤规则对邮件实施过滤;
(5)根据特征库进行入侵检测;
(6)在线升级特征库;
(7)将防毒、杀毒和个人防火墙集成在一起。
这里进一步继续分析。取并集可以得到一种功能强大的方案,但很多功能不完全属于防火墙技术领域的研究范围,如入侵检测和防毒杀毒和邮件监控功能,而在线升级是~种技术支持的手段。入侵检测是项复杂的技术,有许多实现方法,最常用的是借鉴杀毒软件的工作原理定义一个入侵的特征库,根据这个特征库里的数据用包过滤技术对入侵进行拦截,也就是基于特征库进行数据包截获分析,其难点是特征库的建立完善和自学习(关于特征库的建立和自学习不是本项目的研究内容),但本质仍然是以包过滤为核心。
入侵检测和各种规则过滤(包括应用程序规则和电子邮件规则)都是基于数据包截获分析技术基础上的,可以在不同的网络体系结构层次截获网络通信数据包,然后结合自定义控管规则进行分析判断是拦截还是放行。因此,防火墙软件技术的核心是数据包封包截获——对网络上流动的数据包截获并分析,通过控管规则来决定放行或者禁止出/入。因此,这里定义个人防火墙软件系统应该具有的功能点有:
(1)根据应用程序控制访问规则对应用程序的联网动作进行过滤检查;
(2)对应用程序控制访问规则具有自学习功能;
(3)可实时监控,监视网络活动;
(4)具有日志,以记录网络访问动作的详细信息;
(5)被截获时通过声音或闪烁的图标向用户报警提示。
2 ,Windows网络体系结构分析
OSI/RM(OSI参考模型)是ISO最早给出的网络体系结构参考模型嘲,它首先提出了协议分层和对等层通信,已成为描述和理解各种网络协议和网络通信过程的标准术语。本节将使用OSI参考模型尽可能准确地描述Windows操作系统的网络体系结构,进而分析得到数据包截获可能发生的网络层次与方法。
给出了OSI七层参考模型与Window的网络驱动分层结构,因此包截获可以发生在网卡驱动程序所在的数据链路层及其以上直至应用层的各层中,这给我们提供了拦截网络数据包的基本思路。MicrosoR在Windows的各个网络协议层次上都提供了一些公开规范或者未公开非常规的方法方便开发者来插入一层,因此可以利用这些规范或者非常规的方法在插入的一层处理中进行数据包截获。
在用户态下进行网络数据包拦截就是指会话层和表示层的包截获,利用WinsockSPl(serviceproviderinterface,服务提供程序接口)或直接替换系统自带的Winsock动态链接库来截获包,注意这里指的WinsockSPI编程并不是指Windows上的套接字编程Winsock网络编程。另一个难点是对各种网络坍议的解析,可以使用一些嗅探器软件工具(如著名的Sniffer)来学习各种TCP/IP协议。
TDI层及以下底层的操作必须借助它提供的一些接口和开发规范进行,操作系统工作在系统态保护模式下。在系统态下的截获要使用到WindowsDDK(windowsdevicedevelopingkit)和TDI(transport layer device interface filter driver)、NDIS接口规范(networkdriverinterfacespecification)。DDK是Windows下驱动开发的开发包,可以通过学习W/NDDK中的一些简单范例找到解决方法。
在系统态下首先看最底层,从网络体系结构来看截获可发生在网卡驱动程序所在的数据链路层。但防火墙系统需要从数据包截获中得到的主要是IP地址、协议服务类型和应用程序信息,在网络层进行截获已经足够可以获得这些信息,无必要对网卡MAC帧进行截获分析。而且在网卡截获适应各种各样的网卡硬件环境,实际上也就是开发一个网卡驱动程序,这与防火墙系统的开发目标不太吻合。
从上向下看系统态下的方案还可以利用TDI层上的过滤驱动程序或网络层上的NDIS中间层驱动程序来做文章,前者是TDI接口规范后者是NDIS接口规范。系统态的方法就是开发驱动程序的方法,只不过这里是软件驱动程序而不是直接和硬件打交道的硬件驱动程序。
微软和3Com公司在1989年制定了一套开发Windows下底层驱动程序的标准,称为NDIS,是开发网络驱动及网卡驱动的接口规范,所有的网络通信都最终要通过NDIS。N-DIS为网络驱动的开发提供了一套标准的接口,从OSI网络体系结构来看横跨了三层(数据链路层、网络层和传输层),使得网络驱动程序的跨平台性更好。NDlS提供以下几个层次的接口:
①NDIS小端口驱动,开放Miniport接口给上层驱动程序调用。可以用Miniport驱动实现网卡驱动;
②中间驱动,它兼有Miniport和Protocol接口分别与上层的协议驱动程序和底层小端口驱动程序对接通信;
③协议驱动,例如传输驱动程序Tcpip.sys。
3技术路线选择
个人防火墙的工作是监控网络进出的数据流,对用户认为危险或者有害的数据流向进行禁止或者监控,其核心功能是网络数据包的监控于分析过滤。从底层看,NDIS的中间驱动由于是在网卡驱动程序和传输驱动程序之间插入了一层,所以可以截获较为底层的封包,可以完成更为低级(最底层的是在网卡驱动程序层截获,但前面阐述过在网卡驱动程序层做网络数据包截获没有实现价值)的操作,不会有网络数据包从这里旁路,因此其最大的优点是安全系数高,但需要指出的是,NDIS层次上的网络操作不采用标准的I/O模式(IRP)形式,因此不能确定某个网络操作是由哪个进程引起的。个人用户看不到网络数据是源于哪个进程,就不容易让用户自定义过滤包规则,这是个非常大的遗憾和缺陷。当然。越靠近底层的驱动程序编写可移植性和健壮性越难保证,编码复杂也是其一个缺点。
对于TDI过滤驱动程序,由于采用标准的Windows I/O请求(IRP),它没有NDIS中间层驱动的不能得到进程信息的缺点,但由于它工作在传输驱动程序Tcpip.sys之上,由Tepip.sys接收后直接处理的数据包是不会传递到上层TDI过滤驱动程序的,如ICMP协议的应答包。Ping和Traeert就是利用ICMP来探测网络的可达性和跟踪路由。
NDIS中间驱动和TDI过滤驱动,都是32位Windows平台上才提供的方法。整个NDIS规范和TDI的概念,是在Win.dows NT平台上提出和得到发展的,以后的Windows 2000,Windows XP都支持,但以前的Windows 98和WindOWS Me都不支持。因此如果要开发一个通用的Windows平台下的个人防火墙软件,这两种方法是不适合的。
对于用户态下的SPI方法,它使用DLL监控使用Winsock调用进行网络通信的网络数据包。它工作在TDI客户之上,所有的用户进程之下,因此对于用户进程交给它的网络请求和意图非常清楚——在经过底层的分段(IP分段)之前,对用户进程的行为,目的可以更直观的了解,非常适合做内容过滤。并且其截获的所有Winsock调用广泛地被所有Windows平台支持。另外编程相对简单,平台适应性好。其最大的缺点是有的网络程序使用TDI接口提供的一些函数例程直接发起通信的发送和接收,用户态的数据包截获技术对此类程序无能为力。另外,和TDI方法一样,对那些由Tcpip.sys接收后直接处理的数据包,如利用ICMP协议的应答包进行探测网络可达性的Ping和Tracert等,由于它位于TDI的更上层,用户态的数据包截获技术对此旁路无能为力。
结合项目目标,要实现通用于Windows平台的个人防火墙系统只有采用SPI包过滤技术路线进行开发。另外,个人防火墙系统应能详细记录各种进程的访问网络信息,而应用层截获能最早得到应用层进程的发送数据包信息,能得到最完整的接收方发送的数据包信息,因而能实现记录最丰富网络访问信息的个人防火墙系统。或者可以认为,若须记录最详细的进程访网信息,必须使用SPI包过滤技术。
浙公网安备 33010602011771号