熊衛(wèi)剛
(南京高達(dá)軟件有限公司,江蘇 南京 210012)
對(duì)于網(wǎng)絡(luò)安全測試而言,網(wǎng)絡(luò)數(shù)據(jù)包抓取成為一個(gè)重要的信息監(jiān)測手段,其在數(shù)據(jù)庫防護(hù)設(shè)計(jì)、信息審計(jì)系統(tǒng)防護(hù)以及病毒入侵防護(hù)等方面有著重要而又廣泛的應(yīng)用[1,2]。由于數(shù)據(jù)流量趨近海量化,因此高效的抓取技術(shù)對(duì)于防護(hù)性能的提升有著重要支持,然而當(dāng)前抓包技術(shù)效率低下的問題限制了其防護(hù)性能的提升[3]。對(duì)于一個(gè)有效的抓包技術(shù)而言,其需要在極短的時(shí)間內(nèi)實(shí)現(xiàn)對(duì)異常數(shù)據(jù)包的獲取,并對(duì)其進(jìn)行嚴(yán)格檢測,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)的過濾處理。隨著網(wǎng)絡(luò)帶寬的提升,網(wǎng)絡(luò)數(shù)據(jù)在單位時(shí)間內(nèi)呈現(xiàn)高流量化,這樣給抓包技術(shù)帶來了更多的挑戰(zhàn)。為了解決這些問題,一些學(xué)者分別從硬件支持和軟件支持兩個(gè)角度進(jìn)行考慮。硬件抓包技術(shù)需要專業(yè)化定制設(shè)計(jì),缺乏靈活性和適用性,但是具有極高的抓包效率。軟件抓包技術(shù)降低了對(duì)硬件的需求,具有更高的靈活度,但效率有待提升。鑒于此本文結(jié)合當(dāng)前流行的DPDK機(jī)制,深入分析其原理上,最終設(shè)計(jì)出一套完整的高效抓包系統(tǒng),為當(dāng)前的網(wǎng)絡(luò)信息安全防護(hù)提供支持[4]。
BPF數(shù)據(jù)抓包技術(shù)即伯克利封包過濾器技術(shù),其作為一類典型的數(shù)據(jù)抓取技術(shù),在Linux和Unix系統(tǒng)數(shù)據(jù)鏈路上提供了數(shù)據(jù)結(jié)構(gòu),并實(shí)現(xiàn)了數(shù)據(jù)的封裝、數(shù)據(jù)包的收發(fā)和過濾等功能[5]。這種抓包技術(shù)基于BSD操作系統(tǒng)進(jìn)行設(shè)計(jì),實(shí)現(xiàn)數(shù)據(jù)包的有效過濾。從其運(yùn)行機(jī)理來看,目前實(shí)現(xiàn)這一技術(shù)基本要素包括兩個(gè)方面,一是網(wǎng)絡(luò)數(shù)據(jù)包過濾,二是網(wǎng)絡(luò)數(shù)據(jù)包的轉(zhuǎn)發(fā)。網(wǎng)絡(luò)數(shù)據(jù)包的轉(zhuǎn)發(fā)主要是對(duì)數(shù)據(jù)包進(jìn)行捕獲,然后將其轉(zhuǎn)發(fā)到數(shù)據(jù)過濾處。網(wǎng)絡(luò)數(shù)據(jù)包過濾則是根據(jù)設(shè)計(jì)的網(wǎng)絡(luò)數(shù)據(jù)包處理規(guī)則對(duì)收據(jù)進(jìn)行接收或者丟棄。從當(dāng)前的運(yùn)行機(jī)制可知,其將數(shù)據(jù)過濾后再轉(zhuǎn)發(fā)到應(yīng)用層,這樣有助于降低系統(tǒng)開銷,以提升數(shù)據(jù)處理效率。由于數(shù)據(jù)的抓取和過濾環(huán)節(jié)都在Linux內(nèi)核中進(jìn)行,因此會(huì)隨著系統(tǒng)的改變而做出相應(yīng)的改變,從而導(dǎo)致其性能不夠穩(wěn)定,缺乏有效的普適性。
libpcap數(shù)據(jù)包抓取技術(shù)作為另一類抓包技術(shù),其在C語言運(yùn)行庫上實(shí)現(xiàn),并依托Unix或Linux系統(tǒng)平臺(tái)來實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的抓取,能夠在很多Unix平臺(tái)上實(shí)現(xiàn)良好的抓包性能[6,7]。此外,該技術(shù)有著很好的程序擴(kuò)展能力,能夠根據(jù)C語言編寫的函數(shù)庫進(jìn)行功能調(diào)整,具有良好的函數(shù)接口。從其運(yùn)行機(jī)理上分析可知,其主要工作要素包括以下4點(diǎn)。首先本地網(wǎng)絡(luò)設(shè)置為混合工作狀態(tài),以此來獲取所有經(jīng)過該節(jié)點(diǎn)的數(shù)據(jù)包,其次抓取復(fù)制流經(jīng)的網(wǎng)絡(luò)數(shù)據(jù)包,并對(duì)其進(jìn)行一定的處理,從而保證網(wǎng)絡(luò)系統(tǒng)正常運(yùn)轉(zhuǎn),再次經(jīng)過BPF數(shù)據(jù)過濾來降低系統(tǒng)開銷,提升整體處理性能,最后將上述過濾后的數(shù)據(jù)包傳入系統(tǒng)內(nèi)核緩存,用戶終端通過應(yīng)用層程序進(jìn)行提取和處理。這種工作機(jī)制在數(shù)據(jù)包復(fù)制上占用大量的CPU時(shí)間,導(dǎo)致整體數(shù)據(jù)分析能力和效率降低。
該抓包技術(shù)作為重要的數(shù)據(jù)包抓取技術(shù),立足于提升內(nèi)核提升數(shù)據(jù)包抓取效率,并為應(yīng)用程序提供有效的接口函數(shù)庫,實(shí)現(xiàn)了數(shù)據(jù)包抓取技術(shù)功能豐富化和高擴(kuò)展性[8]。該項(xiàng)技術(shù)深入考慮了Linux系統(tǒng)特點(diǎn),為其提供一種新的具備緩存功能的協(xié)議簇,并通過DMA內(nèi)存直接訪問機(jī)制和NAPI直接中斷模式降低了CPU處理時(shí)間,從而提升了數(shù)據(jù)包的捕獲效率。此外終端用戶可以通過相應(yīng)的應(yīng)用層程序依托mmap技術(shù)實(shí)現(xiàn)對(duì)Linux系統(tǒng)內(nèi)核數(shù)據(jù)包的訪問,降低了對(duì)數(shù)據(jù)包的復(fù)制次數(shù),從而有效提升了數(shù)據(jù)包的后續(xù)處理性能。該項(xiàng)技術(shù)可在系統(tǒng)內(nèi)核中獨(dú)立存在,并且能夠?qū)崿F(xiàn)加載和釋放模塊的動(dòng)態(tài)功能,由此可以提升即插即用的能力。主要運(yùn)行機(jī)理要素可總結(jié)如下。一是對(duì)Linux系統(tǒng)內(nèi)核提供環(huán)狀緩存socket及其接口,二是通過網(wǎng)卡將流經(jīng)數(shù)據(jù)復(fù)制至該緩存中,并釋放原數(shù)據(jù),三是通過應(yīng)用程序和socket結(jié)構(gòu)對(duì)接,并通過應(yīng)用程序依托mmap技術(shù)實(shí)現(xiàn)對(duì)上述緩存數(shù)據(jù)的訪問。這種技術(shù)有助于提升適用性,并能夠降低數(shù)據(jù)復(fù)制次數(shù),從而提升數(shù)據(jù)包處理效率,但由于數(shù)據(jù)抓取過程和預(yù)處理過程仍然位于內(nèi)核之中,因此會(huì)提升內(nèi)核負(fù)擔(dān),并在反復(fù)數(shù)據(jù)交換中消耗性能。
鑒于上述3類技術(shù)存在的巨大缺陷,如何以低系統(tǒng)開銷實(shí)現(xiàn)數(shù)據(jù)包抓取性能的提升成為當(dāng)前研究的主要熱點(diǎn)問題,對(duì)此DPDK技術(shù)通過低開銷run-tocompletion模式的運(yùn)行環(huán)境,實(shí)現(xiàn)最好的數(shù)據(jù)包抓取性能[9,10]。DPDK技術(shù)是因特爾公司開發(fā)的一種數(shù)據(jù)包轉(zhuǎn)發(fā)套件,由于不具備網(wǎng)絡(luò)協(xié)議棧,因此不能提供二三層轉(zhuǎn)發(fā)功能。盡管其不具備防火墻ACL操作,但是可以通過間接技術(shù)實(shí)現(xiàn)該功能。此外其作為軟件套件,具備很強(qiáng)大的可視化界面效果和用戶友好的驅(qū)動(dòng)程序,從而實(shí)現(xiàn)了數(shù)據(jù)層和應(yīng)用層的完美對(duì)接。根據(jù)當(dāng)前應(yīng)用可知,DPDK技術(shù)主要具備以下4類技術(shù)點(diǎn)。一是Huge TLB page,該技術(shù)點(diǎn)主要用于提升內(nèi)存管理效率,從而實(shí)現(xiàn)資源利用率的提升。二是UIO,該技術(shù)點(diǎn)可以驅(qū)動(dòng)分塊,并將啟動(dòng)部分放置在內(nèi)核中,系統(tǒng)功能塊放置在應(yīng)用層從而能夠避免內(nèi)核更新后對(duì)應(yīng)用程序的支持影響,提升整體技術(shù)的可移植性。三是CPU Affinity,該技術(shù)點(diǎn)的主要作用在于能夠?qū)⒉煌瑪?shù)據(jù)面的線程操作約束到CPU內(nèi)核中,從而防止持續(xù)調(diào)度中的性能降低。四是zero copy,該技術(shù)點(diǎn)主要考慮到數(shù)據(jù)包從網(wǎng)卡到用戶端復(fù)制帶來的空間消耗問題,將數(shù)據(jù)包從設(shè)備段直接轉(zhuǎn)入內(nèi)核之中,用戶通過需求來直接訪問數(shù)據(jù)以實(shí)現(xiàn)數(shù)據(jù)的處理,這有助于降低數(shù)據(jù)包的復(fù)制次數(shù),并對(duì)降低CPU負(fù)載有著促進(jìn)作用,從而優(yōu)化CPU資源利用率。
DPDK技術(shù)將驅(qū)動(dòng)處理事件交由用戶處理,并能夠根據(jù)系統(tǒng)結(jié)構(gòu)變化而做出優(yōu)化調(diào)整,同時(shí)豐富的API函數(shù)為應(yīng)用程序注入提供了豐富的接口,從而提升了整體用戶操作性能。典型的DPDK數(shù)據(jù)結(jié)構(gòu)框架如圖1所示。
圖1 DPDK數(shù)據(jù)結(jié)構(gòu)框架
DPDK技術(shù)基于X86平臺(tái)設(shè)計(jì),具備快速處理報(bào)文庫和驅(qū)動(dòng)套件的能力,能在Linux用戶空間良好運(yùn)行,但當(dāng)前僅支持因特爾網(wǎng)卡[11]。對(duì)此本文結(jié)合DPDK-1.7.0版本開展技術(shù)實(shí)現(xiàn)操作。
抓包開始前,需要通過DPDK sdk程序中的DPDK端口查看和綁定工具pci_unbind,確定抓包端口,并在此基礎(chǔ)上申請(qǐng)huge頁進(jìn)行分區(qū)掛載。數(shù)據(jù)包捕獲時(shí),需要通過rte_eal_init()、init_port()以及init_mbuf_pools()等進(jìn)行參數(shù)、端口以及內(nèi)存緩沖的初始化操作,并通過do_packet_forwarding_bypass()函數(shù)進(jìn)行端口偵聽,以檢測流經(jīng)數(shù)據(jù)包,然后通過用戶處理函數(shù)對(duì)流經(jīng)的數(shù)據(jù)包繼續(xù)做相應(yīng)處理。對(duì)此可設(shè)置對(duì)應(yīng)的狀態(tài)號(hào)或物理性的端口有效處理抓包過程,具體流程如圖2所示。
圖2 DPDK數(shù)據(jù)抓取獲流程
主要流程可以分為如下幾個(gè)環(huán)節(jié)。首先初始化DPDK參數(shù)、EAL環(huán)境、mbuf和pool隊(duì)列、端口配置以及狀態(tài),其次接收來自于流經(jīng)端口的數(shù)據(jù)包,并通過循環(huán)偵聽的方式循環(huán)抓取,最后通過用戶自定義函數(shù)process_packets()預(yù)處理每個(gè)數(shù)據(jù)包,并分析其涵蓋的協(xié)議類型和端口,進(jìn)行數(shù)據(jù)分發(fā)。
通過上述基本流程實(shí)現(xiàn)數(shù)據(jù)包的物理層、鏈路層以及網(wǎng)絡(luò)層信息的解析,并獲取其對(duì)應(yīng)的源IP地址、目標(biāo)IP地址、源端口號(hào)、目標(biāo)端口號(hào)以及對(duì)應(yīng)的協(xié)議信息等,實(shí)現(xiàn)數(shù)據(jù)解析效率提升。在進(jìn)行數(shù)據(jù)分發(fā)時(shí),進(jìn)行五元組哈希分組,由此增加數(shù)據(jù)包處理能力,提升整體效率。
網(wǎng)絡(luò)時(shí)代的發(fā)展,數(shù)據(jù)信息安全成為亟待解決的問題,對(duì)此數(shù)據(jù)抓取成為關(guān)鍵技術(shù)。然而傳統(tǒng)技術(shù)在設(shè)計(jì)上存在諸多缺陷,無法有效提升抓包效率,因此本文考慮了DPDK低的系統(tǒng)開銷特點(diǎn),深入探討了其對(duì)應(yīng)的技術(shù)原理要點(diǎn),并實(shí)現(xiàn)了該技術(shù)在數(shù)據(jù)包抓取中的應(yīng)用,為當(dāng)前開展數(shù)據(jù)包抓取研究工作的相關(guān)人士提供技術(shù)參考。