libpcap小议

4 Libpacp 过滤

libpcap unix/ 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

你可能感兴趣的:(数据结构,linux,工作,网络,unix,平台)