libpcap小议

来源:互联网 发布:淘宝助理下载地址 编辑:程序博客网 时间:2024/05/22 14:57

4Libpacp过滤

libpcapunix/Linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。libpcap可以在绝大多数类unix平台下工作,其可以分为Linux的底层包捕获机制和过滤器设置方式,在这里我们讨论了libpcap使用的包过滤机制 BPF

libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。libpcap可以在绝大多数类unix平台下工作

下面二张图片反应其工作机制和原理。

libpcap 软件包可从 http://www.tcpdump.org/ 下载,然后依此执行下列三条命令即可安装,但如果希望libpcap能在Linux上正常工作,则必须使内核支持"packet"协议,也即在编译内核时打开配置选项 CONFIG_PACKET(选项缺省为打开)

./configure

./make

./make install


libpcap源代码由20多个C文件构成,但在Linux系统下并不是所有文件都用到。可以通过查看命令make的输出了解实际所用的文件。我们现在用的libpcap版本号为1.1.1,网络类型为常规以太网。libpcap应用程序从形式上看很简单,下面是一个简单的程序框架:

char * device; /* 用来捕获数据包的网络接口的名称 */

pcap_t * p; /* 捕获数据包句柄,最重要的数据结构 */

struct bpf_program fcode; /* BPF 过滤代码结构 */

/* 第一步:查找可以捕获数据包的设备 */

device = pcap_lookupdev(errbuf);

/* 第二步:创建捕获句柄,准备进行捕获 */

p = pcap_open_live(device, 8000, 1, 500, errbuf);

/* 第三步:如果用户设置了过滤条件,则编译和安装过滤代码 */

pcap_compile(p, &fcode, filter_string, 0, netmask);

pcap_setfilter(p, &fcode);

/* 第四步:进入(死)循环,反复捕获数据包 */

for( ; ; )

{

while((ptr = (char *)(pcap_next(p, &hdr))) == NULL);

/* 第五步:对捕获的数据进行类型转换,转化成以太数据包类型 */

eth = (struct libnet_ethernet_hdr *)ptr;

/* 第六步:对以太头部进行分析,判断所包含的数据包类型,做进一步的处理 */

if(eth->ether_type == ntohs(ETHERTYPE_IP)) 

…………

if(eth->ether_type == ntohs(ETHERTYPE_ARP)) 

…………

}

/* 最后一步:关闭捕获句柄,一个简单技巧是在程序初始化时增加信号处理函数,

以便在程序退出前执行本条代码 */

pcap_close(p);


数据包过滤机制
大量的网络监控程序目的不同,期望的数据包类型也不同,但绝大多数情况都都只需要所有数据包的一(小)部分。例如:对邮件系统进行监控可能只需要端口号为 25(smtp)和 110(pop3) 的 TCP 数据包,对 DNS 系统进行监控就只需要端口号为 53 的 UDP数据包。包过滤机制的引入就是为了解决上述问题,用户程序只需简单的设置一系列过滤条件,最终便能获得满足条件的数据包。包过滤操作可以在用户空间执行,也可以在内核空间执行,但必须注意到数据包从内核空间拷贝到用户空间的开销很大,所以如果能在内核空间进行过滤,会极大的提高捕获的效率。内核过滤的优势在低速网络下表现不明显,但在高速网络下是非常突出的。在理论研究和实际应用中,包捕获和包过滤从语意上并没有严格的区分,关键在于认识到捕获数据包必然有过滤操作。基本上可以认为,包过滤机制在包捕获机制中占中心地位。
包过滤机制实际上是针对数据包的布尔值操作函数,如果函数最终返回true,则通过过滤,反之则被丢弃。形式上包过滤由一个或多个谓词判断的并操作(AND)和或操作(OR)构成,每一个谓词判断基本上对应了数据包的协议类型或某个特定值,例如:只需要 TCP 类型且端口为110的数据包或ARP类型的数据包。包过滤机制在具体的实现上与数据包的协议类型并无多少关系,它只是把数据包简单的看成一个字节数组,而谓词判断会根据具体的协议映射到数组特定位置的值。如判断ARP类型数据包,只需要判断数组中第 13、14 个字节(以太头中的数据包类型)是否为0X0806。从理论研究的意思上看,包过滤机制是一个数学问题,或者说是一个算法问题,其中心任务是如何使用最少的判断操作、最少的时间完成过滤处理,提高过滤效率。

下面给出一个简单的测试程序来实现只接收某IP传送过来的数据包。

运行程序:设置只接收来自10.48.43.32的数据包

这时候没有数据过来。通过在另一个终端ping 10.48.43.32

这时候可接到相应的数据包,下面的数字是代表接收数据包的个数。

如果,我停掉ping 10.48.43.32,而改成ping 10.48.43.33,这时就不会接收到数据包。

在这里我们可以通过相应的参数,选择过滤不同的端口,不同的服务等,从而实现相应的功能。

下面是一些关于libcap的资源。

http://www.tcpdump.org/pcap.htm

http://blog.csdn.net/bat603/archive/2006/09/04/1175729.aspx

http://www.tcpdump.org/related.html

http://yuba.stanford.edu/~casado/pcap/section4.html

http://blog.csdn.net/bat603/archive/2006/09/04/1176251.aspx

http://www.tcpdump.org/

http://www.tcpdump.org/pcap3_man.html

http://www.programming-pcap.aldabaknocking.com/codesamples.html

原创粉丝点击