admin 管理员组

文章数量: 887021


2024年2月29日发(作者:微信小程序开发使用什么语言)

龙源期刊网

基于WinPcap的旁路IP阻断方法研究与实现

作者:陈小文 胡文飞 和应民

来源:《中国新技术新产品》2009年第01期

摘要:在审计系统中,需要阻止一些非法主机和子网的连接。基于WinPcap的网络开发包,捕获流经网卡的数据包,解析以太网数据包,并对那些非法主机进行阻断。利用hash表实现快速插入和查询功能,提高了数据包的处理速度和效率,在实际中得到很好的应用。

关键词:非法阻断;包捕获;哈希表;ARP欺骗

引言

随着Internet的迅猛发展,网络安全的形势更加严峻,迫切需要行之有效的网络安全保障系统。在网络安全审计系统中需要对那些产生危害的主机进行隔离,断开其和子网的连接。本文论述了在Win32环境中利用WinPcap捕获流经网卡的数据包,对那些非法主机采用ARP欺骗实施有效阻断。

1 用WinPcap捕获数据包

1.1 WinPcap简介

WinPcap是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows操作平台上来实现对底层包的截取过滤。采用WinPcap进行开发与使用Winsock相比,WinPcap具有很多优点。WinPcap是独立于网络协议的,可以分析处理所有网络设备接收的数据。此外WinPcap的标准抓包接口与libpcap兼容,使系统便于向UNIX平台移植。而且WinPcap具有发送ARP数据包的能力。

WinPcap的体系结构如图1所示。第1个模块NPF(netgroup packet filter)是一个虚拟设备驱动程序文件,它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块。第2个模

龙源期刊网

块为win32平台提供了一个公共的接口,不同版本的Windows系统都有自己的内核模块和用户层模块。用于解决这些不同,调用的程。

序可以运行在不同版本的Windows平台上,而无需重新编译。第3个模块是不依赖于操作系统的,它提供了更加高层、抽象的函数。WinPcap提供了一套标准的抓包接口,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。

1.2基于WinPcap的抓包流程

在 Windows平台下使用WinPcap很容易开发出基于原始数据包的各种网络应用软件。一般情况下,我们都用提供的函数,因为它的功能更强,使用也更方便。

(1)开启指定网卡。WinPcap提供了pcap_findalldevs()这个函数来获取当前机器上所配置网络接口的内容,接口的全部信息都保存在pcap_if结构的链表中,链表的每项内容含有全面的网卡信息。pcap_open_live()是专门用于打开指定网卡设备的,第3个参数如果设置为1,则代表将网卡设置为混杂模式,同时该函数如果调用成功,则返回指定网卡的操作句柄。

(2)设置过滤规则。用户可以根据需要设置相应的过滤条件,例如只接收UDP或TCP数据包,实现过滤规则的设置关键是对pcap_compile()和pcap_setfilter()两个函数进行正确的配置。

(3)捕获网络数据包。WinPcap提供了几种捕包函数以适应不同的情况,例如pcap_dispatch()每捕获一个数据包就调用一次callback函数。callback它是一个带有三个参数的回调函数。Pcap_loop()功能基本与pcap_dispatch()函数相同,只不过该函数在cnt个数据包被处理或出现错误时才返回,但读取超时不会返回,它在没有数据流到达时将阻塞。在回调函数中就可以对所捕获的数据包进行解析。

1.3数据包的解析

利用WinPcap库捕获的数据帧其实是经过传输层、网络层和数据链路层的封装而生成的太网数据帧,因此可以对数据帧作进一步解析,该过程在回调函数中完成。

以太网数据帧由报头和数据区组成,在以太网帧的报头中包含目地址端及源地址,通常抓到的数据包已经去掉了同步码和桢分界符。在具体编程实现中,可以定义以太网数据帧数据结构描述。

根据类型字段type可以判断是那种数据包。常用的有:0x0800表示IP数据包,0x0806表示ARP数据包。通过对回调函数的第三个参数类型转换后,可以获得源/目的MAC地址。简要代码如下:

龙源期刊网

ETHHDR *dlcheader;

dlcheader=(ETHHDR *)pkt_data;

memcpy(srcmac,(char*)&(dlcheader->src[0]),6);

memcpy(destmac,(char*)&(dlcheader->dst[0]),6);

同样根据IP数据包结构可以构造IP数据结构描述structIPHEADER,可以查阅相关资料。由此可以从中解析出源/目的IP、包长度、协议类型等信息。

IPHEADER *ipheader;

ipheader=(IpHeader *)(pkt_data+14);

ip_len=(ipheader->h_len & 0x0f)*4;

memcpy(srcip,(char*)&(ipheader->sourceIP[0]),4);

memcpy(destip,(char*)&(ipheader->destIP[0]),4);

如果需要获得更多详细信息,如发送数据包的源/目的端口,可以构造出UDP包的数据结构,不再赘述。至此,整个数据包的信息我们都能获得了,为下一步的分析处理奠定了基础。

2 快速判断处理解析的IP地址

网卡在不断地捕获数据包,根据数据流量的不同,有时可能产生大量数据,这需要我们及时进行处理。对一个捕获的数据包解析出有效信息后,就要迅速判断是不是合法主机发送的数据包,这个过程需要和在黑白名单里设置的合法主机IP进行比较,本实验采用了hash算法来实现这一过程。

Hash查找法在实践中被证实是最快的一种查找方法,它的时间复杂度为O(1),即几乎只要比较一次就可确定比较结果。哈希算法采用了对ip各字段平方后求和,然后和地址长度取模的运算,把子网内所有ip散列到整个地址范围。

在插入算法中,可能会对于不同的关键字,产生的地址冲突情况。程序采用了链地址法解决一旦发生的冲突。

龙源期刊网

3 发ARP包阻断非法主机

通过hash查找算法,判断为非法主机的要给予屏蔽。本实验采用截获网关数据的方式实现,它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。要防止这种情况的发生,需要在路由器端设置静态ARP表,对ARP表的更改只有网络管理员有这个权限,能很好达到目的。

完整的ARP报文结构由以太网头部和ARP请求/应答包组成,需要定义28字节的ARP包结构,然后将构造好的以太数据帧头与ARP数据包连在一起,成为ARP报文。在报文结构定义好后,就可以定义一个报文并把前面解析的数据按需求填入,修改数据项如下。

=ARP广播包地址

=虚假的源MAC地址

=ARP包类型

_hrd=以太网硬件类型

_pro=IP包

_op= ARP 请求类型

_sha=构造的虚假MAC地址

_spa=捕获包里非法主机的IP

_tha=ARP广播包的目的地址

_tpa=网关地址

ARP包封装好后,这就可以调用WinPcap提供的函数pcap_sendpacket()进行发包了。

4 软件设计

龙源期刊网

本实验工具使用Visual C++6.0编程平台,安装好WinPcap4.0.1驱动开发包,程序在本地机器或服

务器上运行后,设置网卡为混杂模式,抓取流经网卡的所有数据包,解析网络包并和hash表里的已读取得合法IP判断,若存在则抛弃;否则,发虚假ARP广播包进行阻断。实验结果如图2所示。

5 结束语

数据包捕获技术是网络管理系统的关键技术,WinPcap是在Win32平台进行网络捕包一个成功的选择。通过对局域网中的数据包进行捕获和分析,可以实时地、动态地对局域网内的所有主机进行监控和管理。在深入探讨WinPcap体系结构的基础上,利用ARP欺骗的原理,设计了对非法主机的阻断。结果表明程序能够很好地实现该功能。

参考文献

[1]李承,王伟钊,程立,等.基于防火墙日志的网络安全审计系统研究与实现[J].计算机工程,

2002, 28(6): 17-19.

[2]胡晓元,史浩山.winpcap包截获系统的分析及其应用[J].计算机工程,2005,31(2):96-98.

[3]循序渐进学习使用WinPcap.中国协议分析网./,2005.

[4]严蔚敏,吴伟民,数据结构.北京:清华大学出版社,2004.

[5]陈辉,陶洋.基于WinPcap实现对ARP欺编的检测和恢复[J].计算机应用,2004,24(10):67-68.

[6]丁展, 刘海英. Visual C++ 网络通信编程实用安例精选[M]. 北京: 人民邮电大学出版社,2004.


本文标签: 数据包 数据 进行 地址 网卡