基于DPDK技术的高效数据包捕获技术分析与应用研究
2020-03-06熊卫刚
熊卫刚
(南京高达软件有限公司,江苏 南京 210012)
0 引 言
对于网络安全测试而言,网络数据包抓取成为一个重要的信息监测手段,其在数据库防护设计、信息审计系统防护以及病毒入侵防护等方面有着重要而又广泛的应用[1,2]。由于数据流量趋近海量化,因此高效的抓取技术对于防护性能的提升有着重要支持,然而当前抓包技术效率低下的问题限制了其防护性能的提升[3]。对于一个有效的抓包技术而言,其需要在极短的时间内实现对异常数据包的获取,并对其进行严格检测,从而实现对数据的过滤处理。随着网络带宽的提升,网络数据在单位时间内呈现高流量化,这样给抓包技术带来了更多的挑战。为了解决这些问题,一些学者分别从硬件支持和软件支持两个角度进行考虑。硬件抓包技术需要专业化定制设计,缺乏灵活性和适用性,但是具有极高的抓包效率。软件抓包技术降低了对硬件的需求,具有更高的灵活度,但效率有待提升。鉴于此本文结合当前流行的DPDK机制,深入分析其原理上,最终设计出一套完整的高效抓包系统,为当前的网络信息安全防护提供支持[4]。
1 传统数据包抓取技术
1.1 BPF数据包抓取技术
BPF数据抓包技术即伯克利封包过滤器技术,其作为一类典型的数据抓取技术,在Linux和Unix系统数据链路上提供了数据结构,并实现了数据的封装、数据包的收发和过滤等功能[5]。这种抓包技术基于BSD操作系统进行设计,实现数据包的有效过滤。从其运行机理来看,目前实现这一技术基本要素包括两个方面,一是网络数据包过滤,二是网络数据包的转发。网络数据包的转发主要是对数据包进行捕获,然后将其转发到数据过滤处。网络数据包过滤则是根据设计的网络数据包处理规则对收据进行接收或者丢弃。从当前的运行机制可知,其将数据过滤后再转发到应用层,这样有助于降低系统开销,以提升数据处理效率。由于数据的抓取和过滤环节都在Linux内核中进行,因此会随着系统的改变而做出相应的改变,从而导致其性能不够稳定,缺乏有效的普适性。
1.2 libpcap数据包抓取技术
libpcap数据包抓取技术作为另一类抓包技术,其在C语言运行库上实现,并依托Unix或Linux系统平台来实现网络数据包的抓取,能够在很多Unix平台上实现良好的抓包性能[6,7]。此外,该技术有着很好的程序扩展能力,能够根据C语言编写的函数库进行功能调整,具有良好的函数接口。从其运行机理上分析可知,其主要工作要素包括以下4点。首先本地网络设置为混合工作状态,以此来获取所有经过该节点的数据包,其次抓取复制流经的网络数据包,并对其进行一定的处理,从而保证网络系统正常运转,再次经过BPF数据过滤来降低系统开销,提升整体处理性能,最后将上述过滤后的数据包传入系统内核缓存,用户终端通过应用层程序进行提取和处理。这种工作机制在数据包复制上占用大量的CPU时间,导致整体数据分析能力和效率降低。
1.3 PF_RING数据包抓取技术
该抓包技术作为重要的数据包抓取技术,立足于提升内核提升数据包抓取效率,并为应用程序提供有效的接口函数库,实现了数据包抓取技术功能丰富化和高扩展性[8]。该项技术深入考虑了Linux系统特点,为其提供一种新的具备缓存功能的协议簇,并通过DMA内存直接访问机制和NAPI直接中断模式降低了CPU处理时间,从而提升了数据包的捕获效率。此外终端用户可以通过相应的应用层程序依托mmap技术实现对Linux系统内核数据包的访问,降低了对数据包的复制次数,从而有效提升了数据包的后续处理性能。该项技术可在系统内核中独立存在,并且能够实现加载和释放模块的动态功能,由此可以提升即插即用的能力。主要运行机理要素可总结如下。一是对Linux系统内核提供环状缓存socket及其接口,二是通过网卡将流经数据复制至该缓存中,并释放原数据,三是通过应用程序和socket结构对接,并通过应用程序依托mmap技术实现对上述缓存数据的访问。这种技术有助于提升适用性,并能够降低数据复制次数,从而提升数据包处理效率,但由于数据抓取过程和预处理过程仍然位于内核之中,因此会提升内核负担,并在反复数据交换中消耗性能。
2 DPDK技术及其实现
2.1 DPDK技术原理
鉴于上述3类技术存在的巨大缺陷,如何以低系统开销实现数据包抓取性能的提升成为当前研究的主要热点问题,对此DPDK技术通过低开销run-tocompletion模式的运行环境,实现最好的数据包抓取性能[9,10]。DPDK技术是因特尔公司开发的一种数据包转发套件,由于不具备网络协议栈,因此不能提供二三层转发功能。尽管其不具备防火墙ACL操作,但是可以通过间接技术实现该功能。此外其作为软件套件,具备很强大的可视化界面效果和用户友好的驱动程序,从而实现了数据层和应用层的完美对接。根据当前应用可知,DPDK技术主要具备以下4类技术点。一是Huge TLB page,该技术点主要用于提升内存管理效率,从而实现资源利用率的提升。二是UIO,该技术点可以驱动分块,并将启动部分放置在内核中,系统功能块放置在应用层从而能够避免内核更新后对应用程序的支持影响,提升整体技术的可移植性。三是CPU Affinity,该技术点的主要作用在于能够将不同数据面的线程操作约束到CPU内核中,从而防止持续调度中的性能降低。四是zero copy,该技术点主要考虑到数据包从网卡到用户端复制带来的空间消耗问题,将数据包从设备段直接转入内核之中,用户通过需求来直接访问数据以实现数据的处理,这有助于降低数据包的复制次数,并对降低CPU负载有着促进作用,从而优化CPU资源利用率。
DPDK技术将驱动处理事件交由用户处理,并能够根据系统结构变化而做出优化调整,同时丰富的API函数为应用程序注入提供了丰富的接口,从而提升了整体用户操作性能。典型的DPDK数据结构框架如图1所示。
图1 DPDK数据结构框架
2.2 DPDK技术实现
DPDK技术基于X86平台设计,具备快速处理报文库和驱动套件的能力,能在Linux用户空间良好运行,但当前仅支持因特尔网卡[11]。对此本文结合DPDK-1.7.0版本开展技术实现操作。
抓包开始前,需要通过DPDK sdk程序中的DPDK端口查看和绑定工具pci_unbind,确定抓包端口,并在此基础上申请huge页进行分区挂载。数据包捕获时,需要通过rte_eal_init()、init_port()以及init_mbuf_pools()等进行参数、端口以及内存缓冲的初始化操作,并通过do_packet_forwarding_bypass()函数进行端口侦听,以检测流经数据包,然后通过用户处理函数对流经的数据包继续做相应处理。对此可设置对应的状态号或物理性的端口有效处理抓包过程,具体流程如图2所示。
图2 DPDK数据抓取获流程
主要流程可以分为如下几个环节。首先初始化DPDK参数、EAL环境、mbuf和pool队列、端口配置以及状态,其次接收来自于流经端口的数据包,并通过循环侦听的方式循环抓取,最后通过用户自定义函数process_packets()预处理每个数据包,并分析其涵盖的协议类型和端口,进行数据分发。
通过上述基本流程实现数据包的物理层、链路层以及网络层信息的解析,并获取其对应的源IP地址、目标IP地址、源端口号、目标端口号以及对应的协议信息等,实现数据解析效率提升。在进行数据分发时,进行五元组哈希分组,由此增加数据包处理能力,提升整体效率。
3 结 论
网络时代的发展,数据信息安全成为亟待解决的问题,对此数据抓取成为关键技术。然而传统技术在设计上存在诸多缺陷,无法有效提升抓包效率,因此本文考虑了DPDK低的系统开销特点,深入探讨了其对应的技术原理要点,并实现了该技术在数据包抓取中的应用,为当前开展数据包抓取研究工作的相关人士提供技术参考。