Linux下Libpcap源码分析和包过滤机制 (1)_libpcap在启动抓包后修改过滤条件?-程序员宅基地

技术标签: struct  网络  linux  网络协议  工作  数据结构  网络基础知识  

当设备找到后,下一步工作就是打开设备以准备捕获数据包。Libpcap的包捕获是建立在具体的操作系统所提供的捕获机制上,而Linux系统随着版本的不同,所支持的捕获机制也有所不同。
libpcap是unix/Linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。libpcap可以在绝大多数类unix平台下工作,本文分析了libpcapLinux 下的源代码实现,其中重点是Linux的底层包捕获机制和过滤器设置方式,同时也简要的讨论了 libpcap使用的包过滤机制 BPF。

网络监控

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

包捕获机制

从广义的角度上看,一个包捕获机制包含三个主要部分:最底层是针对特定操作系统的包捕获机制,最高层是针对用户程序的接口,第三部分是包过滤机制。

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

libpcap应用程序框架

libpcap提供了系统独立的用户级别网络数据包捕获接口,并充分考虑到应用程序的可移植性。libpcap可以在绝大多数类unix平台下工作,参考资料 A 中是对基于 libpcap 的网络应用程序的一个详细列表。在windows平台下,一个与libpcap 很类似的函数包 winpcap 提供捕获功能,其官方网站是http://winpcap.polito.it/。

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


./configure
./make
./make install


libpcap源代码由20多个C文件构成,但在Linux系统下并不是所有文件都用到。可以通过查看命令make的输出了解实际所用的文件。本文所针对的libpcap版本号为0.8.3,网络类型为常规以太网。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和lo。Lo 称为回路设备,是一种逻辑意义上的设备,其主要目的是为了调试网络程序之间的通讯功能。eth0对应了实际的物理网卡,在真实网络环境下,数据包的发送和接收都要通过 eht0。如果计算机有多个网卡,则还可以有更多的网络接口,如eth1,eth2 等等。调用命令ifconfig可以列出当前所有活跃的接口及相关信息,注意对eth0的描述中既有物理网卡的MAC地址,也有网络协议的IP地址。查看文件/proc/net/dev也可获得接口信息。

 
libpcap调用pcap_lookupdev()函数获得可用网络接口的设备名。首先利用函数 getifaddrs() 获得所有网络接口的地址,以及对应的网络掩码、广播地址、目标地址等相关信息,再利用 add_addr_to_iflist()、add_or_find_if()、get_instance() 把网络接口的信息增加到结构链表 pcap_if 中,最后从链表中提取第一个接口作为捕获设备。其中 get_instanced()的功能是从设备名开始,找第一个是数字的字符,做为接口的实例号。网络接口的设备号越小,则排在链表的越前面,因此,通常函数最后返回的设备名为 eth0。虽然 libpcap 可以工作在回路接口上,但显然libpcap 开发者认为捕获本机进程之间的数据包没有多大意义。在检查网络设备操作中,主要用到的数据结构和代码如下:


	/* libpcap 自定义的接口信息链表 [pcap.h] */
struct pcap_if 
{
struct pcap_if *next; 
char *name; /* 接口设备名 */
char *description; /* 接口描述 */
		
/*接口的 IP 地址, 地址掩码, 广播地址,目的地址 */
struct pcap_addr addresses; 
bpf_u_int32 flags;	/* 接口的参数 */
};

char * pcap_lookupdev(register char * errbuf)
{
	pcap_if_t *alldevs;
	……
		pcap_findalldevs(&alldevs, errbuf);
		……
		strlcpy(device, alldevs->name, sizeof(device));
	}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jasenwan88/article/details/7762840

智能推荐

iOS下截屏的几种方法-程序员宅基地

文章浏览阅读3.8k次。- (UIImage *) imageWithView1:(UIView *)view{ UIImage *img; UIGraphicsBeginImageContext(view.bounds.size); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; img = UIGraphicsGe

无监督图像聚类_图像无聚类检测-程序员宅基地

文章浏览阅读5.5k次。《基于卷积神经网络的大规模人脸聚类》-申小敏使用上图的CNN结构,在LFW人脸数据库上进行训练,得到一个经过预训练的CNN网络。使用预训练的CNN网络提取人脸特征,提取出的特征用于K-means聚类得出最后的聚类结果。评价指标:Rand Index聚类评价,F1-measure聚类评价。 《Learning Feature Representations with K-me..._图像无聚类检测

Unity灯光的一些设置(一)自带灯光_unity默认场景灯光-程序员宅基地

文章浏览阅读7.9k次,点赞2次,收藏11次。最近项目需要有好的灯光效果,我会依次讲解,灯光,灯光烘焙,反射探针,光照探针,屏幕渲染以及相关优化的问题。主要是用来自己学习,大牛看了勿喷。话不多说...老规矩介绍版本:unity2017.3首先来说:影响环境灯光效果的因素有很多,比如说:SkyBox,Color Space,GI等等,所以做出好的作品还是有很长的路要走的。unity有自带默认的光源:Directio..._unity默认场景灯光

prometheus grafana 统计cpu个数_promethus 统计同一cpu的机器有多少台-程序员宅基地

文章浏览阅读3.2k次。count(count(node_cpu_seconds_total{instance=~"192.168.64.137:9100", mode='system'}) by (cpu))_promethus 统计同一cpu的机器有多少台

grep 技巧 12则及注意事项_"grep \"[12]"-程序员宅基地

文章浏览阅读489次。来自http://meifz.blog.163.com/blog/static/4462885820119199295087/1. 多个关键字查找 1.1 关键字间 or_"grep \"[12]"

通过PackageInfo获取ActivityInfo都是null_packagelnfo is null-程序员宅基地

文章浏览阅读4k次。0x000x01// 获取PackageManager PackageManager pm = getPackageManager(); // 获取PackageInfo。PackageManager.GET_UNINSTALLED_PACKAGES与PackageManager.GET_ACTIVITIES好像不能同时使用,会报错。 List pkgs=pm.g_packagelnfo is null

随便推点

系统容错_系统中容错-程序员宅基地

文章浏览阅读607次。系统容错是系统可靠性设计的重要组成部分。而容错的主要手段是冗余。所谓冗余,就是多个朋友多条路,多个选择,有备无患,双保险之类的意思。冗余技术主要分为四类:结构冗余信息冗余时间冗余冗余附加技术硬件冗余软件冗余信息冗余时间冗余相关文章:架构师学习笔记17–系统的可靠性分析与设计..._系统中容错

python判断合法整数数字_C# 判断一字符串是否为合法数字(正则表达式)-程序员宅基地

文章浏览阅读1.6k次。判断一个字符串是否为合法整数(不限制长度)public static bool IsInteger(string s){string pattern = @"^\d*$";return Regex.IsMatch(s,pattern);}判断一个字符串是否为合法数字(0-32整数)public static bool IsNumber(string s){,);}判断一个字符串是否为合法数字(指定..._合法的整数数字

MRI to FDG-PET: Cross-Modal Synthesis Using 3D U-Net for Multi-modal Alzheimer’s Classification论文解读_gfdpet-程序员宅基地

文章浏览阅读690次。MRI to FDG-PET: Cross-Modal Synthesis Using 3D U-Net for Multi-modal Alzheimer’s Classification摘要方法数据集预处理网络结构实验分类实验  这篇文章发表于2018年的International Workshop on Simulation and Synthesis in Medical Imaging..._gfdpet

PHP伪协议详解-程序员宅基地

文章浏览阅读3.2w次,点赞97次,收藏491次。PHP伪协议详解php支持的伪协议1 file:// — 访问本地文件系统2 http:// — 访问 HTTP(s) 网址3 ftp:// — 访问 FTP(s) URLs4 php:// — 访问各个输入/输出流(I/O streams)5 zlib:// — 压缩流6 data:// — 数据(RFC 2397)7 glob:// — 查找匹配的文件路径模式8 phar:// — PHP 归档9 ssh2:// — Secure Shell 210 rar:// — RAR11_伪协议

交互式自适应机动目标跟踪算法-程序员宅基地

文章浏览阅读52次。例如,可以考虑引入更复杂的目标模型、改进的运动模型和外观模型,以提高跟踪的精度和鲁棒性。更新:在预测的基础上,算法需要根据实际观测到的目标位置来更新目标模型。总之,交互式自适应机动目标跟踪算法是一个有潜力的技术,可以在许多领域中发挥重要作用,如视频监控、自动驾驶和增强现实等。可以使用一些预定义的目标模型,如颜色模型或纹理模型,或者使用机器学习方法进行训练得到目标模型。交互式自适应机动目标跟踪算法基于多模型框架,可以自适应地选择和更新多个目标模型以适应目标的运动和外观变化。

STM32移植lwip之建立tcp客户端_stm32 lwip tcp/ip的开发应用教程-程序员宅基地

文章浏览阅读782次。版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/q361750389/article/details/53044119本篇目标:在之前能ping通pc机的工程基础上搭建tcp客户端,并可以主动发数据给pc机,同时也能与pc机收发数据,并在网络调试工具上显示材料准备:基础工程:修..._stm32 lwip tcp/ip的开发应用教程

推荐文章

热门文章

相关标签