北京電子科技職業(yè)學(xué)院 牟曉玲 張萍 董大波
在網(wǎng)絡(luò)監(jiān)控與管理領(lǐng)域,防火墻、上網(wǎng)行為管理、IDS、IPS等產(chǎn)品都需要對(duì)數(shù)據(jù)包進(jìn)行采集和分析。本文在深入研究Intel DPDK技術(shù)的基礎(chǔ)之上,利用DPDK設(shè)計(jì)了一套具有普適性的高性能數(shù)據(jù)流處理系統(tǒng),使用TCPReplay對(duì)該系統(tǒng)進(jìn)行測(cè)試,驗(yàn)證了在高速率高并發(fā)的網(wǎng)絡(luò)環(huán)境中,該系統(tǒng)能高效抓取數(shù)據(jù)包并維護(hù)通用數(shù)據(jù)流表,最后將其成功的應(yīng)用在了上網(wǎng)行為管理系統(tǒng)和上網(wǎng)行為審計(jì)系統(tǒng)中。
傳統(tǒng)Linux捕包的方法主要有三種:(1)Libpcap,利用數(shù)據(jù)鏈路層捕包接口PF_PACKET的捕包程序庫。該接口為通用的網(wǎng)絡(luò)應(yīng)用程序設(shè)計(jì),接口簡(jiǎn)單且和底層網(wǎng)卡驅(qū)動(dòng)無關(guān),但是效率不高。(2)PF_RING,開源的捕包接口,其原理是在內(nèi)核開辟環(huán)形緩沖區(qū),通過在內(nèi)核隊(duì)列注冊(cè)HOOK函數(shù)獲取數(shù)據(jù)包并放入環(huán)形緩沖區(qū),這個(gè)環(huán)形緩沖區(qū)數(shù)據(jù)包只進(jìn)行了一次內(nèi)存拷貝,比通用的方法PF_PACKET效率高很多。(3)零Copy機(jī)制,這種機(jī)制下,網(wǎng)卡的數(shù)據(jù)包直接拷貝到用戶空間,而且是零系統(tǒng)調(diào)用。這種機(jī)制的包捕獲效率高,但是需要修改網(wǎng)卡驅(qū)動(dòng),和硬件相關(guān)。
基于傳統(tǒng)Linux捕包在高速網(wǎng)絡(luò)下的問題,本文基于DPDK平臺(tái)進(jìn)行數(shù)據(jù)包捕獲和會(huì)話流管理。
Intel DPDK全稱Intel Data Plane Development Kit,是Intel提供的數(shù)據(jù)平面開發(fā)工具集,它專注于網(wǎng)絡(luò)應(yīng)用中數(shù)據(jù)包的高性能處理。具體體現(xiàn)在DPDK應(yīng)用程序繞過了Linux內(nèi)核協(xié)議棧對(duì)數(shù)據(jù)包的處理過程,從而大幅提升了數(shù)據(jù)包收發(fā)處理的速率。DPDK架構(gòu)一共由五個(gè)組件構(gòu)成:環(huán)境適應(yīng)層EAL(Environment Abstraction Layer):提供了一套API,主要用于系統(tǒng)的初始化; 緩沖區(qū)管理(Buffer Management ): 提供了一套API,用于獲取內(nèi)存和創(chuàng)建緩沖池;環(huán)管理(Ring Functions):針對(duì)入列和出列操作提供了無鎖的實(shí)現(xiàn),支持大批量操作以減少開銷;流分類(Packet Flow Classification)和輪詢模式驅(qū)動(dòng)程序(NIC Poll Mode Library)。
鑒于這種架構(gòu),基于DPDK的用戶態(tài)軟件崩潰,不會(huì)影響系統(tǒng)的穩(wěn)定性。同時(shí)避免了內(nèi)核態(tài)和用戶態(tài)的報(bào)文拷貝,減少了操作系統(tǒng)的內(nèi)核開銷,從而實(shí)現(xiàn)了加速;研究表明,DPDK可以將數(shù)據(jù)包處理性能最多提高十倍。
在高速率高并發(fā)的網(wǎng)絡(luò)環(huán)境中,采用基于DPDK的高速數(shù)據(jù)包捕獲技術(shù)進(jìn)行數(shù)據(jù)包抓取。捕包模塊同時(shí)從不同的網(wǎng)卡抓包,為了提高處理效率,每個(gè)網(wǎng)卡均有相應(yīng)的抓包線程,同時(shí)可以根據(jù)配置文件中的配置規(guī)則進(jìn)行條件抓包,所有的抓包線程將所抓取的數(shù)據(jù)包存儲(chǔ)在一個(gè)共享緩沖區(qū)中。具體的抓包過程如下:
(1)使用函數(shù)rte_eal_init對(duì)DPDK應(yīng)用程序進(jìn)行環(huán)境抽象層(EAL層)初始化工作。包括獲取系統(tǒng)可用的CPU數(shù)量、查詢可用的PCI網(wǎng)卡設(shè)備、建立日志文件等。
(2)使用函數(shù)init_port對(duì)端口進(jìn)行初始化配置,查看和配置對(duì)應(yīng)端口的狀態(tài)。
(3)使用函數(shù)init_mbuf_pools對(duì)DPDK的mbuf和pool隊(duì)列進(jìn)行初始化。
(4)利用死循環(huán),持續(xù)從網(wǎng)卡抓包。在循環(huán)中,使用rte_eth_rx_burst函數(shù)從端口接收數(shù)據(jù)包。
(5)根據(jù)配置文件中的配置規(guī)則對(duì)每一個(gè)數(shù)據(jù)包進(jìn)行初步處理,需要進(jìn)一步分析的數(shù)據(jù)包將其存儲(chǔ)到一個(gè)共享內(nèi)存緩沖區(qū)中。
通過上述處理,數(shù)據(jù)包采集模塊將所有發(fā)送到該網(wǎng)卡的網(wǎng)絡(luò)數(shù)據(jù)包抓取并保存在一塊共享內(nèi)存區(qū)中,實(shí)現(xiàn)了數(shù)據(jù)包的采集工作,抓包線程如圖1所示。

圖1 基于DPDK的抓包處理過程Fig.1 Packet capturing process based on DPDK
在高速率高并發(fā)的萬兆網(wǎng)絡(luò)中,存儲(chǔ)和查找會(huì)話流是進(jìn)行數(shù)據(jù)分析的基礎(chǔ)和關(guān)鍵步驟。哈希表是一種以鍵-值(key-index) 存儲(chǔ)數(shù)據(jù)的高效數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),能夠根據(jù)鍵值快速定位,從而提高插入數(shù)據(jù)和查詢數(shù)據(jù)的效率。采用高效的哈希算法可以解決萬兆網(wǎng)絡(luò)中數(shù)據(jù)流的存儲(chǔ)問題。哈希算法由3部分組成:數(shù)據(jù)存儲(chǔ)方式、沖突解決方式和哈希函數(shù)。
在高性能數(shù)據(jù)流表的設(shè)計(jì)中,采用改進(jìn)的經(jīng)典哈希算法,將數(shù)據(jù)存放在一張大小固定的哈希表中,該哈希表為一個(gè)二維數(shù)組conntrack_ssn_hash[SSN_HASH_BUCKET_SIZE][SSN_HASH_BUCKET_DEPTH],其中一維下標(biāo)用來表示Key值,二維下標(biāo)用以解決哈希沖突。該算法在存儲(chǔ)上有一定的上限,可能造成數(shù)據(jù)丟棄。因此在實(shí)際應(yīng)用中,可以綜合內(nèi)存大小和效率要求,設(shè)置合適的SSN_HASH_BUCKET_DEPTH。
均勻性是衡量哈希函數(shù)性能的重要指標(biāo)。研究證明,移位運(yùn)算和異或運(yùn)算能夠保證哈希結(jié)果具有較好的均勻性。在高性能數(shù)據(jù)流表的實(shí)現(xiàn)中,我們采用基于位運(yùn)算和異或運(yùn)算的哈希函數(shù),根據(jù)會(huì)話流中的5元組<源 ip 目的 ip 源 port 目的 port 協(xié)議 >進(jìn)行哈希運(yùn)算,具體運(yùn)算過程如圖2所示。
高速率高并發(fā)的萬兆網(wǎng)絡(luò)中,基于對(duì)內(nèi)存和效率的考慮,需要定期對(duì)會(huì)話流進(jìn)行老化處理。TCP流在收到FIN包后,會(huì)話流結(jié)束。UDP流的結(jié)束沒有明顯特征,需要自己設(shè)定老化時(shí)間。為了提高老化處理效率,將統(tǒng)計(jì)老化會(huì)話流及處理老化會(huì)話流分開處理。分別設(shè)置統(tǒng)計(jì)定時(shí)器和老化定時(shí)器。在會(huì)話流老化技術(shù)中,定時(shí)器和老化統(tǒng)計(jì)時(shí)鐘的設(shè)置是關(guān)鍵,需要綜合考慮系統(tǒng)數(shù)據(jù)分析周期、系統(tǒng)內(nèi)存大小和數(shù)據(jù)分析處理精度。
高性能數(shù)據(jù)流表的實(shí)現(xiàn)主要由兩部分組成:數(shù)據(jù)包采集模塊和會(huì)話流存儲(chǔ)模塊。處理架構(gòu)如圖3所示。數(shù)據(jù)包采集模塊,主要根據(jù)配置文件中的抓包規(guī)則進(jìn)行數(shù)據(jù)包采集,并將采集的數(shù)據(jù)包存入一塊包共享內(nèi)存中。會(huì)話流存儲(chǔ)模塊,該模塊啟動(dòng)后,開辟一塊流共享內(nèi)存區(qū)域,之后生成兩個(gè)處理線程,一個(gè)線程負(fù)責(zé)讀取包共享內(nèi)存中的Packet進(jìn)行包處理。另外一個(gè)線程負(fù)責(zé)會(huì)話流老化,兩個(gè)線程共同維護(hù)會(huì)話流,為后續(xù)的數(shù)據(jù)處理提供支撐。

圖3 高性能數(shù)據(jù)流表處理架構(gòu)Fig.3 Architecture of high performance data flow table processing
搭建實(shí)驗(yàn)平臺(tái),實(shí)驗(yàn)的網(wǎng)絡(luò)拓?fù)鋱D如圖4所示。一臺(tái)TCPReplay發(fā)包測(cè)試機(jī)、一臺(tái)H3C交換機(jī)、一臺(tái)普通PC、一臺(tái)基于DPDK的高性能數(shù)據(jù)流處理系統(tǒng)。

圖4 實(shí)驗(yàn)平臺(tái)網(wǎng)絡(luò)拓?fù)鋱DFig.4 Topology of experimental platform
實(shí)驗(yàn)將Field Test和Lab Test相結(jié)合,采用Tcpreplay進(jìn)行發(fā)包測(cè)試,先在Field Test場(chǎng)景下將真實(shí)流量捕獲,存為PCAP文件,然后將PCAP文件作為L(zhǎng)ab Test的背景流量,在其上指定發(fā)包速率、發(fā)包次數(shù),對(duì)設(shè)備進(jìn)行測(cè)試。
本實(shí)驗(yàn)用于測(cè)試的PCAP文件從真實(shí)的萬兆網(wǎng)絡(luò)環(huán)境中捕獲,時(shí)長(zhǎng)為5min,大小為247GB。將該P(yáng)CAP文件使用tcpreplay -i eth1 -t /ft1.pcap進(jìn)行全速發(fā)包,對(duì)高性能數(shù)據(jù)流處理系統(tǒng)進(jìn)行流量統(tǒng)計(jì)。通過統(tǒng)計(jì)實(shí)際捕獲到的流量總量為247GB,可以看出,基于DPDK的高性能數(shù)據(jù)流處理系統(tǒng)在高速率高并發(fā)的網(wǎng)絡(luò)環(huán)境中能高效的抓取數(shù)據(jù)包并維護(hù)數(shù)據(jù)流表。
本文主要對(duì)DPDK的技術(shù)原理進(jìn)行了分析并將其應(yīng)用在數(shù)據(jù)包采集上,同時(shí)對(duì)基于DPDK采集的數(shù)據(jù)包進(jìn)行數(shù)據(jù)流表的維護(hù),采用基于哈希算法的會(huì)話流存儲(chǔ)技術(shù)和基于定時(shí)器的會(huì)話流老化技術(shù),并成功將其應(yīng)用在上網(wǎng)行為管理系統(tǒng)和上網(wǎng)行為審計(jì)系統(tǒng)中,作為高性能數(shù)據(jù)流表,后續(xù)還將繼續(xù)研究并實(shí)現(xiàn)將其應(yīng)用在防火墻、IPS、IDS設(shè)備中。
數(shù)字技術(shù)與應(yīng)用2022年8期