茍建國(guó),呂高鋒,邱為好,孫志剛
(國(guó)防科技大學(xué) 計(jì)算機(jī)學(xué)院,長(zhǎng)沙 410073)
MiddleBox在數(shù)據(jù)中心、運(yùn)營(yíng)商和企業(yè)網(wǎng)中起著重要的作用.主要承擔(dān)網(wǎng)絡(luò)性能、監(jiān)控等任務(wù),實(shí)際應(yīng)用的MiddleBox有,起地址轉(zhuǎn)換作用的地址轉(zhuǎn)換器(NAT)、負(fù)載均衡器和起安全作用的網(wǎng)絡(luò)入侵檢測(cè)系統(tǒng)(NIDS)與網(wǎng)絡(luò)入侵防護(hù)系統(tǒng)(NIPS).然而,現(xiàn)在的MiddleBox大多是基于定制的ASICs實(shí)現(xiàn)的.這些ASIC的功能在設(shè)計(jì)時(shí)就已經(jīng)確定,而基于ASIC開發(fā)的MiddleBox若需要添加新的功能,就需要選取新的ASIC.若市場(chǎng)上沒(méi)有ASIC支持新的功能,就需要重新定制ASIC,而ASIC的開發(fā)周期相對(duì)較長(zhǎng),這就降低了MiddleBox的市場(chǎng)競(jìng)爭(zhēng)力.且由于使用定制的ASIC,MiddleBox功能的擴(kuò)展性較差.因?yàn)榫W(wǎng)絡(luò)中使用的MiddleBox由不同的廠商開發(fā),使用的標(biāo)準(zhǔn)和協(xié)議各不相同,導(dǎo)致很難統(tǒng)一管理這些MiddleBox,這樣無(wú)形加大了網(wǎng)絡(luò)維護(hù)人員的工作難度.
為了解決上面提出的問(wèn)題,可以考慮使用網(wǎng)絡(luò)功能虛擬化,通過(guò)軟件來(lái)實(shí)現(xiàn)原來(lái)基于硬件的MiddleBox的功能,并且這些MiddleBox運(yùn)行在通用的硬件上(如X86服務(wù)器),這樣避免了專有硬件的開發(fā),提高了MiddleBox的通用性.網(wǎng)絡(luò)功能的實(shí)現(xiàn)可以使用多種語(yǔ)言,如有使用基于C語(yǔ)言的Click組件進(jìn)行MiddleBox開發(fā)的,而本文中使用P4語(yǔ)言,主要是由于使用P4語(yǔ)言可以編寫協(xié)議無(wú)關(guān)的數(shù)據(jù)包處理器,這是由P4語(yǔ)言的運(yùn)行機(jī)制所決定的,這就為MiddleBox支持協(xié)議無(wú)關(guān)提供了可能.且使用P4語(yǔ)言開發(fā),代碼簡(jiǎn)短,并支持代碼重用,可以提高開發(fā)效率.
在MiddleBox的研究中,為實(shí)現(xiàn)虛擬化,很多研究都選擇將MiddleBox部署在虛擬機(jī)中,而本文中使用更加輕量級(jí)的Docker,以提高物理主機(jī)資源的利用率,同時(shí)方便MiddleBox移植.
為驗(yàn)證方案的可行性,本文使用P4語(yǔ)言實(shí)現(xiàn)了一個(gè)部署于Docker中運(yùn)行的限速器,該限速器是協(xié)議無(wú)關(guān)的,并對(duì)功能進(jìn)行了測(cè)試.
近年來(lái),MiddleBox的研究是一個(gè)比較熱的方向.主要針對(duì)MiddleBox的可編程性、可擴(kuò)展性進(jìn)行研究.
在xOMB[1]中,設(shè)計(jì)實(shí)現(xiàn)了一個(gè)運(yùn)行在通用服務(wù)器和操作系統(tǒng)上的,具有擴(kuò)展功能的MiddleBox.它使用可編程的流水線來(lái)進(jìn)行網(wǎng)絡(luò)包處理,這些流水線由xOMB自身提供的模塊和用戶自定義的C++模塊為實(shí)現(xiàn)某一功能而構(gòu)建,對(duì)功能的添加就是對(duì)處理流水線的重新構(gòu)造和添加.每一個(gè)功能(如負(fù)載均衡交換、NAT)對(duì)應(yīng)一個(gè)處理流水線.每個(gè)處理流水線對(duì)應(yīng)一個(gè)功能模塊的組成序列.然而在xOMB中,不能將多個(gè)網(wǎng)絡(luò)功能應(yīng)用于同一個(gè)處理流水線.
OpenBox[2]解耦了MiddleBox的控制平面和數(shù)據(jù)平面,將MiddleBox數(shù)據(jù)平面數(shù)據(jù)處理的過(guò)程劃分為不同的階段,并對(duì)不同的MiddleBox的處理階段進(jìn)行統(tǒng)一,實(shí)現(xiàn)了一個(gè)統(tǒng)一的流水處理過(guò)程.但它的數(shù)據(jù)平面工作在特有的硬件上,仍然存在基于硬件實(shí)現(xiàn)MiddleBox的缺點(diǎn).
ClickOS[3]中實(shí)現(xiàn)了一個(gè)高性能的虛擬化的軟件MiddleBox平臺(tái),并實(shí)現(xiàn)了防火墻、NAT和負(fù)載均衡三個(gè)MiddleBox,每個(gè)MiddleBox部署在一個(gè)對(duì)應(yīng)的虛擬機(jī)中,雖然他對(duì)虛擬機(jī)中的系統(tǒng)進(jìn)行了裁剪,對(duì)通信接口進(jìn)行了簡(jiǎn)化,但這種方式的部署所花費(fèi)的代價(jià)仍然很大,不如部署在更加輕量級(jí)的Docker[4]中,故本文實(shí)現(xiàn)的VNF部署于Docker中.
OpenState[5]使用擴(kuò)展有限狀態(tài)機(jī)的方法實(shí)現(xiàn)了交換機(jī)有狀態(tài)數(shù)據(jù)平面編程抽象,這種有限狀態(tài)機(jī)的方法同樣可用在MiddleBox的開發(fā)中,對(duì)于數(shù)據(jù)包的處理可以通過(guò)查看狀態(tài)表來(lái)確定處理的動(dòng)作.這種方法的難點(diǎn)在于確定問(wèn)題的有限狀態(tài).有狀態(tài)方法的另一個(gè)問(wèn)題是將狀態(tài)和網(wǎng)絡(luò)功能關(guān)聯(lián)在一起,將狀態(tài)關(guān)聯(lián)于一個(gè)單獨(dú)的網(wǎng)絡(luò)功能實(shí)例限制了其彈性、靈活性以及應(yīng)對(duì)多路徑路由、軟件更新等應(yīng)用的能力[6].
SPDA[7]也實(shí)現(xiàn)了有狀態(tài)的數(shù)據(jù)平面的轉(zhuǎn)發(fā),它的出發(fā)點(diǎn)主要是OpenFlow[8]的工作方式為match-action,不能實(shí)現(xiàn)復(fù)雜的網(wǎng)絡(luò)應(yīng)用,故采用match-state-action的模式來(lái)實(shí)現(xiàn)有狀態(tài)的數(shù)據(jù)平面的數(shù)據(jù)轉(zhuǎn)發(fā).由于P4語(yǔ)言的工作方式和OpenFlow的相似,故也可以采用這種模式來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)功能.
圖1 解析協(xié)議狀態(tài)圖Fig.1 State graph of parsing the protocol
AVANT-GUARD[9]針對(duì)軟件定義網(wǎng)絡(luò)(SDN)控制平面和數(shù)據(jù)平面分離存在的denial-of-service (Dos) 攻擊進(jìn)行分析,提出了connection migration 和actuating triggers方法,這些方法的實(shí)質(zhì)還是使用了狀態(tài)的轉(zhuǎn)換.
另一個(gè)相關(guān)工作是P4可編程包處理語(yǔ)言,使用P4[10-13]語(yǔ)言可設(shè)計(jì)協(xié)議無(wú)關(guān)的數(shù)據(jù)包處理器,而對(duì)于MiddleBox來(lái)說(shuō),實(shí)現(xiàn)協(xié)議無(wú)關(guān)是其一個(gè)重要的目標(biāo).故本文采用P4語(yǔ)言來(lái)實(shí)現(xiàn)MiddleBox功能.P4中提供了基本的數(shù)據(jù)包的處理,但是對(duì)于復(fù)雜功能的VNF的開發(fā)實(shí)現(xiàn)相對(duì)比較困難,故使用擴(kuò)展有限狀態(tài)機(jī)的方法來(lái)實(shí)現(xiàn)VNF的復(fù)雜功能.
為了實(shí)現(xiàn)MiddleBox的可擴(kuò)展性、可編程性,本文使用P4語(yǔ)言實(shí)現(xiàn)了一個(gè)有狀態(tài)的VNF——限速器,擴(kuò)展了P4語(yǔ)言的match-action工作模式為match-state-action模式,為實(shí)現(xiàn)復(fù)雜MiddleBox數(shù)據(jù)平面的數(shù)據(jù)轉(zhuǎn)發(fā)提供了方法.并將實(shí)現(xiàn)的VNF部署于容器Docker中,方便VNF的移植,且提高了物理主機(jī)的資源利用率.與其它MiddleBox相比,本系統(tǒng)實(shí)現(xiàn)了協(xié)議無(wú)關(guān)、可重配置,同時(shí)部署于Docker容器中,有較高資源利用率,且方便系統(tǒng)移植.
在數(shù)據(jù)中心中,通過(guò)構(gòu)建虛擬網(wǎng)絡(luò)功能,使原本運(yùn)行于特定硬件的網(wǎng)絡(luò)功能運(yùn)行于通用硬件設(shè)備上,解耦了網(wǎng)絡(luò)功能和硬件的關(guān)聯(lián).下面詳細(xì)闡述系統(tǒng)設(shè)計(jì).
圖2 限速器狀態(tài)轉(zhuǎn)換圖Fig.2 State transition graph of the speed limiter
由于網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,數(shù)據(jù)中心中所支持的協(xié)議也不斷增多,若針對(duì)特定的協(xié)議集進(jìn)行協(xié)議相關(guān)的設(shè)計(jì),當(dāng)增加新協(xié)議的支持時(shí),就要對(duì)系統(tǒng)進(jìn)行升級(jí)或重新設(shè)計(jì),可擴(kuò)展性較差.所以本文中設(shè)計(jì)協(xié)議無(wú)關(guān)的虛擬網(wǎng)絡(luò)功能.
選用P4語(yǔ)言進(jìn)行系統(tǒng)的開發(fā),是因?yàn)镻4語(yǔ)言可實(shí)現(xiàn)協(xié)議無(wú)關(guān)數(shù)據(jù)包處理器.P4語(yǔ)言的構(gòu)成主要分為五個(gè)部分,即頭部、解析器、表、動(dòng)作和流控制程序.解析器采用了有限狀態(tài)機(jī)的設(shè)計(jì)思想.如圖1所示,每一個(gè)節(jié)點(diǎn)可以看成是一種狀態(tài),當(dāng)要增加一個(gè)新協(xié)議時(shí),假如為VXLAN協(xié)議,只需增加一個(gè)狀態(tài),也就是增加一個(gè)解析器,在圖中就是實(shí)心圓圈的節(jié)點(diǎn).在P4解析器解析數(shù)據(jù)包之前,解析器并不知道該數(shù)據(jù)包使用哪種協(xié)議,只有當(dāng)解析器解析完數(shù)據(jù)包后,才確定其采用何種協(xié)議.在解析過(guò)程中,提取數(shù)據(jù)包頭的數(shù)據(jù)字段,數(shù)據(jù)字段的抽取可根據(jù)需求提取,同時(shí)又定義了大量的match-action表,執(zhí)行匹配操作.通過(guò)這兩點(diǎn)實(shí)現(xiàn)協(xié)議無(wú)關(guān).
在P4語(yǔ)言中,雖然使用match+action可以實(shí)現(xiàn)一般的數(shù)據(jù)平面的數(shù)據(jù)的處理,但是對(duì)于一些復(fù)雜的網(wǎng)絡(luò)功能(有狀態(tài)的防火墻、負(fù)載均衡、NAT等)就不太容易實(shí)現(xiàn),因?yàn)樵赑4中沒(méi)有相關(guān)的狀態(tài)模塊,故引入了擴(kuò)展有限狀態(tài)機(jī)方法,實(shí)現(xiàn)網(wǎng)絡(luò)功能狀態(tài)的轉(zhuǎn)換.
擴(kuò)展有限狀態(tài)機(jī)(EFSM)是一種常用的軟件形式規(guī)格說(shuō)明,由多個(gè)狀態(tài)及狀態(tài)之間的遷移構(gòu)成.一個(gè)EFSM規(guī)格說(shuō)明可以用—個(gè)六元組(S0,S,V,I,O,T)來(lái)表示.其中:S0是初始狀態(tài),S是狀態(tài)的集合,V是變量的集合,I是輸入值的集合,O是輸出值的集合,T是遷移的集合.T中每個(gè)遷移t又可表示成一個(gè)五元組
,其中:head(t)是遷移t的初始狀態(tài),tail(t)是其結(jié)束狀態(tài);event(t)為遷移t上的輸入事件;condition(t)為遷移t執(zhí)行的前提條件;action(t)為一系列的操作動(dòng)作,表明當(dāng)event(t)事件出現(xiàn)時(shí),若condition(t)成立,則遷移t從head(t)狀態(tài)變遷到tail(t)狀態(tài),并執(zhí)行action(t)中的相應(yīng)語(yǔ)句.例如,本文實(shí)現(xiàn)的VNF實(shí)例——限速器,它的狀態(tài)轉(zhuǎn)換如圖2所示,限速器包含三個(gè)狀態(tài),GREEN、YELLOW和RED.當(dāng)傳輸速率小于閾值threshold1,限速匹配項(xiàng)的狀態(tài)就是GREEN狀態(tài),當(dāng)速率在閾值threshold1和threshold2之間的事件發(fā)生時(shí),狀態(tài)由GREEN變?yōu)閅ELLOW,并執(zhí)行動(dòng)作action2().在YELLOW狀態(tài)下產(chǎn)生速率大于threshold2事件,則匹配項(xiàng)狀態(tài)變?yōu)镽ED,并執(zhí)行action3().匹配項(xiàng)從狀態(tài)RED到Y(jié)ELLOW,再到GREEN的轉(zhuǎn)換同GREEN到Y(jié)ELLOW和RED的狀態(tài)變化.
為方便狀態(tài)管理,系統(tǒng)分兩個(gè)不同的表(狀態(tài)表和擴(kuò)展有限狀態(tài)機(jī)表),狀態(tài)表主要用于查詢匹配項(xiàng)的當(dāng)前狀態(tài),擴(kuò)展有限狀態(tài)機(jī)表主要用于匹配項(xiàng)狀態(tài)的轉(zhuǎn)換查詢,根據(jù)匹配項(xiàng)當(dāng)前狀態(tài)和觸發(fā)事件確定該匹配項(xiàng)的下一狀態(tài)和執(zhí)行的動(dòng)作.
在處理數(shù)據(jù)包的過(guò)程中,主要步驟可以分為以下三步:
1)狀態(tài)查詢
狀態(tài)查詢主要查詢狀態(tài)表,根據(jù)關(guān)鍵字進(jìn)行匹配,查詢?cè)撈ヅ涞臓顟B(tài).
2)狀態(tài)轉(zhuǎn)換
根據(jù)狀態(tài)查詢階段查詢到的狀態(tài),結(jié)合觸發(fā)的事件,查詢擴(kuò)展有限狀態(tài)機(jī)表,確定匹配項(xiàng)的要執(zhí)行的動(dòng)作和下一個(gè)狀態(tài).
3)狀態(tài)更新
重寫狀態(tài)表,替換匹配項(xiàng)的舊狀態(tài)成新?tīng)顟B(tài).
例如,本文實(shí)現(xiàn)的限速器,實(shí)現(xiàn)了狀態(tài)表和擴(kuò)展有限狀態(tài)機(jī)表,如圖3所示.假設(shè)當(dāng)前來(lái)了一個(gè)源IP地址為1.1.1.1的數(shù)據(jù)包,查詢狀態(tài)表,可得到該IP地址的對(duì)應(yīng)的狀態(tài)為GREEN,若此時(shí)速率計(jì)數(shù)器中的速率在閾值threshold1和threshold2之間,查詢擴(kuò)展有限狀態(tài)機(jī)表,確定該數(shù)據(jù)包執(zhí)行action2動(dòng)作,并更新?tīng)顟B(tài)表中源IP地址為1.1.1.1的狀態(tài)為YELLOW.
圖3 包處理狀態(tài)轉(zhuǎn)換Fig.3 State transition of Packet processing
傳統(tǒng)的虛擬化技術(shù)對(duì)物理主機(jī)的資源利用率無(wú)法達(dá)到物理主機(jī)的水平.且傳統(tǒng)的虛擬化技術(shù)配置文件不靈活,難以進(jìn)行自動(dòng)化創(chuàng)建、部署.而與之相對(duì)應(yīng)的一個(gè)概念是容器.容器的思想就是把一個(gè)進(jìn)程(包括其所有子進(jìn)程)獨(dú)立打成一個(gè)包,而不影響在系統(tǒng)中運(yùn)行的其他進(jìn)程.容器是基于共享Linux內(nèi)核的一種虛擬化技術(shù).容器中的進(jìn)程所運(yùn)行的環(huán)境是獨(dú)立于物理主機(jī)操作系統(tǒng)的,當(dāng)容器啟動(dòng)的時(shí),也僅是通過(guò)進(jìn)程間的調(diào)度,而不需要引導(dǎo)整個(gè)系統(tǒng),從而提高了效率.Docker則是一種更輕量級(jí)的虛擬化容器技術(shù),具有易使用、方便移植、可跨平臺(tái)等優(yōu)勢(shì).同時(shí),Docker能夠進(jìn)行快速、標(biāo)準(zhǔn)化封裝應(yīng)用程序并自動(dòng)化部署整個(gè)運(yùn)行環(huán)境.
虛擬主機(jī)技術(shù)能使得一臺(tái)物理主機(jī)同時(shí)運(yùn)行多個(gè)操作系統(tǒng),且操作系統(tǒng)的類型不同,物理主機(jī)系統(tǒng)稱為 Host OS,而在虛擬機(jī)中安裝的操作系統(tǒng)則稱為Guest OS.每個(gè)Guest OS都有自己的計(jì)算、存儲(chǔ)和網(wǎng)絡(luò)組件,這些可以通過(guò)硬件虛擬化而來(lái),或者Host OS通過(guò)把 Guest OS的指令翻譯成物理機(jī)指令來(lái)實(shí)現(xiàn).從理論上來(lái)說(shuō),Guest OS可以是任何一種操作系統(tǒng),與底層的Host OS無(wú)關(guān).
容器則是可以看成是一種輕量級(jí)的操作系統(tǒng),它運(yùn)行在物理主機(jī)系統(tǒng)之上,直接使用物理主機(jī)的CPU指令,而不需要像虛擬機(jī)那樣要對(duì)指令進(jìn)行翻譯.故容器相比于虛擬機(jī)開銷較小,并且能夠提供很好的隔離性.經(jīng)過(guò)實(shí)驗(yàn)測(cè)試,在啟動(dòng)Docker不加載額外軟件時(shí),即只使用基本的系統(tǒng)鏡像,所占用的內(nèi)存僅有幾兆,甚至更少.因?yàn)镈ocker對(duì)于內(nèi)存的消耗主要是由于加載應(yīng)用程序,而不像虛擬機(jī)那樣需要額外提供給一些系統(tǒng)級(jí)的服務(wù).因此,對(duì)于一臺(tái)服務(wù)器來(lái)說(shuō),Docker能比虛擬機(jī)提供更多隔離的容器供用戶使用,這樣就大大提高了物理主機(jī)的利用效率.
表1 虛擬機(jī)和容器在性能上的比較Table 1 Comparison of performance of virtual machines and containers
虛擬機(jī)與容器在性能、隔離性、安全性、網(wǎng)絡(luò)和存儲(chǔ)上的不同之處如表1所示.本文使用Docker容器進(jìn)行VNF虛擬化部署.
Docker制作特定軟件鏡像主要有以下兩種方法:
1)直接在基礎(chǔ)鏡像上安裝軟件,然后使用Docker命令將其封裝成一個(gè)新的鏡像;
2)使用Dockerfile文件,拉取進(jìn)出系統(tǒng)鏡像后,讓鏡像根據(jù)Dockerfile文件的內(nèi)容自己編譯安裝.
兩種方法各有優(yōu)缺點(diǎn):
第一種方法的優(yōu)點(diǎn)是所有操作與真實(shí)操作一臺(tái)虛擬機(jī)一樣,無(wú)需重新學(xué)習(xí)其它新內(nèi)容;缺點(diǎn)是在部署這些鏡像時(shí),可能會(huì)由于所處環(huán)境的不同而需要重新修改部分內(nèi)容.
表2 direct方式計(jì)量器Table 2 Direct meter
第二種方法則只需要在部署時(shí)編寫Dockerfile文件,然后讓系統(tǒng)自己去拉取數(shù)據(jù),這樣能夠減少所需下載的內(nèi)容,且由于鏡像完全是按照Dockerfile文件的內(nèi)容來(lái)制作的,所以能夠減少人為的誤操作;但其缺點(diǎn)要學(xué)習(xí)配置Dockerfile文件.
表3 static方式計(jì)量器Table 3 Static meter
文中使用第2種方法來(lái)部署限速器,主要步驟如下:
1)下載基礎(chǔ)系統(tǒng)鏡像;
2)使用Dockerfile的內(nèi)建指令下載安裝軟件,包括P4的開發(fā)運(yùn)行環(huán)境;
3)使用Dockerfile內(nèi)建指令加載對(duì)應(yīng)的配置文件.
本文使用P4語(yǔ)言實(shí)現(xiàn)了一個(gè)VNF——限速器,限速器是有狀態(tài)的協(xié)議無(wú)關(guān)的,部署于Docker中運(yùn)行,Docker運(yùn)行在Ubuntu16.04系統(tǒng),電腦是聯(lián)想Y470,CPU是Intel(R) Core(TM) i5-2450M (2.50 GHz),內(nèi)存是8.00GB.下面將詳細(xì)描述系統(tǒng)實(shí)現(xiàn).
系統(tǒng)是在P4的開發(fā)環(huán)境下實(shí)現(xiàn)的,其中包括前端編譯器p4c-bmv2和一個(gè)模擬器behavioral-model.限速器的核心代碼編寫于meter.p4這個(gè)文件中,使用前端編譯器p4c-bmv2將meter.p4文件編譯成meter.json文件,使用模擬器behavioral-model加載配置文件meter.json到simple_switch模型中,就形成了一個(gè)限速器.
P4程序的開發(fā)就是模型和配置文件的開發(fā),模型是系統(tǒng)運(yùn)行的大框架,配置文件只是對(duì)這個(gè)模型進(jìn)行配置,形成具體功能的部件.由于限速器和交換機(jī)的功能模型類似,故使用了P4開發(fā)環(huán)境提供simple_switch模型.在后續(xù)復(fù)雜VNF的開發(fā)中,可能會(huì)使用更加復(fù)雜的模型,故定制模型的開發(fā)也是一個(gè)研究方向.
限速功能的實(shí)現(xiàn)主要采用P4語(yǔ)言的meter組件,該組件可以對(duì)match-action表的中的匹配項(xiàng)的速率進(jìn)行統(tǒng)計(jì).在meter組件中,有兩種工作方式,一種是direct,一種是static.
在direct方式中,對(duì)匹配表中的每一項(xiàng)都有一個(gè)計(jì)量器來(lái)記錄該匹配的交換速率,且速率是自動(dòng)更新的,不用單獨(dú)去調(diào)用函數(shù)執(zhí)行.該計(jì)量器根據(jù)設(shè)定的速率閾值返回一個(gè)2bit的二進(jìn)制數(shù),其中00表示為GREEN,01表示為YELLOW,10表示為RED.如表2所示,表中根據(jù)數(shù)據(jù)包的源IP地址進(jìn)行匹配,在表中列出了三個(gè)匹配項(xiàng),對(duì)于direct方式,會(huì)為這三個(gè)匹配項(xiàng)分別分配一個(gè)計(jì)量器,來(lái)統(tǒng)計(jì)該匹配項(xiàng)的交換速率.
而在static方式中,計(jì)量器只能在match-action表中的action中通過(guò)調(diào)用函數(shù)execute_meter 函數(shù)來(lái)執(zhí)行計(jì)量器的速率的更新,且不同的表不能調(diào)用同一個(gè)計(jì)量器.該計(jì)量器的是根據(jù)動(dòng)作的參數(shù)來(lái)分配計(jì)量器.如表3所示,計(jì)量器是以static方式工作,對(duì)于源地址為1.1.1.1和2.2.2.2的匹配項(xiàng),其動(dòng)作參數(shù)同為aa,故只分配meter[1]計(jì)量器對(duì)兩個(gè)匹配項(xiàng)一起進(jìn)行統(tǒng)計(jì)速率.
在限速器中,使用meter的這兩種方式實(shí)現(xiàn)了限速器端口限速和源IP地址限速.這兩種限速在實(shí)際的網(wǎng)絡(luò)中有著廣泛的應(yīng)用,起到保護(hù)網(wǎng)絡(luò)帶寬和網(wǎng)絡(luò)安全的作用.系統(tǒng)的架構(gòu)如圖4所示,系統(tǒng)運(yùn)行于容器Docker中,使用P4語(yǔ)言官方提供的交換模型,這里的交換模型包含處理數(shù)據(jù)包的各個(gè)功能執(zhí)行部件,有報(bào)頭解析、報(bào)文緩沖調(diào)度隊(duì)列、報(bào)文的match-action執(zhí)行等.而我們所做的事情是編寫P4文件,來(lái)定義要解析報(bào)文的格式、match-action表結(jié)構(gòu),文中實(shí)現(xiàn)了限速功能.將定義好的P4配置文件使用軟件p4c轉(zhuǎn)換成json文件,再將json文件加載到交換模型,就形成了限速器.最后將限速器部署于容器Docker中運(yùn)行.
圖4 系統(tǒng)結(jié)構(gòu)圖Fig.4 Architecture of system
圖5 端口限速,GREEN通過(guò)Fig.5 Port speed limit,GREEN pass
圖6 端口限速,GREEN和YELLOW通過(guò)Fig.6 Port speed limit,GREEN and YELLOW pass
圖7 地址限速,GREEN通過(guò)Fig.7 Address speed limit,GREEN pass
圖8 地址限速,GREEN和YELLOW通過(guò)Fig.8 Address speed limit,GREEN and YELLOW pass
圖9 混合限速,GREEN通過(guò)Fig.9 Mixed speed limit,GREEN pass
圖10 混合限速,GREEN和YELLOW通過(guò)Fig.10 Mixed speed limit,GREEN and YELLOW pass
當(dāng)前的限速只是對(duì)報(bào)文進(jìn)行簡(jiǎn)單的丟棄,在后續(xù)的工作中,將加入數(shù)據(jù)流的緩沖和整形,使限速更加友好.
本文實(shí)現(xiàn)的限速器主要有端口限速和根據(jù)源IP地址限速,其中源IP地址可以是一個(gè)網(wǎng)段.
構(gòu)建一個(gè)發(fā)包器向虛擬網(wǎng)口veth1發(fā)送源IP地址為1.1.1.1的報(bào)文,發(fā)送速率分別為1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.在虛擬網(wǎng)口veth3進(jìn)行流量監(jiān)測(cè).
①設(shè)定虛擬網(wǎng)口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,配置的規(guī)則為在GREEN狀態(tài)下通過(guò),YELLOW狀態(tài)和RED狀態(tài)下丟棄.測(cè)試結(jié)果如圖5所示,最大速率為8MB/s.
②設(shè)定虛擬網(wǎng)口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,配置的規(guī)則為在GREEN狀態(tài)和YELLOW狀態(tài)下通過(guò),在RED狀態(tài)下丟棄.測(cè)試結(jié)果如圖6所示,最大速率為12MB/s.
發(fā)包器向虛擬網(wǎng)口veth1發(fā)送源IP地址為1.1.1.1的報(bào)文,速率分別為1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.
①設(shè)定根據(jù)源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規(guī)則為在GREEN狀態(tài)下通過(guò),YELLOW狀態(tài)和RED狀態(tài)下丟棄.測(cè)試結(jié)果如圖7所示,最大速率為6MB/s.
②設(shè)定根據(jù)源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規(guī)則為在GREEN狀態(tài)和YELLOW狀態(tài)下通過(guò),在RED狀態(tài)下丟棄.測(cè)試結(jié)果如圖8所示,最大速率為14MB/s.
發(fā)包器向虛擬網(wǎng)口veth1發(fā)送源IP地址為1.1.1.1的報(bào)文,速率分別為1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.
①設(shè)定虛擬網(wǎng)口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,設(shè)定根據(jù)源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規(guī)則為在GREEN狀態(tài)下通過(guò),YELLOW狀態(tài)和RED狀態(tài)下丟棄.測(cè)試結(jié)果如圖9所示,最大速率為6MB/s.
②設(shè)定虛擬網(wǎng)口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,設(shè)定根據(jù)源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規(guī)則為在GREEN狀態(tài)和YELLOW狀態(tài)下通過(guò),在RED狀態(tài)下丟棄.測(cè)試結(jié)果如圖10所示,最大速率為12MB/s.
無(wú)論是數(shù)據(jù)中心、企業(yè)網(wǎng)或是運(yùn)營(yíng)商,對(duì)于MiddleBox都要求可靈活配置、方便管理、支持協(xié)議擴(kuò)展,而目前市場(chǎng)上大多數(shù)都是基于硬件的MiddleBox,不能很好的滿足應(yīng)用需求.所以,本文提出了一種基于P4語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)的有狀態(tài)的虛擬網(wǎng)絡(luò)功能(VNF).該VNF是協(xié)議無(wú)關(guān)的,支持協(xié)議的擴(kuò)展.同時(shí),網(wǎng)絡(luò)功能設(shè)備的一些控制功能(如端口的狀態(tài)、端口的速率等)可以從VNF的控制平面卸載到數(shù)據(jù)平面,這樣既可以提高控制的效率,又可以減少控制平面和數(shù)據(jù)平面的頻繁通信.數(shù)據(jù)流在數(shù)據(jù)平面處理的過(guò)程中,都是從一個(gè)處理模塊到另一個(gè)模塊進(jìn)行處理,每次處理的結(jié)果都可以看成是數(shù)據(jù)流的一個(gè)處理狀態(tài),特別是有些流的處理是根據(jù)其他流的狀態(tài)進(jìn)行觸發(fā)的,故記錄數(shù)據(jù)流的狀態(tài)以及狀態(tài)的轉(zhuǎn)換顯得非常重要.然而P4語(yǔ)言的工作方式為match-action模式,無(wú)法實(shí)現(xiàn)復(fù)雜的網(wǎng)絡(luò)功能,故在VNF實(shí)現(xiàn)中采用擴(kuò)展有限狀態(tài)機(jī)的方法,用于實(shí)現(xiàn)數(shù)據(jù)流狀態(tài)的轉(zhuǎn)換.通過(guò)這種擴(kuò)展有限狀態(tài)機(jī)的方法可實(shí)現(xiàn)那些根據(jù)流狀態(tài)進(jìn)行行為轉(zhuǎn)發(fā)的網(wǎng)絡(luò)功能(如防火墻、負(fù)載均衡器、限速器和ddos防御等).但在P4語(yǔ)言中,所實(shí)現(xiàn)的字段匹配大都是報(bào)文頭部的字段匹配,對(duì)于負(fù)載的處理較少,故對(duì)于一些報(bào)文負(fù)載檢測(cè)的功能(如深度報(bào)文檢測(cè))無(wú)法在數(shù)據(jù)平面直接實(shí)現(xiàn),可將其提交到控制平面進(jìn)行處理,或是擴(kuò)展P4語(yǔ)言的方法類庫(kù),以支持報(bào)文負(fù)載的處理.我們將設(shè)計(jì)好的VNF部署在輕量級(jí)容器Docker中,因?yàn)槭褂肈ocker可以使得物理主機(jī)的資源利用效率更高,且部署于Docker當(dāng)中,方便VNF的移植.
在后續(xù)的工作中,我們將設(shè)計(jì)實(shí)現(xiàn)更多的VNF,將其作為一個(gè)個(gè)模塊,建立一個(gè)軟件定義的MiddleBox平臺(tái).用戶在平臺(tái)上根據(jù)自身的需求對(duì)VNF進(jìn)行定制.如用戶需要防火墻和入侵檢測(cè)兩個(gè)功能,那他就可以使用這兩個(gè)功能的VNF模塊進(jìn)行定制,在平臺(tái)上統(tǒng)一管理.若后期需要增加一個(gè)NAT功能,只需在原來(lái)的基礎(chǔ)上再增添一個(gè)NAT模塊.當(dāng)然,構(gòu)建這樣的MiddleBox平臺(tái),就要考慮不同VNF Docker之間的通信等問(wèn)題.