libpcap小议
来源:互联网 发布:淘宝助理下载地址 编辑:程序博客网 时间:2024/05/22 14:57
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
- libpcap小议
- libpcap
- libpcap
- LIBPCAP
- libpcap
- libpcap
- libpcap
- Libpcap
- libpcap
- libpcap
- libpcap
- libpcap
- libpcap
- libpcap应用
- Libpcap函数库
- winpcap & libpcap
- libpcap编译
- libpcap原理
- 妈妈的生日
- 1022 Poor contestant Prob
- 模型驱动架构
- globalfifo linux
- 2010-7-16
- libpcap小议
- 利用Java+POI 读写Excel文档&向Excel中插入图片
- 51单片机c嵌汇编教程
- C++程序性能2
- mantis系统由windows移植到Linux平台
- 今日小记
- ListView的使用方法
- 行列转换(列转行)
- TabNavigator自定义Tab