王岳
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
隨著互聯(lián)網(wǎng)近些年的發(fā)展,網(wǎng)絡(luò)已經(jīng)成為現(xiàn)代社會(huì)重要的組成部分,據(jù)CNNIC于2017年中發(fā)布的統(tǒng)計(jì)結(jié)果中顯示。國際出口網(wǎng)絡(luò)流量帶寬相比較年初增長了15.4%[1]。由此可見伴隨著網(wǎng)絡(luò)流量的不斷增長,對于網(wǎng)絡(luò)流量的抓取也越發(fā)困難。而網(wǎng)絡(luò)流量的抓取作為網(wǎng)絡(luò)分析和網(wǎng)絡(luò)內(nèi)容監(jiān)控的重要組成部分被大量的網(wǎng)絡(luò)安全分析框架所應(yīng)用。
在傳統(tǒng)的網(wǎng)絡(luò)流量抓取和采集方面,主要分為兩種方式。其中硬件方式為使用現(xiàn)有的網(wǎng)絡(luò)流量采集方案譬如NetStream[2]和Netflow[3],但是該種方式需要定制的網(wǎng)絡(luò)設(shè)備,不僅價(jià)格昂貴此外該種方案大量采用采樣的方式抽取流量會(huì)導(dǎo)致抓取的結(jié)果不準(zhǔn)確。另一種方式是使用現(xiàn)有的網(wǎng)絡(luò)包抓取軟件netmap、libpcap等,但是該種軟件往往效率低下只能夠承載數(shù)百兆的網(wǎng)絡(luò)流量無法對大規(guī)模高速網(wǎng)絡(luò)流量進(jìn)行采集和處理。因此本文根據(jù)以上特點(diǎn)特使用PF_RING DNA網(wǎng)絡(luò)包抓取程序,并基于該程序的基礎(chǔ)上進(jìn)行參數(shù)調(diào)優(yōu)和改進(jìn),最終能夠取得良好的運(yùn)行效果。
PF_RING DNA作為ntop[4]組織開發(fā)的一款網(wǎng)絡(luò)數(shù)據(jù)包抓取程序,支持BFP過濾器提供了該程序在測試時(shí)可以不用部署在真實(shí)環(huán)境下而是可以從PCAP文件中直接讀取數(shù)據(jù)包。PF_RING DNA改寫了Linux的內(nèi)核模塊提供了實(shí)現(xiàn)一種新socket類型,用戶空間的應(yīng)用程序可以與PF_RING內(nèi)核模塊進(jìn)行通訊??梢酝ㄟ^在編譯時(shí)選擇PF_RING DNA的各種網(wǎng)卡模式,使得程序兼容各種型號的網(wǎng)卡。并且PF_RING DNA將抓取的數(shù)據(jù)包從內(nèi)核模塊中復(fù)制到環(huán)形緩沖區(qū)之中,用戶空間的應(yīng)用程序可以從用戶態(tài)讀取數(shù)據(jù)。一旦數(shù)據(jù)包從環(huán)形緩沖去中讀取出來,環(huán)形緩沖區(qū)中用來存儲數(shù)據(jù)包的空間將會(huì)分配給后續(xù)的數(shù)據(jù)包使用,新進(jìn)入緩沖區(qū)中的數(shù)據(jù)包的內(nèi)存索引會(huì)覆蓋之前數(shù)據(jù)包的索引。
然而PF_RING DNA區(qū)存在諸多的問題,由于該程序是非開源的但是用戶進(jìn)行網(wǎng)絡(luò)包抓取時(shí)需要基于該軟件進(jìn)行二次開發(fā),而無法確知其中參數(shù)對程序整體運(yùn)行的影響。此外網(wǎng)絡(luò)包抓取程序在運(yùn)行時(shí)需要抓取大量的網(wǎng)絡(luò)包,而網(wǎng)絡(luò)包在處理時(shí)緩存在內(nèi)存之中頻繁地創(chuàng)建和消耗內(nèi)存空間給程序帶來了極大的開銷。因此本文提出了一系列的對PF_RING DNA程序的優(yōu)化方式,并基于其上開發(fā)了一個(gè)網(wǎng)絡(luò)包抓取程序。
在基于PF_RING DNA的網(wǎng)絡(luò)包抓取程序運(yùn)行時(shí)需要把抓取到的數(shù)據(jù)包發(fā)送到下游的kafka消息系統(tǒng)中進(jìn)行存儲,并最終由下游的網(wǎng)絡(luò)安全分析系統(tǒng)從kafka中讀取數(shù)據(jù)進(jìn)行分析。而kafka為增加程序的并行化提升程序效能,將其存儲空間以broke的形式分為多個(gè),每個(gè)broker為一個(gè)單獨(dú)的進(jìn)程。其消費(fèi)者和生產(chǎn)者可以單獨(dú)的和broker進(jìn)行通信。由于kafka中的broker無法確保和預(yù)知其中數(shù)據(jù)的順序性,所以在將數(shù)據(jù)包亂序的放入kafka中會(huì)導(dǎo)致之后的網(wǎng)絡(luò)安全分析系統(tǒng)準(zhǔn)確度降低。所以在抓包程序的子進(jìn)程中將數(shù)據(jù)送入kafka之前先將抓到的數(shù)據(jù)包求hash值。
公式(1)為數(shù)據(jù)包的hash值計(jì)算公式,該公式使用Toeplitz[5]哈希算法,其中four-tuple為網(wǎng)絡(luò)包的源IP地址、目的IP地址、源端口和目的端口,key為一個(gè)40字節(jié)大小的種子。最后即可得出發(fā)送的broker的id。通過對數(shù)據(jù)包發(fā)送的負(fù)載均衡可以有效將數(shù)據(jù)包分配到幾個(gè)發(fā)送進(jìn)程之上,減少由于發(fā)送進(jìn)程堵塞導(dǎo)致的丟包率上升問題。
在對網(wǎng)絡(luò)包進(jìn)行抓取的過程中,通過TOP指令觀察發(fā)現(xiàn),PF_RING DNA的抓取和轉(zhuǎn)發(fā)進(jìn)程在實(shí)際操作時(shí)會(huì)由于間斷性的網(wǎng)絡(luò)流量波動(dòng),不同的進(jìn)程間會(huì)互相干預(yù)。而這種搶占其他進(jìn)程的CPU最終會(huì)導(dǎo)致網(wǎng)絡(luò)包抓取程序的丟包率上升,所以本文通過在程序中添加CPU親和性來強(qiáng)制限定程序運(yùn)行所占用的資源。
實(shí)驗(yàn)環(huán)境包括兩臺物理服務(wù)器,主要配置為:2個(gè)Intel Xeon E5-2609 v2@2.50GHz的 CPU,128GB 內(nèi)存。并設(shè)置PF_RING DNA參數(shù)為hugepage=2048mb、rx=2、tx=2。兩臺物理服務(wù)器中其中一臺配置有PF?Send數(shù)據(jù)包發(fā)送程序,另一臺配置有PF_RING DNA網(wǎng)絡(luò)包抓取程序,兩臺服務(wù)器使用萬兆光纖直接相連。總計(jì)發(fā)送10億個(gè)數(shù)據(jù)包,通過調(diào)整每次發(fā)送的數(shù)據(jù)包大小來測試程序的丟包率。
如表1所示,當(dāng)保持萬兆網(wǎng)卡總吞吐量不變,通過改變包大小測試程序丟包率和性能。除每次程序啟動(dòng)時(shí)由于參數(shù)初始化會(huì)導(dǎo)致丟包情況以外,基本丟包率為0,因此該程序可以有效完成基于萬兆網(wǎng)卡的數(shù)據(jù)包抓取轉(zhuǎn)發(fā)工作。
表1 PF_RING DNA網(wǎng)絡(luò)包抓取程序丟包率測試
本文在基于PF_RING DNA程序的基礎(chǔ)上設(shè)計(jì)并提出了一個(gè)網(wǎng)絡(luò)包抓取轉(zhuǎn)發(fā)程序,通過使用hash的方式為程序提供了負(fù)載均衡,此外還通過調(diào)整CPU的親和性有效降低了由于網(wǎng)絡(luò)波動(dòng)導(dǎo)致的不同進(jìn)程間相互影響導(dǎo)致的丟包率升高問題,最后通過參數(shù)調(diào)優(yōu)找到了符合程序運(yùn)行的最優(yōu)參數(shù),并且通過實(shí)驗(yàn)得出該程序可以實(shí)現(xiàn)萬兆網(wǎng)卡的0丟包率數(shù)據(jù)包抓取與轉(zhuǎn)發(fā)。
參考文獻(xiàn):
[1]CNNIC.第39次《中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告》[EB/OL],2017-03-16.
[2]華為技術(shù)有限公司.NetStream技術(shù)白皮書[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.