免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1302 | 回复: 0
打印 上一主题 下一主题

Linux下Libpcap源码分析和包过虑机制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-27 02:16 |只看该作者 |倒序浏览
相关软件链接:
Libpcap v0.9.4

libpcap是Unix/Linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础.Libpcap可以在绝大多数类Unix平台下工作,本文分析了libpcap在Linux下的源代码实现,其中重点是Linux的底层包捕获机制和过滤器设置方式,同时也较浅的探讨libpcap使用的包过滤机制.


网络监控

绝大多数现代操作系统都提供了对底层数据包捕获机制,在捕获机制之上可以建立网络监控(Network Monitoring)应用软件.网络监控也常简称为Sniffer,其最初的目的在于对网络通信情况进行监控,以对网络的一些异常情况进行调试处理.但随着互联网的快速普及和网络攻击行为的频繁出现,保护网络的运行安全也成为监控软件的另一重要目的.例如, 网络监控在路由器,防火墙,入侵检查等方面使用也很广泛.它也是一种比较有效的黑客手段,例于,美国政府安全部门的"肉食动物"计划.

包捕获机制

从广义的角度上看,一个包捕获机制包含了三个主要部分:(1)最底层是针对特定的操作系统的包捕获机制.(2)最高层是针对用户的程式接口.(3)包过滤机制.

对不同的操作系统实现的底层包捕获机制可能是不一样的,但从形式上看大同小异.数据包常规的传输路径依次为:网卡 => 设备驱动层 => 数据链路层 => IP层 => 传输层 => 最后到达应用程式. 而包捕获机制是在数据链路层增加一个旁路处理,对发送和接收到的数据包做过滤/缓冲等相关处理,最后直接传递到应用程式.注意:包捕获机制并不影响操作系统对数据包的网络栈处理。对用户而言,包捕获机制提供了一个统一的接口,使用户程式只需要简单的调用若干函数就能获得所期望的数据包.这样一来,针对特定操作系统的捕获机制对用户透明,使用户程式有比较好的可移植性.包过滤机制是对所捕获到的数据包根据用户的要求进行筛选,最终只把满足过滤条件的数据包传递给用户程式.

Libpcap应用程式框架

Libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程式的可移植性.Libpcap可以从最上面的链接直接下载.然后执行类Unix系统最常用的以三条命令即可安装,但如果希望libpcap能在Linux正常工作,则必须使内核支持"packet"协议,也即在编译内核时打开配置选项 CONFIG_PACKET(选项缺省为打开).
   
[princezhou@zan]$ ./config
[princezhou@zan]$ make
[princezhou@zan]$ make install

Libpcap源代码由20多个C文件构成,但在Linux系统下并不是所有文件都能用到.可以查看命令make输出了解实际用的文件.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);

检查网络设备

libpcap程式的第一步通常是在系统中找到合适的网络接口设备.网络接口在linux网络体系中是一个很重要的概念,它是对具体网络硬件设备的一个抽象,在它的下面是具体的网卡驱程式,在其上则是网络协议层.Linux中最常见的接口设备名是eth0和L0.L0称为回路设备,是一种逻辑意义上的设备,其主要目的是为了调试网络程式之间的通讯功能.eht0对应了实际的物理网卡,在真实网络环境下,数据包的发送和接收都要通过eht0.如果计算机有多个网卡,则还可以有更多的网络接口,如eht1,eht2等等.调用命令ifconfig可以列出当前所有活跃的接口及相关的信息,在对eth0的描述中既有物理网卡的MAC地址,也有网络协议的IP地址.查看/proc/net/dev也可获得接口信息.

Libpcap中检查网络设备中主要使用到的函数关系如下图:





libpcap调用pcap_lookupdev()函数获得可用网络接口设备名.首先利用函数getifaddrs()获得所用的网络接口的地址,以及对应的网络掩码,广播地址,目标地址等相关信息,再利用add_addr_to_iflist(),add_or_find_if(),get_instance()把网络接口的信息增加到结构链表pcap_if中,最后从链表中提取第一个接口作为捕获设备.其中get_instanced()的功能是从设备开始的,找第一个是数字的字符,做为接口的实例号.网络接口的设备号越小,则排在链表的越前面,因此,通常函数最后返回的设备名为eth0.虽然libpc

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16925/showart_105333.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP