王岳
(四川大学计算机学院,成都 610065)
随着互联网近些年的发展,网络已经成为现代社会重要的组成部分,据CNNIC于2017年中发布的统计结果中显示。国际出口网络流量带宽相比较年初增长了15.4%[1]。由此可见伴随着网络流量的不断增长,对于网络流量的抓取也越发困难。而网络流量的抓取作为网络分析和网络内容监控的重要组成部分被大量的网络安全分析框架所应用。
在传统的网络流量抓取和采集方面,主要分为两种方式。其中硬件方式为使用现有的网络流量采集方案譬如NetStream[2]和Netflow[3],但是该种方式需要定制的网络设备,不仅价格昂贵此外该种方案大量采用采样的方式抽取流量会导致抓取的结果不准确。另一种方式是使用现有的网络包抓取软件netmap、libpcap等,但是该种软件往往效率低下只能够承载数百兆的网络流量无法对大规模高速网络流量进行采集和处理。因此本文根据以上特点特使用PF_RING DNA网络包抓取程序,并基于该程序的基础上进行参数调优和改进,最终能够取得良好的运行效果。
PF_RING DNA作为ntop[4]组织开发的一款网络数据包抓取程序,支持BFP过滤器提供了该程序在测试时可以不用部署在真实环境下而是可以从PCAP文件中直接读取数据包。PF_RING DNA改写了Linux的内核模块提供了实现一种新socket类型,用户空间的应用程序可以与PF_RING内核模块进行通讯。可以通过在编译时选择PF_RING DNA的各种网卡模式,使得程序兼容各种型号的网卡。并且PF_RING DNA将抓取的数据包从内核模块中复制到环形缓冲区之中,用户空间的应用程序可以从用户态读取数据。一旦数据包从环形缓冲去中读取出来,环形缓冲区中用来存储数据包的空间将会分配给后续的数据包使用,新进入缓冲区中的数据包的内存索引会覆盖之前数据包的索引。
然而PF_RING DNA区存在诸多的问题,由于该程序是非开源的但是用户进行网络包抓取时需要基于该软件进行二次开发,而无法确知其中参数对程序整体运行的影响。此外网络包抓取程序在运行时需要抓取大量的网络包,而网络包在处理时缓存在内存之中频繁地创建和消耗内存空间给程序带来了极大的开销。因此本文提出了一系列的对PF_RING DNA程序的优化方式,并基于其上开发了一个网络包抓取程序。
在基于PF_RING DNA的网络包抓取程序运行时需要把抓取到的数据包发送到下游的kafka消息系统中进行存储,并最终由下游的网络安全分析系统从kafka中读取数据进行分析。而kafka为增加程序的并行化提升程序效能,将其存储空间以broke的形式分为多个,每个broker为一个单独的进程。其消费者和生产者可以单独的和broker进行通信。由于kafka中的broker无法确保和预知其中数据的顺序性,所以在将数据包乱序的放入kafka中会导致之后的网络安全分析系统准确度降低。所以在抓包程序的子进程中将数据送入kafka之前先将抓到的数据包求hash值。
公式(1)为数据包的hash值计算公式,该公式使用Toeplitz[5]哈希算法,其中four-tuple为网络包的源IP地址、目的IP地址、源端口和目的端口,key为一个40字节大小的种子。最后即可得出发送的broker的id。通过对数据包发送的负载均衡可以有效将数据包分配到几个发送进程之上,减少由于发送进程堵塞导致的丢包率上升问题。
在对网络包进行抓取的过程中,通过TOP指令观察发现,PF_RING DNA的抓取和转发进程在实际操作时会由于间断性的网络流量波动,不同的进程间会互相干预。而这种抢占其他进程的CPU最终会导致网络包抓取程序的丢包率上升,所以本文通过在程序中添加CPU亲和性来强制限定程序运行所占用的资源。
实验环境包括两台物理服务器,主要配置为:2个Intel Xeon E5-2609 v2@2.50GHz的 CPU,128GB 内存。并设置PF_RING DNA参数为hugepage=2048mb、rx=2、tx=2。两台物理服务器中其中一台配置有PF⁃Send数据包发送程序,另一台配置有PF_RING DNA网络包抓取程序,两台服务器使用万兆光纤直接相连。总计发送10亿个数据包,通过调整每次发送的数据包大小来测试程序的丢包率。
如表1所示,当保持万兆网卡总吞吐量不变,通过改变包大小测试程序丢包率和性能。除每次程序启动时由于参数初始化会导致丢包情况以外,基本丢包率为0,因此该程序可以有效完成基于万兆网卡的数据包抓取转发工作。
表1 PF_RING DNA网络包抓取程序丢包率测试
本文在基于PF_RING DNA程序的基础上设计并提出了一个网络包抓取转发程序,通过使用hash的方式为程序提供了负载均衡,此外还通过调整CPU的亲和性有效降低了由于网络波动导致的不同进程间相互影响导致的丢包率升高问题,最后通过参数调优找到了符合程序运行的最优参数,并且通过实验得出该程序可以实现万兆网卡的0丢包率数据包抓取与转发。
参考文献:
[1]CNNIC.第39次《中国互联网络发展状况统计报告》[EB/OL],2017-03-16.
[2]华为技术有限公司.NetStream技术白皮书[EB/OL],2016-5-17.http://www1.huawei.com/.
[3]Introduction to Cisco IOS NetFlow[EB/OL],2016-5-17.http://www.cisco.com/.
[4]Krawczyk H.New Hash Functions for Message Authentication[C].International Conference on the Theory and Applications of Cryptographic Techniques.Springer,Berlin,Heidelberg,1995:301-310.