摘 要:包过滤机制是对所捕获到的数据包根据用户的要求进行筛选,最终只把满足过滤条件的数据包传递给用户程序。重点对两种常见的包捕获机制进行了分析。
关键词:包捕获;BPF;NPF
包捕获机制是依赖于操作系统的,从广义的角度上看,一个包捕获机制包含三个主要部分:最底层是针对特定操作系统的包捕获机制,最高层是针对用户程序的接口,第三部分是包过滤机制。
不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异。数据包常规的传输路径依次为网卡、设备驱动层、数据链路层、网络层、传输层、最后到达应用程序。而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤、缓冲等相关处理,最后直接传递到应用程序。
1 常见的包捕获机制
不同的操作系统上有不同的包捕获机制:SunOS系统中有NIT接口;在DEC的Uhrix环境下有Uhrix Packet Filter;在SCII的IRIX中有SNOOP;Linux系统为用户提供了一种工作在数据链路层的套接字SOCK PACKET;BSD UNIX系统下的BPF(BSD Packet Filter);在Windows平台上,近几年也陆续有多种捕获应用工具面世,如Netmnon API,PCAUSA等,与BPF不同的是,这些产品是商业性质的。Winpcap则是Window平台上为数不多的功能强大且可免费获得的包捕获接口软件之一,来源于BSD的网络数据包过滤器NPF是Winpcap的核心部分。BPF和NPF是效率较高、应用广泛的包捕获机制,在下一节的包捕获过滤模型中将对其进行详细介绍,常用的包捕获机制如下表所示:
2 包捕获过滤模型
通常,网络信息中会存在若干用户不关心的数据,或者称为垃圾数据,若此所占比重较大,将严重影响捕包系统的工作效率,造成系统丢包。为了解决此问题,人们引入了包过滤机制,包过滤机制在包捕获机制中占有重要的地位。实际上在理论研究和实际应用中,包捕获和包过滤从语意上并没有严格的区分,关键在于认识到捕获数据包必然有过滤操作。
UNIX和Windows系统下的包捕获过滤机制分别是BPF和NPF,由于这样基于软件的数据包捕获机制便于发布且灵活性强,升级方便,因此,许多提供网络监视和分析的专业软件都是使用这种方式来实现的。我们之所以研究BPF和NPF的捕获过滤模型,就是为了通过深入地理解和运用模型的工作机制进行数据包的采集和过滤,从而开发出高效可靠的网络协议分析系统。下面将详细介绍这两种机制的参考模型。
2.1 BPF参考模型BPF ( BerKeley Packet Filter)是基于BSD系统的包过滤模型,它使用了新的基于寄存器的过滤算法,效率比旧的算法提高了20倍,它的缓存机制对整体效率的提高有很大作用。 BPF有两个主要部件,网络包监视(Network Tap)和网络包过滤(Packet Filter)。Network Tap从网络设备驱动程序中搜集数据拷贝并转发给过滤器。过滤器决定是否接收该数据包,以及接收该复制数据包的哪些部分(Slice 技术)。BPF过滤器的过滤功能是通过虚拟机(Pseudo Machine)执行过滤程序来实现的。过滤程序(Filter Program)实际上是一组过滤规则。过滤规则由用户定义,以决定是否接收数据包和需要接收多少数据。过滤过程可描述如下:当数据包到达网络接口时,链路层驱动程序将其提交到系统协议栈;如果BPF正在此接口监听,驱动程序将首先调用BPF,BPF将数据包发送给过滤器,过滤器对数据包进行过滤,并将数据提交给过滤器关联的上层应用程序;然后链路层驱动将重新取得控制权,将数据包提交给上层的系统协议栈处理。
系统主要由三部分组成:Network Tap,BPF和Libpcap。Network Tap监视共享网络中的所有包,BPF用过滤条件匹配所有由Network Tap监视到的包,若匹配成功则将之从网卡驱动的缓冲区中复制到核心缓冲区。Libpcap是一个系统无关、采用分组捕获机制的分组捕获函数库,用于访问数据链路层。这个库为不同的平台提供了一致的编程接口,在安装了Libpcap的平台上,以Libpcap为接口写的程序、应用,能够自由的跨平台使用。大多数监听程序都使用它和内核部分进行通信。
2.2 NPF参考模型
Winpcap是针对Win32平台上的抓包和网络分析的一个架构,NPF则是Winpcap的重要组成部分之一。NPF的主要思想就是来源于Unix中的BPF,它的设计目标是要为Win32平台提供一个功能强大的开放式数据包捕获架构,使用户能够在Windows环境下直接开发高性能的网络分析与管理软件,也可以把原来运行在Unix系统中的许多分析工具经过简单的重新编译移植到Windows中。NPF作为BPF在Windows环境下的演化版继承了BPF的以下重要模块:过滤器,两级缓冲(核心和用户)以及用户级的一些函数库。 最底层的是网络接口,用来收发网络数据包。在捕获过程中,网络接口工作在混杂模式,接收网段中的所有数据包。数据包捕获驱动器是整个捕获栈中最底层的软件模块,它工作在系统内核层,通过NDIS网络驱动程序接口规范与网络接口的驱动程序进行通信,取得网络数据包,并向高层应用程序提供来自数据链路层数据的接口。
NPF参考模型由三个模块所组成,一个在内核级,另外两个以DLL的形式处于用户级:(1)内核级的网络捕包过滤器(NPF)。NPF是一个经过优化的内核模式驱动器,用于对数据包进行过滤,将接收的数据包提交给用户级。NPF采用循环缓冲区作为内核缓冲区,循环缓冲区就像一个队列一样,它的“头”和“尾”是不固定的两个指针,指针可以随着数据的进人或者复制到用户缓冲器而变动,运行过程中它会随时释放那些已复制的数据空间,通过这样的方式来保存数据包可以提高数据的存储效率。
(2)数据包底层动态链接库(Packet.d11)。数据包驱动程序库是与Libpcap相兼容的一组用户级的函数库。Packet.dll用于在Win32平台下为数据包驱动程序提供一个公共的接口。由于不同的Windows版本在用户级和内核级之间提供各不相同的接口,而Packet.dll可以屏蔽这些区别,提供一个与系统无关的API,因此基于Packet.dll开发的数据包截获程序可以运行于不同的Win32平台而不必重新进行编译。
(3)数据包高层驱动程序库(Wpcap.dll)。 Wpcap.dll是与操作系统无关的,它含有诸如产生过滤器、用户级缓冲以及包注入等高级功能。它提供了更加高层、抽象的函数,同时也提供了更加友好、功能更加强大的函数调用。
3 总结
数据包捕获(也称为监听,嗅探)技术是通过计算机的软件和硬件来截获在网络上传输的数据包,它工作在网络的底层,能够把在网络上传输的数据记录下来,并且通过相应的软件处理,实时解码分析这些数据的内容,从而获取人们所需要的数据
参考文献
[1]@徐丹,黎俊伟,高传善.基于ETHERNET的网络监听以及ARP欺骗[J].计算机应用与软件,2005,(11):4750.
[2]@赵树升,范刚龙,张焕剑.一种Windows网络嗅探器的检测原理与实现[J].郑州大学学报(理学版),2005,(03).
[3]@申志,赵跃龙,申强.一种分布式网络管理监控系统的研究与开发[J].计算技术与自动化,2006,(01).