王岳
(四川大學計算機學院,成都 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.