陸超杰,楊鑫,王啟蒙,朱逸廷,陶松
(1.國(guó)核自儀系統(tǒng)工程有限公司,上海 200240;2.烽臺(tái)科技(北京)有限公司,北京 100195)
隨著互聯(lián)網(wǎng)技術(shù)在工業(yè)控制領(lǐng)域的廣泛應(yīng)用,工業(yè)控制網(wǎng)絡(luò)智能化和自動(dòng)化的水平越來(lái)越高,系統(tǒng)也從隔離封閉的環(huán)境逐步轉(zhuǎn)為半開放的系統(tǒng),甚至與互聯(lián)網(wǎng)直接進(jìn)行連接[1-2]。工業(yè)控制網(wǎng)絡(luò)的發(fā)展造成生產(chǎn)力提高的同時(shí),也帶來(lái)了安全方面的挑戰(zhàn)。
通過(guò)對(duì)工業(yè)控制網(wǎng)絡(luò)熱數(shù)據(jù)的分析,可以實(shí)現(xiàn)對(duì)生產(chǎn)環(huán)境的監(jiān)控,實(shí)現(xiàn)對(duì)諸如高溫、高壓等異常狀況的預(yù)警。同時(shí)大多數(shù)安全軟件依靠對(duì)數(shù)據(jù)幀進(jìn)行捕獲與分析來(lái)實(shí)現(xiàn)安全防護(hù)的功能,但工業(yè)控制網(wǎng)絡(luò)日益增長(zhǎng)的帶寬對(duì)數(shù)據(jù)流量的捕獲造成了極大的限制[3]。為了應(yīng)對(duì)這些問(wèn)題,需要一種在高速網(wǎng)絡(luò)環(huán)境下能夠?qū)崿F(xiàn)低延遲、低丟失率的方法,對(duì)數(shù)據(jù)包進(jìn)行捕獲轉(zhuǎn)儲(chǔ)。通過(guò)對(duì)轉(zhuǎn)儲(chǔ)數(shù)據(jù)的分析處理,實(shí)現(xiàn)對(duì)工業(yè)控制網(wǎng)絡(luò)的安全監(jiān)控。
在傳統(tǒng)的網(wǎng)絡(luò)數(shù)據(jù)轉(zhuǎn)儲(chǔ)中常用 Wireshark、TCPDUMP 等軟件進(jìn)行數(shù)據(jù)包捕獲,這類軟件依賴操作系統(tǒng)提供的接口獲取數(shù)據(jù)幀,當(dāng)數(shù)據(jù)量過(guò)大時(shí)不能完整對(duì)數(shù)據(jù)流進(jìn)行捕獲,從而出現(xiàn)丟包等現(xiàn)象[4-6]。并且在工業(yè)控制網(wǎng)絡(luò)中數(shù)據(jù)包長(zhǎng)度在 64~ 100 bit 區(qū)域附近數(shù)據(jù)包較多,而操作系統(tǒng)的網(wǎng)絡(luò)協(xié)議棧是通過(guò)中斷來(lái)獲取數(shù)據(jù)包到達(dá)的消息,長(zhǎng)度較短的數(shù)據(jù)包在相同的帶寬下造成的中斷次數(shù)更多,給操作系統(tǒng)造成了極大的中斷開銷[7]。
而 DPDK 則通過(guò)用戶空間驅(qū)動(dòng)的方式繞過(guò)內(nèi)核網(wǎng)絡(luò)協(xié)議棧,將所有必要的驅(qū)動(dòng)程序移至用戶空間,從而避免系統(tǒng)調(diào)用并實(shí)現(xiàn)應(yīng)用程序的零拷貝訪問(wèn)。在用戶空間通過(guò)輪詢的方式判斷數(shù)據(jù)幀的到達(dá),直接從網(wǎng)絡(luò)設(shè)備獲取數(shù)據(jù)并進(jìn)行處理,極大地提高了數(shù)據(jù)包獲取的性能。
針對(duì)萬(wàn)兆級(jí)工業(yè)熱數(shù)據(jù)采集存儲(chǔ)問(wèn)題,本文提出了一種基于數(shù)據(jù)平面開發(fā)框架 DPDK 的網(wǎng)絡(luò)數(shù)據(jù)幀采集存儲(chǔ)方案,在構(gòu)建的工控網(wǎng)絡(luò)靶場(chǎng)中得以驗(yàn)證,在保證快速采集工業(yè)熱數(shù)據(jù)的同時(shí),保證數(shù)據(jù)的完整性。
數(shù)據(jù)平面開發(fā)框架 DPDK 是一個(gè)由 Linux 開源基金會(huì)管理的開源軟件項(xiàng)目。它提供一組用于數(shù)據(jù)平面處理的函數(shù)庫(kù)和基于輪詢模式的用戶空間網(wǎng)卡驅(qū)動(dòng)程序,將數(shù)據(jù)包的處理從內(nèi)核空間轉(zhuǎn)移到了用戶空間。與內(nèi)核空間提供的基于中斷的驅(qū)動(dòng)程序相比,實(shí)現(xiàn)了更高的計(jì)算效率與更高的數(shù)據(jù)吞吐量。
DPDK 框架通過(guò)環(huán)境抽象層,隱藏了具體的實(shí)現(xiàn)細(xì)節(jié),并且為不同的硬件平臺(tái)和操作系統(tǒng)提供了統(tǒng)一的編程接口,實(shí)現(xiàn)了源代碼級(jí)別的可移植性。DPDK 還提供多線程與多進(jìn)程模型、CPU 親和性、內(nèi)存緩沖池、原子與鎖定操作及無(wú)鎖循環(huán)隊(duì)列等功能。
Libpcap 是一個(gè)可移植的用于網(wǎng)絡(luò)流量捕獲和分析的函數(shù)庫(kù),包括數(shù)據(jù)包嗅探、網(wǎng)絡(luò)監(jiān)視、流量生成等功能。Libpcap 為不同操作系統(tǒng)提供一套與操作系統(tǒng)無(wú)關(guān)的接口,來(lái)實(shí)現(xiàn)應(yīng)用程序?qū)Χ鄠€(gè)操作系統(tǒng)數(shù)據(jù)包捕獲的需求。
REST 是一種基于超媒體構(gòu)建分布式系統(tǒng)的架構(gòu)風(fēng)格。在通常情況下,RESTful API 會(huì)使用 HTTP 作為應(yīng)用程序協(xié)議。RESTful API 圍繞任何類型的對(duì)象、數(shù)據(jù)或服務(wù)等資源進(jìn)行設(shè)計(jì),每一個(gè)資源可以被 URL 唯一標(biāo)識(shí)。RESTful API 使用統(tǒng)一的接口,有助于實(shí)現(xiàn)客戶端與服務(wù)器分離。
gRPC 是一個(gè)開源的高性能遠(yuǎn)程過(guò)程調(diào)用框架,可以在多種不同的編程語(yǔ)言環(huán)境和硬件平臺(tái)下進(jìn)行工作。它可以通過(guò)負(fù)載均衡、跟蹤和身份驗(yàn)證動(dòng)態(tài)的與數(shù)據(jù)中心進(jìn)行連接。典型的 gRPC 客戶端將會(huì)公開實(shí)現(xiàn)特定功能的本地函數(shù),以供遠(yuǎn)程計(jì)算機(jī)上的另一個(gè)進(jìn)程調(diào)用。并且將遠(yuǎn)程調(diào)用偽裝成本地調(diào)用。
本方案采用模塊化設(shè)計(jì)思想,按照所負(fù)責(zé)的功能分為控制層與數(shù)據(jù)層兩大模塊,模塊之間通過(guò)遠(yuǎn)程過(guò)程調(diào)用進(jìn)行通信??刂茖臃譃閮蓚€(gè)子模塊,分別是調(diào)度模塊與信息采集模塊。數(shù)據(jù)層分為收發(fā)模塊、采集模塊與匯聚模塊??刂茖痈鶕?jù)任務(wù)需求,對(duì)位于本地或遠(yuǎn)程的數(shù)據(jù)層下達(dá)指令完成相應(yīng)任務(wù),并采集數(shù)據(jù)層上報(bào)的相關(guān)信息;數(shù)層根據(jù)控制層下發(fā)的任務(wù)完成采集匯聚,并將過(guò)程信息與執(zhí)行結(jié)果上報(bào)給控制層。整個(gè)系統(tǒng)的架構(gòu)如圖1 所示。
圖1 基于軟件定義網(wǎng)絡(luò)的數(shù)據(jù)采集存儲(chǔ)系統(tǒng)結(jié)構(gòu)
調(diào)度模塊負(fù)責(zé)本系統(tǒng)與外部應(yīng)用的協(xié)同工作,具體過(guò)程如圖2 所示。調(diào)度模塊根據(jù)外部應(yīng)用發(fā)布的任務(wù)信息生成任務(wù),并放入按照一定優(yōu)先級(jí)排序的任務(wù)隊(duì)列,等待任務(wù)執(zhí)行。當(dāng)數(shù)據(jù)層空閑的時(shí)候,調(diào)度模塊向控制層下發(fā)指令并推送任務(wù)信息,使控制層開始工作。同時(shí)調(diào)度模塊根據(jù)外部應(yīng)用的請(qǐng)求返回任務(wù)的執(zhí)行情況或任務(wù)的執(zhí)行結(jié)果信息。
圖2 采集調(diào)度模塊流程示意圖
在開發(fā)跨編程語(yǔ)言或跨硬件平臺(tái)軟件時(shí),通常會(huì)因?yàn)檫M(jìn)程之間的通信問(wèn)題而不能簡(jiǎn)單高效地集成,而單一程序又不能有效地實(shí)現(xiàn)系統(tǒng)需求。所以為了更好地與外部應(yīng)用集成以進(jìn)行協(xié)同工作,需要合適的通信協(xié)議來(lái)完成進(jìn)程之間的通信。
在與外部應(yīng)用集成的情況下,要求協(xié)議層次清晰、語(yǔ)義簡(jiǎn)潔,而對(duì)性能要求不高。所以調(diào)度模塊采用 HTTP RESTful API 風(fēng)格的接口進(jìn)行與外部應(yīng)用的通信,以保證與其他應(yīng)用簡(jiǎn)單集成。
而在與同一應(yīng)用不同模塊之間的通信,則要求高性能與快速響應(yīng)。所以調(diào)度模塊采用gRPC 框架進(jìn)行不同模塊之間的通信。
在系統(tǒng)數(shù)據(jù)層運(yùn)行時(shí),會(huì)產(chǎn)生系統(tǒng)運(yùn)行時(shí)數(shù)據(jù),包括運(yùn)行狀況、轉(zhuǎn)儲(chǔ)數(shù)目、轉(zhuǎn)儲(chǔ)文件大小等,通過(guò)這些數(shù)據(jù)可以對(duì)系統(tǒng)健康狀況、任務(wù)完成進(jìn)度等進(jìn)行判斷。
信息采集模塊會(huì)在控制層執(zhí)行任務(wù)時(shí),采集控制層上報(bào)的運(yùn)行數(shù)據(jù),并緩存在特定的存儲(chǔ)空間中,供外部應(yīng)用調(diào)取。并且在任務(wù)結(jié)束時(shí)采集任務(wù)完成信息。具體操作流程如圖3 所示。
圖3 信息采集模塊流程示意圖
同時(shí),在萬(wàn)兆級(jí)別的網(wǎng)絡(luò)環(huán)境下,每秒產(chǎn)生的數(shù)據(jù)量通常有1G 以上,遠(yuǎn)超普通機(jī)械硬盤的寫入速度,而固態(tài)硬盤價(jià)格昂貴,不適合作為大量數(shù)據(jù)的存儲(chǔ)介質(zhì)。為了實(shí)現(xiàn)轉(zhuǎn)儲(chǔ)文件在高網(wǎng)絡(luò)負(fù)載的情況下,能夠快速存儲(chǔ),本方案采用 Linux 內(nèi)存文件系統(tǒng) tmpfs 來(lái)作為系統(tǒng)臨時(shí)文件的緩存方式。tmpfs 是Linux 中的一種文件系統(tǒng),他將所有的文件都存儲(chǔ)在內(nèi)存或交換分區(qū)中。將文件放入tmpfs 是加快文件訪問(wèn)速度的有效方法。
在本方案中,使用 Libpcap 將從無(wú)鎖循環(huán)隊(duì)列中取出的數(shù)據(jù)幀存儲(chǔ)為 pcapng 格式的臨時(shí)文件。pcapng 是下一代網(wǎng)絡(luò)數(shù)據(jù)包跟蹤轉(zhuǎn)儲(chǔ)格式,具有良好的可擴(kuò)展性、可移植性,并且可以進(jìn)行數(shù)據(jù)的合并與追加。pcapng 格式嵌入了豐富的文件信息,供其他程序使用,并且數(shù)據(jù)格式獨(dú)立于網(wǎng)絡(luò)設(shè)備、硬件平臺(tái)與操作系統(tǒng),可以簡(jiǎn)單地將數(shù)據(jù)幀轉(zhuǎn)儲(chǔ)文件推送到服務(wù)器等其他設(shè)備進(jìn)行分析。pcapng 格式解決了pcap 格式的一些不足,支持諸如多網(wǎng)絡(luò)接口捕獲、更高精度與長(zhǎng)度的64 位時(shí)間戳、在文件中存儲(chǔ)額外元數(shù)據(jù)等,是工業(yè)互聯(lián)網(wǎng)熱數(shù)據(jù)轉(zhuǎn)儲(chǔ)的良好選擇。
采集模塊會(huì)在的采集線程在采集工作開始時(shí),會(huì)在內(nèi)存文件系統(tǒng)中創(chuàng)建一個(gè)臨時(shí)的 pcapng 文件。之后采集模塊會(huì)從無(wú)鎖循環(huán)隊(duì)列中取出數(shù)據(jù)幀,并通過(guò) Libpcap 寫入臨時(shí)pcapng 文件。當(dāng)文件臨時(shí)到達(dá)一定大小,采集線程會(huì)創(chuàng)建新的臨時(shí)文件并將之前的文件路徑通過(guò)無(wú)鎖循環(huán)隊(duì)列發(fā)送到匯聚模塊。
在采集模塊中,不同工作線程同時(shí)進(jìn)行工作,相同時(shí)間段產(chǎn)生的數(shù)據(jù)幀可能分散在不同的臨時(shí)文件中,直接使用臨時(shí)文件進(jìn)行分析等工作將會(huì)產(chǎn)生不確定的結(jié)果。
在傳統(tǒng)的數(shù)據(jù)包轉(zhuǎn)儲(chǔ)方案中,Linux 系統(tǒng)的網(wǎng)絡(luò)流量通過(guò)內(nèi)核協(xié)議棧進(jìn)行處理,并且通過(guò)內(nèi)核中的網(wǎng)絡(luò)過(guò)濾器 Netfilter 進(jìn)行過(guò)濾。當(dāng)網(wǎng)絡(luò)數(shù)據(jù)幀到達(dá)網(wǎng)絡(luò)設(shè)備時(shí),網(wǎng)絡(luò)設(shè)備會(huì)以中斷的形式通知內(nèi)核協(xié)議棧對(duì)數(shù)據(jù)幀進(jìn)行處理,在數(shù)據(jù)量大時(shí)會(huì)產(chǎn)生大量的中斷,導(dǎo)致CPU 無(wú)法處理其他進(jìn)程。而內(nèi)核對(duì)數(shù)據(jù)幀進(jìn)行處理后還需將數(shù)據(jù)負(fù)載拷貝到用戶空間,并通知用戶空間應(yīng)用程序。在這個(gè)過(guò)程中存在兩次上下文切換、內(nèi)核協(xié)議棧數(shù)據(jù)處理和內(nèi)核空間到用戶空間數(shù)據(jù)拷貝造成的開銷。本方案中采用的是DPDK 收發(fā)框架構(gòu)建系統(tǒng)收發(fā)能力,與傳統(tǒng)的網(wǎng)絡(luò)數(shù)據(jù)幀轉(zhuǎn)儲(chǔ)方案不同,通過(guò)用戶空間驅(qū)動(dòng)的方式繞過(guò)內(nèi)核網(wǎng)絡(luò)協(xié)議棧,將所有必要的驅(qū)動(dòng)程序移至用戶空間,從而避免系統(tǒng)調(diào)用并實(shí)現(xiàn)應(yīng)用程序的零拷貝訪問(wèn)。在用戶空間通過(guò)輪詢的方式判斷數(shù)據(jù)幀的到達(dá),直接從網(wǎng)絡(luò)設(shè)備獲取數(shù)據(jù)并進(jìn)行處理,極大地提高了數(shù)據(jù)包獲取的性能,具體流程示意圖如圖4 所示。
圖4 收發(fā)模塊DPDK 收發(fā)框架示意圖
DPDK 框架使用內(nèi)存池技術(shù),避免了在高并發(fā)場(chǎng)景下內(nèi)存申請(qǐng)?jiān)斐傻拈_銷與延遲。DPDK 將數(shù)據(jù)幀緩存在一種名為Mbuf 結(jié)構(gòu)體中,當(dāng)收包模塊輪詢過(guò)程中檢測(cè)到網(wǎng)絡(luò)設(shè)備的接收隊(duì)列不為空時(shí),將會(huì)根據(jù)隊(duì)列中數(shù)據(jù)幀的數(shù)量在內(nèi)存池中申請(qǐng)若干個(gè)Mbuf 內(nèi)存塊,并將隊(duì)列中的數(shù)據(jù)幀通過(guò)直接存儲(chǔ)器訪問(wèn)寫入到Mbuf 中;DPDK 發(fā)送數(shù)據(jù)包時(shí),等待網(wǎng)卡將數(shù)據(jù)發(fā)送完畢后將Mbuf 內(nèi)存塊重新放回內(nèi)存池中。整個(gè)過(guò)程沒(méi)有不確定大小的內(nèi)存塊的申請(qǐng)與釋放,極大地提高了數(shù)據(jù)幀的處理效率。
DPDK 框架支持CPU 親和與CPU 獨(dú)占功能特性,它可以將每個(gè)工作線程綁定到不同的CPU 核心上面,使該線程只能在特定的核心上運(yùn)行,線程不會(huì)在不同核心之間頻繁遷移,減少調(diào)度產(chǎn)生的開銷,避免了緩存失效造成的命中問(wèn)題或其他消耗。
DPDK 提供流分類技術(shù),DPDK 流分類器通過(guò)無(wú)鎖循環(huán)隊(duì)列,將數(shù)據(jù)幀均勻分配給收發(fā)模塊的各個(gè)工作線程,工作線程從隊(duì)列中取出數(shù)據(jù)幀進(jìn)行克隆操作后推入發(fā)送隊(duì)列進(jìn)行發(fā)送,然后將克隆的數(shù)據(jù)幀推入采集隊(duì)列交由采集模塊進(jìn)行采集。
在本方案中,收發(fā)模塊根據(jù)調(diào)度模塊發(fā)送的指令信息,創(chuàng)建流規(guī)則并使能 DPDK 流分類器用來(lái)捕捉符合特定規(guī)則的數(shù)據(jù)幀。對(duì)于不能匹配流規(guī)則的數(shù)據(jù)幀直接進(jìn)行轉(zhuǎn)發(fā),以節(jié)省存儲(chǔ)空間。對(duì)于匹配流規(guī)則的數(shù)據(jù)幀,則增加對(duì)存放該數(shù)據(jù)幀的 Mbuf 內(nèi)存塊的引用以進(jìn)行淺拷貝,然后將淺拷貝數(shù)據(jù)幀包推入存儲(chǔ)隊(duì)列,之后將原數(shù)據(jù)幀推入網(wǎng)卡發(fā)送隊(duì)列。
本方案提出了一種工業(yè)控制網(wǎng)絡(luò)熱數(shù)據(jù)采集存儲(chǔ)方案,采用數(shù)據(jù)平面開發(fā)框架作為開發(fā)框架,并結(jié)合Libpcap、gRPC 等函數(shù)庫(kù),能夠在高負(fù)載工業(yè)控制網(wǎng)絡(luò)場(chǎng)景下,實(shí)現(xiàn)對(duì)萬(wàn)兆級(jí)別的工業(yè)控制網(wǎng)絡(luò)熱數(shù)據(jù)采集與存儲(chǔ),并保證轉(zhuǎn)儲(chǔ)數(shù)據(jù)的可靠性與實(shí)時(shí)性。并且本方案可以結(jié)合鏈路聚合技術(shù)使用,對(duì)數(shù)據(jù)層進(jìn)行動(dòng)態(tài)擴(kuò)容,實(shí)現(xiàn)更高帶寬網(wǎng)絡(luò)數(shù)據(jù)的采集與轉(zhuǎn)儲(chǔ)。系統(tǒng)可以穩(wěn)定高效地完成相應(yīng)工作,并實(shí)現(xiàn)相應(yīng)系統(tǒng)要求。