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

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

圖3 高性能數據流表處理架構Fig.3 Architecture of high performance data flow table processing
搭建實驗平臺,實驗的網絡拓撲圖如圖4所示。一臺TCPReplay發包測試機、一臺H3C交換機、一臺普通PC、一臺基于DPDK的高性能數據流處理系統。

圖4 實驗平臺網絡拓撲圖Fig.4 Topology of experimental platform
實驗將Field Test和Lab Test相結合,采用Tcpreplay進行發包測試,先在Field Test場景下將真實流量捕獲,存為PCAP文件,然后將PCAP文件作為Lab Test的背景流量,在其上指定發包速率、發包次數,對設備進行測試。
本實驗用于測試的PCAP文件從真實的萬兆網絡環境中捕獲,時長為5min,大小為247GB。將該PCAP文件使用tcpreplay -i eth1 -t /ft1.pcap進行全速發包,對高性能數據流處理系統進行流量統計。通過統計實際捕獲到的流量總量為247GB,可以看出,基于DPDK的高性能數據流處理系統在高速率高并發的網絡環境中能高效的抓取數據包并維護數據流表。
本文主要對DPDK的技術原理進行了分析并將其應用在數據包采集上,同時對基于DPDK采集的數據包進行數據流表的維護,采用基于哈希算法的會話流存儲技術和基于定時器的會話流老化技術,并成功將其應用在上網行為管理系統和上網行為審計系統中,作為高性能數據流表,后續還將繼續研究并實現將其應用在防火墻、IPS、IDS設備中。