(一)libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。libpcap的捕获机制不影响linux系统中网络协议栈对数据包的处理(协议栈只处理发给本机的数据包)。
(二)访问数据链路层的三个常用方法(libpcap都支持):
(1)BSD的分组过滤器BPF。优点:
*BPF的过滤是在内核中进行的,从而把BPF到应用进程的数据复制量减少到最小。
*由BPF传递到应用进程只是每个分组的一段定长部分,这个长度称为捕获长度(又称快照长度snapshot length).
*BPF为每个应用进程分别缓冲数据,只有当缓冲区已满或读超时期满时该缓冲区的数据才复制到应用进程中。
(2)SVR4的数据链路提供者接口DLPI。
(3)Linux的SOCK_PACKET和PF_PACKET。
(一)libpcap主要由三部份组成:网络分接头(Network Tap)、数据过滤器(Packet Filter)和用户API。
(1)网络分接口(注意只是复制):A network tap is a hardware device which provides a way to access the data flowing across a computer network.
*当需要对网络中的流量进行监控,例如用户上网行为分析、异常流量监测、网络应用监控等,就需要收集网络流量,这里说收集可能不太准确,实际上就是copy一份当前网络流量发送给监控设备,网络分接口做这个的。
*网络分接口是一种链路层旁路机制,负责采集网卡数据包。
(2)数据过滤器:针对数据包的一种过滤机制,在libpcap中采用BPF算法对数据包进行过滤(在内核中进行)。相关函数:pcap_compile和pcap_setfilter。
(3)用户API:是libpcap面向上层应用程序提供的编程接口,用户通过调用相关函数实现数据包的捕获或者发送。
(二)详细(将网卡置于混杂模式):
(1)利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。
(2)BPF算法的基本思想:在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的那些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。
(3)libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。
(4)在有BPF过滤器监听网卡的情况下, 网卡得到一个数据包后, 会首先复制一份数据给BPF过滤器, 过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的哪些内容; 然后将过滤后的数据提交给Libpcap
进行处理; 最后链路层驱动将重新获得控制权, 判断该数据包是否是发给本机的。如果是, 则驱动程序会再将它提交给系统的协议栈; 否则网卡驱动程序从中断返回, 继续接收数据。
三 libpcap的抓包框架
(一)主要函数:
(1)pcap_lookupdev()函数用于查找网络设备,返回可被pcap_open_live()函数调用的网络设备名指针。(2)pcap_open_live()函数用于打开网络设备,并且返回用于捕获网络数据包的数据包捕获描述字。对于此网络设备的操作都要基于此网络设备描述字。
(3)pcap_lookupnet()函数获得指定网络设备的网络号和掩码。
(4)pcap_compile()函数用于将用户制定的过滤策略编译到过滤程序中。过滤规则详见man pcap-filter。
1.格式:int pcap_complile(pcap_t *p,struct bpf_program *fp,const char *str,int optimize,bpf_u_int32 netmask)
2.fp存放编译后的程序,接下来被pacp_setfilter使用。
3.str是过滤表达式,语法详见 pcap-filter。(小写)
*src host 10.3.8.250:只捕获源地址是10.3.8.250的包。
*dest host 10.3.8.250:目的地址。
*host 10.3.8.250:目的地址或源地址。
*src port 88:只捕获源端口是88的包。
*tcp port 99
*udp portrange 10-100
*not tcp
*not udp
*tcp
*udp
(5)pcap_setfilter()函数用于设置过滤器。
(6)过滤程序通常来自pcap_compile()函数。
(7)pcap_loop()函数pcap_dispatch()函数用于捕获数据包,捕获后还可以进行处理,此外pcap_next()和*pcap_next_ex()两个函数也可以用来捕获数据包。(8)pcap_close()函数用于关闭网络设备,释放资源。
四 分析软件的部署:待续.