熊衛剛
(南京高達軟件有限公司,江蘇 南京 210012)
對于網絡安全測試而言,網絡數據包抓取成為一個重要的信息監測手段,其在數據庫防護設計、信息審計系統防護以及病毒入侵防護等方面有著重要而又廣泛的應用[1,2]。由于數據流量趨近海量化,因此高效的抓取技術對于防護性能的提升有著重要支持,然而當前抓包技術效率低下的問題限制了其防護性能的提升[3]。對于一個有效的抓包技術而言,其需要在極短的時間內實現對異常數據包的獲取,并對其進行嚴格檢測,從而實現對數據的過濾處理。隨著網絡帶寬的提升,網絡數據在單位時間內呈現高流量化,這樣給抓包技術帶來了更多的挑戰。為了解決這些問題,一些學者分別從硬件支持和軟件支持兩個角度進行考慮。硬件抓包技術需要專業化定制設計,缺乏靈活性和適用性,但是具有極高的抓包效率。軟件抓包技術降低了對硬件的需求,具有更高的靈活度,但效率有待提升。鑒于此本文結合當前流行的DPDK機制,深入分析其原理上,最終設計出一套完整的高效抓包系統,為當前的網絡信息安全防護提供支持[4]。
BPF數據抓包技術即伯克利封包過濾器技術,其作為一類典型的數據抓取技術,在Linux和Unix系統數據鏈路上提供了數據結構,并實現了數據的封裝、數據包的收發和過濾等功能[5]。這種抓包技術基于BSD操作系統進行設計,實現數據包的有效過濾。從其運行機理來看,目前實現這一技術基本要素包括兩個方面,一是網絡數據包過濾,二是網絡數據包的轉發。網絡數據包的轉發主要是對數據包進行捕獲,然后將其轉發到數據過濾處。網絡數據包過濾則是根據設計的網絡數據包處理規則對收據進行接收或者丟棄。從當前的運行機制可知,其將數據過濾后再轉發到應用層,這樣有助于降低系統開銷,以提升數據處理效率。由于數據的抓取和過濾環節都在Linux內核中進行,因此會隨著系統的改變而做出相應的改變,從而導致其性能不夠穩定,缺乏有效的普適性。
libpcap數據包抓取技術作為另一類抓包技術,其在C語言運行庫上實現,并依托Unix或Linux系統平臺來實現網絡數據包的抓取,能夠在很多Unix平臺上實現良好的抓包性能[6,7]。此外,該技術有著很好的程序擴展能力,能夠根據C語言編寫的函數庫進行功能調整,具有良好的函數接口。從其運行機理上分析可知,其主要工作要素包括以下4點。首先本地網絡設置為混合工作狀態,以此來獲取所有經過該節點的數據包,其次抓取復制流經的網絡數據包,并對其進行一定的處理,從而保證網絡系統正常運轉,再次經過BPF數據過濾來降低系統開銷,提升整體處理性能,最后將上述過濾后的數據包傳入系統內核緩存,用戶終端通過應用層程序進行提取和處理。這種工作機制在數據包復制上占用大量的CPU時間,導致整體數據分析能力和效率降低。
該抓包技術作為重要的數據包抓取技術,立足于提升內核提升數據包抓取效率,并為應用程序提供有效的接口函數庫,實現了數據包抓取技術功能豐富化和高擴展性[8]。該項技術深入考慮了Linux系統特點,為其提供一種新的具備緩存功能的協議簇,并通過DMA內存直接訪問機制和NAPI直接中斷模式降低了CPU處理時間,從而提升了數據包的捕獲效率。此外終端用戶可以通過相應的應用層程序依托mmap技術實現對Linux系統內核數據包的訪問,降低了對數據包的復制次數,從而有效提升了數據包的后續處理性能。該項技術可在系統內核中獨立存在,并且能夠實現加載和釋放模塊的動態功能,由此可以提升即插即用的能力。主要運行機理要素可總結如下。一是對Linux系統內核提供環狀緩存socket及其接口,二是通過網卡將流經數據復制至該緩存中,并釋放原數據,三是通過應用程序和socket結構對接,并通過應用程序依托mmap技術實現對上述緩存數據的訪問。這種技術有助于提升適用性,并能夠降低數據復制次數,從而提升數據包處理效率,但由于數據抓取過程和預處理過程仍然位于內核之中,因此會提升內核負擔,并在反復數據交換中消耗性能。
鑒于上述3類技術存在的巨大缺陷,如何以低系統開銷實現數據包抓取性能的提升成為當前研究的主要熱點問題,對此DPDK技術通過低開銷run-tocompletion模式的運行環境,實現最好的數據包抓取性能[9,10]。DPDK技術是因特爾公司開發的一種數據包轉發套件,由于不具備網絡協議棧,因此不能提供二三層轉發功能。盡管其不具備防火墻ACL操作,但是可以通過間接技術實現該功能。此外其作為軟件套件,具備很強大的可視化界面效果和用戶友好的驅動程序,從而實現了數據層和應用層的完美對接。根據當前應用可知,DPDK技術主要具備以下4類技術點。一是Huge TLB page,該技術點主要用于提升內存管理效率,從而實現資源利用率的提升。二是UIO,該技術點可以驅動分塊,并將啟動部分放置在內核中,系統功能塊放置在應用層從而能夠避免內核更新后對應用程序的支持影響,提升整體技術的可移植性。三是CPU Affinity,該技術點的主要作用在于能夠將不同數據面的線程操作約束到CPU內核中,從而防止持續調度中的性能降低。四是zero copy,該技術點主要考慮到數據包從網卡到用戶端復制帶來的空間消耗問題,將數據包從設備段直接轉入內核之中,用戶通過需求來直接訪問數據以實現數據的處理,這有助于降低數據包的復制次數,并對降低CPU負載有著促進作用,從而優化CPU資源利用率。
DPDK技術將驅動處理事件交由用戶處理,并能夠根據系統結構變化而做出優化調整,同時豐富的API函數為應用程序注入提供了豐富的接口,從而提升了整體用戶操作性能。典型的DPDK數據結構框架如圖1所示。

圖1 DPDK數據結構框架
DPDK技術基于X86平臺設計,具備快速處理報文庫和驅動套件的能力,能在Linux用戶空間良好運行,但當前僅支持因特爾網卡[11]。對此本文結合DPDK-1.7.0版本開展技術實現操作。
抓包開始前,需要通過DPDK sdk程序中的DPDK端口查看和綁定工具pci_unbind,確定抓包端口,并在此基礎上申請huge頁進行分區掛載。數據包捕獲時,需要通過rte_eal_init()、init_port()以及init_mbuf_pools()等進行參數、端口以及內存緩沖的初始化操作,并通過do_packet_forwarding_bypass()函數進行端口偵聽,以檢測流經數據包,然后通過用戶處理函數對流經的數據包繼續做相應處理。對此可設置對應的狀態號或物理性的端口有效處理抓包過程,具體流程如圖2所示。

圖2 DPDK數據抓取獲流程
主要流程可以分為如下幾個環節。首先初始化DPDK參數、EAL環境、mbuf和pool隊列、端口配置以及狀態,其次接收來自于流經端口的數據包,并通過循環偵聽的方式循環抓取,最后通過用戶自定義函數process_packets()預處理每個數據包,并分析其涵蓋的協議類型和端口,進行數據分發。
通過上述基本流程實現數據包的物理層、鏈路層以及網絡層信息的解析,并獲取其對應的源IP地址、目標IP地址、源端口號、目標端口號以及對應的協議信息等,實現數據解析效率提升。在進行數據分發時,進行五元組哈希分組,由此增加數據包處理能力,提升整體效率。
網絡時代的發展,數據信息安全成為亟待解決的問題,對此數據抓取成為關鍵技術。然而傳統技術在設計上存在諸多缺陷,無法有效提升抓包效率,因此本文考慮了DPDK低的系統開銷特點,深入探討了其對應的技術原理要點,并實現了該技術在數據包抓取中的應用,為當前開展數據包抓取研究工作的相關人士提供技術參考。