摘 要:系统阐述了linux环境下网络监听和数据包分析技术的实施方法和步骤,并针对libpacp库进行了详细的分析和难点解析。
关键词:网络监听;包过滤;linux;libpacp
引言
网络监听与数据包分析技术是网络入侵检测系统(IDS)的核心技术,也是网络安全协议研究的核心技术.监听技术最初是提供给系统管理员用的,主要是对网络的状态、信息流动和信息内容等进行监视,如sinffer,ethreal等linux环境下的监听和协议分析软件. 在PPDR模型以及几乎所有的IDS(入侵检测系统)中,最基本的要求就是能够实现网络监听与数据包分许,所有的部分(安全策略、防护、检测、响应)都建立在此基础上.
1 网络监听与数据包分析方法的关键技术
1.1简单的监听程序模型
最简单的网络监听程序可以分为核心程序和外壳程序,所谓核心程序就是通过一些网络数据包捕获机制从网络上高效捕获网络数据包,并实现数据包的过滤功能。外壳部分负责界面、数据转化与处理、格式化、协议分析,如果在内核没有过滤数据包,在这里还要对数据进行过滤,一个简单的模型如图1所示:
一个较为完整的基于网络监听和过滤的程序一般包括以下步骤:数据包捕获、数据包过滤与分解、数据分析.
1.2数据包捕获
数据包捕获常用的有两种方法:
(1)通过设置硬路由器的监听端口;
(2)利用以太网络的广播特性.这种方式必须将网卡设置为混杂(promiscuous)模式.监听程序工作在网络环境的底三层,采用被动的方式拦截所有经过该机器的网络上传送的数据包,然后将这些数据做相应处理,可以实时分析这些数据的内容,进而分析网络当前状态和整体布局. 在LINUX下比较广泛的方法是libpacp函数包的形式,TCDUMP就是一个典型的实例。Libpacp是一个与实现无关的访问操作系统所提供的分组捕获机制的分组捕获函数库,用于访问数据链路层。其捕获机制就是BPF机制。这个库为不同的平台提供了一致的编成接口,在安装了libpacp的平台上,以libpacp为接口写的程序、应用、能够自由的跨平台使用。
1.3数据包过滤和分析
捕获数据包后要进行的工作是对其进行包过滤与归类,用通俗的语言表达就是在海量的数据包里面找出我们感兴趣的内容。一些基础的过滤规则如下:
(1)站过滤:专门筛选出来自一台主机或者服务器的数据;
(2)协议过滤:根据不同的协议来筛选数据,例如:选择TCP数据而非UDP数据;
(3)服务过滤:根据端口号来选择特定数据包;
(4)通用过滤:通过数据包中某一特定位置开始,选择具有某些共同数据特征的数据包;
大部分情况下,过滤规则是上面基本规则的组合。有时,为了保证我们设置的缓冲区被一些莫名其妙的无效数据溢出,我们必须在捕获前进行粗过滤,然后在捕获后再进行一次过滤,然后进行分析.过滤完成后,为了使得我们的缓冲区能处理的包更多,我们必须进行包分解(Slice),因为数据包最关键的部分在数据包的头部.即使要分析整个包,包分解的过程还是要的,不过我们得记住包的原始长度.包分解的原则是对捕获的包按照相应协议规定的数据结构来提取结构中每个字段的数据,BPF机制在这方便做得非常成功。
1.4数据分析
这一部分就是对已经捕获的数据包进行各种分析,比如网络流量分析,数据包中信息分析,敏感信息提取分析等,其功能取决于系统要达到的目的.
2 基于libpcap的网络监听与过滤
2.1 libpcap简介
网络数据包捕获开发包libpcap是一个著名的、专门用来捕获网络数据的编成接口。它在很多网络安全领域得到了广泛的应用,很多著名的网络安全系统都是基于libpcap而开发的,如网络数据包捕获分析工具tcpdump,网络入侵检测系统snort,网络协议分析工具ethreal等。Libpcap几乎成了网络数据包捕获的标准接口,它的效率很高,使用又极其方便,而且它是一个跨平台的网络编成接口。它使用了BPF数据包捕获机制,具有快速的网络数据包过滤功能。
2.2 BPF捕获机制
伯克利数据包过滤器(BPF,Berkeley Packer Filter)是Libpcap使用的捕获机制,它是一个高效的数据包捕获机制。
BPF的架构如图2所示:
图2 BPF架构
BPF主要由两部分组成,一是网络转发部分,二是数据包过滤部分。网络转发部分从链路层中捕获数据包,并把它们转发给数据包过滤部分;数据包过滤部分从接收到的数据包中接收过滤规则决定的网络数据包,其他的数据包就被丢弃。
BPF这两部分都是在操作系统内核层实现的,它提供给应用层的数据包是过滤后的数据包,所以捕获数据包和过滤数据包都是在内核中完成的,效率非常的高。另外,BPF使用了缓存机制,使捕获数据包缓存在内核中达到一定量时就传递给应用程序,这样也提高了处理的效率。
2.3libpcap主要函数介绍
pcap_t *pcap_open_live(char *device,int snaplen,int promisc,int to_ms,Char *ebuf)
获得用于捕获网络数据包的数据包捕获描述字。device参数为指定打开的网络设备名。snaplen参数定义捕获数据的最大字节数。prormsic指定是否将网络接口置于混杂模式。to_ms参数指定超时时间(毫秒)。ebuf参数则仅在pcap_openjlve()函数出错返回NULL时用于传递错误消息。
pcap_t *pcap_open_offline(char *fname,char *ebuf) 打开以前保存捕获数据包的文件,用于读取。fname参数指定打开的文件名。该文件中的数据格式与tcpdump(Llnux一个有名的数据包捕获程序)兼容。“一”为标准输入。ebuf参数则仅在pcap_open offiine()函数出错返回NULL时用于传递错误消息。
pcap_dumper_t *pcap_dump_open(pcap_t *p,char *fname)
打开用于保存捕获数据包的文件,用于写入。fname参数为“一”时表示标准输出。出错时返回NULL。p参数为调用pcap_open_offiine()或pcap_open_live()函数后返回的pcap结构指针。fname参数指定打开的文件名。如果返回NULL,则可调用pcap_geterr()函数获取错误消息。
char*pcap_lookupdev(char *errbuf)
用于返回可被pcap_open_1ive()或pcaplookupnet()函数调用的网络设备名指针。如果函
数出错,则返回NULL,同时errbuf中存放相关的错误消息。
int pcap_lookupnet(char *device,bpf_u_int32 *netp,bpf_int32 *maskp,char *errbuf)
获得指定网络设备的网络号和掩码。necp参数和maskp参数都是bpf_
int32指针。如果
函数出错,则返回一l,同时errbuf中存放相关的错误消息。
Int pcap_loop(pcap_t *p,int cnt,pcap_handler callback,u_char *user)
功能基本上与pcap_dispatch()函数相同,只不过此函数在cnt个数据包被处理或出现错误时才返回,但读取超时不会返回。而如果为pcap_open_live()函数指定了一个非零值的超时设置,然后调用pcap_dispatch()函数,则当超时发生时pcap_dispatch()函数会返回。Cnt参数为负值时pcap_loop()函数将始终循环运行,除非出现错误。
Int pcap_complile(pcap_t *p,struct bpf_program *fp,char *str,int optimize,bpf_u_int32 netmask)
将str参数指定的字符串编译到过滤程序中。Fp是一个bpf_program结构的指针,在pcap_compile()函数中被赋值。Optimize参数控制结果代码的优化。Netmask参数指定本地网络的网络掩码。
Int pcap_setfilter(pcap_t *p,struct bpf_program *fp)
指定一个过滤程序。Fp参数是bpf_program结构指针,通常取自pcap_compile()函数调用出错时返回-1;成功时返回0。
Viod pcap_close(pcap_t *p)
关闭p参数相应的文件,并释放资源。
2.4libpcap的基本工作流程
第一步: 使用pcap_lookupdev获取设备;
第二步: 使用pcap_lookupnet获取网络地址和子网掩码;
第三步: 使用pcap_open_live打开设备;
第四步: 使用pcap_complile编译过滤规则;
第五步: 使用pcap_setfilter设置过滤规则;
3 总结
Libpcap函数库的使用简化了我们的工作,使得我们在网络监听与包过滤技术的研究主要集中在过滤规则的设置和对数据包的分析上,为我们的研究提供了很大的方便. 另外,在网络协议分析攻击的真正实现和IDS实现上, Libpcap库函数提供了巨大的帮助,使得我们可以把主要的精力放在原理方案设计上,而不需要关注底层的细节。不过libpcap也存在着一些自身难以克服的缺陷,比如在高速(Gb/s)网络环境下出现抓包率低,数据包损失严重等现象。另外,随着IPV6的不断推广和使用,IPv6环境下的网络监听技术也逐渐成为网络安全研究的一个热门话题。在项目制作的工作中我们将不断地去努力研究,尽量使项目的结果能够适应网络将来的发展方向。
参考文献
http://www.xfocus.net