茍建國,呂高鋒,邱為好,孫志剛
(國防科技大學 計算機學院,長沙 410073)
MiddleBox在數據中心、運營商和企業網中起著重要的作用.主要承擔網絡性能、監控等任務,實際應用的MiddleBox有,起地址轉換作用的地址轉換器(NAT)、負載均衡器和起安全作用的網絡入侵檢測系統(NIDS)與網絡入侵防護系統(NIPS).然而,現在的MiddleBox大多是基于定制的ASICs實現的.這些ASIC的功能在設計時就已經確定,而基于ASIC開發的MiddleBox若需要添加新的功能,就需要選取新的ASIC.若市場上沒有ASIC支持新的功能,就需要重新定制ASIC,而ASIC的開發周期相對較長,這就降低了MiddleBox的市場競爭力.且由于使用定制的ASIC,MiddleBox功能的擴展性較差.因為網絡中使用的MiddleBox由不同的廠商開發,使用的標準和協議各不相同,導致很難統一管理這些MiddleBox,這樣無形加大了網絡維護人員的工作難度.
為了解決上面提出的問題,可以考慮使用網絡功能虛擬化,通過軟件來實現原來基于硬件的MiddleBox的功能,并且這些MiddleBox運行在通用的硬件上(如X86服務器),這樣避免了專有硬件的開發,提高了MiddleBox的通用性.網絡功能的實現可以使用多種語言,如有使用基于C語言的Click組件進行MiddleBox開發的,而本文中使用P4語言,主要是由于使用P4語言可以編寫協議無關的數據包處理器,這是由P4語言的運行機制所決定的,這就為MiddleBox支持協議無關提供了可能.且使用P4語言開發,代碼簡短,并支持代碼重用,可以提高開發效率.
在MiddleBox的研究中,為實現虛擬化,很多研究都選擇將MiddleBox部署在虛擬機中,而本文中使用更加輕量級的Docker,以提高物理主機資源的利用率,同時方便MiddleBox移植.
為驗證方案的可行性,本文使用P4語言實現了一個部署于Docker中運行的限速器,該限速器是協議無關的,并對功能進行了測試.
近年來,MiddleBox的研究是一個比較熱的方向.主要針對MiddleBox的可編程性、可擴展性進行研究.
在xOMB[1]中,設計實現了一個運行在通用服務器和操作系統上的,具有擴展功能的MiddleBox.它使用可編程的流水線來進行網絡包處理,這些流水線由xOMB自身提供的模塊和用戶自定義的C++模塊為實現某一功能而構建,對功能的添加就是對處理流水線的重新構造和添加.每一個功能(如負載均衡交換、NAT)對應一個處理流水線.每個處理流水線對應一個功能模塊的組成序列.然而在xOMB中,不能將多個網絡功能應用于同一個處理流水線.
OpenBox[2]解耦了MiddleBox的控制平面和數據平面,將MiddleBox數據平面數據處理的過程劃分為不同的階段,并對不同的MiddleBox的處理階段進行統一,實現了一個統一的流水處理過程.但它的數據平面工作在特有的硬件上,仍然存在基于硬件實現MiddleBox的缺點.
ClickOS[3]中實現了一個高性能的虛擬化的軟件MiddleBox平臺,并實現了防火墻、NAT和負載均衡三個MiddleBox,每個MiddleBox部署在一個對應的虛擬機中,雖然他對虛擬機中的系統進行了裁剪,對通信接口進行了簡化,但這種方式的部署所花費的代價仍然很大,不如部署在更加輕量級的Docker[4]中,故本文實現的VNF部署于Docker中.
OpenState[5]使用擴展有限狀態機的方法實現了交換機有狀態數據平面編程抽象,這種有限狀態機的方法同樣可用在MiddleBox的開發中,對于數據包的處理可以通過查看狀態表來確定處理的動作.這種方法的難點在于確定問題的有限狀態.有狀態方法的另一個問題是將狀態和網絡功能關聯在一起,將狀態關聯于一個單獨的網絡功能實例限制了其彈性、靈活性以及應對多路徑路由、軟件更新等應用的能力[6].
SPDA[7]也實現了有狀態的數據平面的轉發,它的出發點主要是OpenFlow[8]的工作方式為match-action,不能實現復雜的網絡應用,故采用match-state-action的模式來實現有狀態的數據平面的數據轉發.由于P4語言的工作方式和OpenFlow的相似,故也可以采用這種模式來實現網絡功能.

圖1 解析協議狀態圖Fig.1 State graph of parsing the protocol
AVANT-GUARD[9]針對軟件定義網絡(SDN)控制平面和數據平面分離存在的denial-of-service (Dos) 攻擊進行分析,提出了connection migration 和actuating triggers方法,這些方法的實質還是使用了狀態的轉換.
另一個相關工作是P4可編程包處理語言,使用P4[10-13]語言可設計協議無關的數據包處理器,而對于MiddleBox來說,實現協議無關是其一個重要的目標.故本文采用P4語言來實現MiddleBox功能.P4中提供了基本的數據包的處理,但是對于復雜功能的VNF的開發實現相對比較困難,故使用擴展有限狀態機的方法來實現VNF的復雜功能.
為了實現MiddleBox的可擴展性、可編程性,本文使用P4語言實現了一個有狀態的VNF——限速器,擴展了P4語言的match-action工作模式為match-state-action模式,為實現復雜MiddleBox數據平面的數據轉發提供了方法.并將實現的VNF部署于容器Docker中,方便VNF的移植,且提高了物理主機的資源利用率.與其它MiddleBox相比,本系統實現了協議無關、可重配置,同時部署于Docker容器中,有較高資源利用率,且方便系統移植.
在數據中心中,通過構建虛擬網絡功能,使原本運行于特定硬件的網絡功能運行于通用硬件設備上,解耦了網絡功能和硬件的關聯.下面詳細闡述系統設計.

圖2 限速器狀態轉換圖Fig.2 State transition graph of the speed limiter
由于網絡技術的不斷發展,數據中心中所支持的協議也不斷增多,若針對特定的協議集進行協議相關的設計,當增加新協議的支持時,就要對系統進行升級或重新設計,可擴展性較差.所以本文中設計協議無關的虛擬網絡功能.
選用P4語言進行系統的開發,是因為P4語言可實現協議無關數據包處理器.P4語言的構成主要分為五個部分,即頭部、解析器、表、動作和流控制程序.解析器采用了有限狀態機的設計思想.如圖1所示,每一個節點可以看成是一種狀態,當要增加一個新協議時,假如為VXLAN協議,只需增加一個狀態,也就是增加一個解析器,在圖中就是實心圓圈的節點.在P4解析器解析數據包之前,解析器并不知道該數據包使用哪種協議,只有當解析器解析完數據包后,才確定其采用何種協議.在解析過程中,提取數據包頭的數據字段,數據字段的抽取可根據需求提取,同時又定義了大量的match-action表,執行匹配操作.通過這兩點實現協議無關.
在P4語言中,雖然使用match+action可以實現一般的數據平面的數據的處理,但是對于一些復雜的網絡功能(有狀態的防火墻、負載均衡、NAT等)就不太容易實現,因為在P4中沒有相關的狀態模塊,故引入了擴展有限狀態機方法,實現網絡功能狀態的轉換.
擴展有限狀態機(EFSM)是一種常用的軟件形式規格說明,由多個狀態及狀態之間的遷移構成.一個EFSM規格說明可以用—個六元組(S0,S,V,I,O,T)來表示.其中:S0是初始狀態,S是狀態的集合,V是變量的集合,I是輸入值的集合,O是輸出值的集合,T是遷移的集合.T中每個遷移t又可表示成一個五元組
,其中:head(t)是遷移t的初始狀態,tail(t)是其結束狀態;event(t)為遷移t上的輸入事件;condition(t)為遷移t執行的前提條件;action(t)為一系列的操作動作,表明當event(t)事件出現時,若condition(t)成立,則遷移t從head(t)狀態變遷到tail(t)狀態,并執行action(t)中的相應語句.例如,本文實現的VNF實例——限速器,它的狀態轉換如圖2所示,限速器包含三個狀態,GREEN、YELLOW和RED.當傳輸速率小于閾值threshold1,限速匹配項的狀態就是GREEN狀態,當速率在閾值threshold1和threshold2之間的事件發生時,狀態由GREEN變為YELLOW,并執行動作action2().在YELLOW狀態下產生速率大于threshold2事件,則匹配項狀態變為RED,并執行action3().匹配項從狀態RED到YELLOW,再到GREEN的轉換同GREEN到YELLOW和RED的狀態變化.
為方便狀態管理,系統分兩個不同的表(狀態表和擴展有限狀態機表),狀態表主要用于查詢匹配項的當前狀態,擴展有限狀態機表主要用于匹配項狀態的轉換查詢,根據匹配項當前狀態和觸發事件確定該匹配項的下一狀態和執行的動作.
在處理數據包的過程中,主要步驟可以分為以下三步:
1)狀態查詢
狀態查詢主要查詢狀態表,根據關鍵字進行匹配,查詢該匹配的狀態.
2)狀態轉換
根據狀態查詢階段查詢到的狀態,結合觸發的事件,查詢擴展有限狀態機表,確定匹配項的要執行的動作和下一個狀態.
3)狀態更新
重寫狀態表,替換匹配項的舊狀態成新狀態.
例如,本文實現的限速器,實現了狀態表和擴展有限狀態機表,如圖3所示.假設當前來了一個源IP地址為1.1.1.1的數據包,查詢狀態表,可得到該IP地址的對應的狀態為GREEN,若此時速率計數器中的速率在閾值threshold1和threshold2之間,查詢擴展有限狀態機表,確定該數據包執行action2動作,并更新狀態表中源IP地址為1.1.1.1的狀態為YELLOW.

圖3 包處理狀態轉換Fig.3 State transition of Packet processing
傳統的虛擬化技術對物理主機的資源利用率無法達到物理主機的水平.且傳統的虛擬化技術配置文件不靈活,難以進行自動化創建、部署.而與之相對應的一個概念是容器.容器的思想就是把一個進程(包括其所有子進程)獨立打成一個包,而不影響在系統中運行的其他進程.容器是基于共享Linux內核的一種虛擬化技術.容器中的進程所運行的環境是獨立于物理主機操作系統的,當容器啟動的時,也僅是通過進程間的調度,而不需要引導整個系統,從而提高了效率.Docker則是一種更輕量級的虛擬化容器技術,具有易使用、方便移植、可跨平臺等優勢.同時,Docker能夠進行快速、標準化封裝應用程序并自動化部署整個運行環境.
虛擬主機技術能使得一臺物理主機同時運行多個操作系統,且操作系統的類型不同,物理主機系統稱為 Host OS,而在虛擬機中安裝的操作系統則稱為Guest OS.每個Guest OS都有自己的計算、存儲和網絡組件,這些可以通過硬件虛擬化而來,或者Host OS通過把 Guest OS的指令翻譯成物理機指令來實現.從理論上來說,Guest OS可以是任何一種操作系統,與底層的Host OS無關.
容器則是可以看成是一種輕量級的操作系統,它運行在物理主機系統之上,直接使用物理主機的CPU指令,而不需要像虛擬機那樣要對指令進行翻譯.故容器相比于虛擬機開銷較小,并且能夠提供很好的隔離性.經過實驗測試,在啟動Docker不加載額外軟件時,即只使用基本的系統鏡像,所占用的內存僅有幾兆,甚至更少.因為Docker對于內存的消耗主要是由于加載應用程序,而不像虛擬機那樣需要額外提供給一些系統級的服務.因此,對于一臺服務器來說,Docker能比虛擬機提供更多隔離的容器供用戶使用,這樣就大大提高了物理主機的利用效率.

表1 虛擬機和容器在性能上的比較Table 1 Comparison of performance of virtual machines and containers
虛擬機與容器在性能、隔離性、安全性、網絡和存儲上的不同之處如表1所示.本文使用Docker容器進行VNF虛擬化部署.
Docker制作特定軟件鏡像主要有以下兩種方法:
1)直接在基礎鏡像上安裝軟件,然后使用Docker命令將其封裝成一個新的鏡像;
2)使用Dockerfile文件,拉取進出系統鏡像后,讓鏡像根據Dockerfile文件的內容自己編譯安裝.
兩種方法各有優缺點:
第一種方法的優點是所有操作與真實操作一臺虛擬機一樣,無需重新學習其它新內容;缺點是在部署這些鏡像時,可能會由于所處環境的不同而需要重新修改部分內容.

表2 direct方式計量器Table 2 Direct meter
第二種方法則只需要在部署時編寫Dockerfile文件,然后讓系統自己去拉取數據,這樣能夠減少所需下載的內容,且由于鏡像完全是按照Dockerfile文件的內容來制作的,所以能夠減少人為的誤操作;但其缺點要學習配置Dockerfile文件.

表3 static方式計量器Table 3 Static meter
文中使用第2種方法來部署限速器,主要步驟如下:
1)下載基礎系統鏡像;
2)使用Dockerfile的內建指令下載安裝軟件,包括P4的開發運行環境;
3)使用Dockerfile內建指令加載對應的配置文件.
本文使用P4語言實現了一個VNF——限速器,限速器是有狀態的協議無關的,部署于Docker中運行,Docker運行在Ubuntu16.04系統,電腦是聯想Y470,CPU是Intel(R) Core(TM) i5-2450M (2.50 GHz),內存是8.00GB.下面將詳細描述系統實現.
系統是在P4的開發環境下實現的,其中包括前端編譯器p4c-bmv2和一個模擬器behavioral-model.限速器的核心代碼編寫于meter.p4這個文件中,使用前端編譯器p4c-bmv2將meter.p4文件編譯成meter.json文件,使用模擬器behavioral-model加載配置文件meter.json到simple_switch模型中,就形成了一個限速器.
P4程序的開發就是模型和配置文件的開發,模型是系統運行的大框架,配置文件只是對這個模型進行配置,形成具體功能的部件.由于限速器和交換機的功能模型類似,故使用了P4開發環境提供simple_switch模型.在后續復雜VNF的開發中,可能會使用更加復雜的模型,故定制模型的開發也是一個研究方向.
限速功能的實現主要采用P4語言的meter組件,該組件可以對match-action表的中的匹配項的速率進行統計.在meter組件中,有兩種工作方式,一種是direct,一種是static.
在direct方式中,對匹配表中的每一項都有一個計量器來記錄該匹配的交換速率,且速率是自動更新的,不用單獨去調用函數執行.該計量器根據設定的速率閾值返回一個2bit的二進制數,其中00表示為GREEN,01表示為YELLOW,10表示為RED.如表2所示,表中根據數據包的源IP地址進行匹配,在表中列出了三個匹配項,對于direct方式,會為這三個匹配項分別分配一個計量器,來統計該匹配項的交換速率.
而在static方式中,計量器只能在match-action表中的action中通過調用函數execute_meter 函數來執行計量器的速率的更新,且不同的表不能調用同一個計量器.該計量器的是根據動作的參數來分配計量器.如表3所示,計量器是以static方式工作,對于源地址為1.1.1.1和2.2.2.2的匹配項,其動作參數同為aa,故只分配meter[1]計量器對兩個匹配項一起進行統計速率.
在限速器中,使用meter的這兩種方式實現了限速器端口限速和源IP地址限速.這兩種限速在實際的網絡中有著廣泛的應用,起到保護網絡帶寬和網絡安全的作用.系統的架構如圖4所示,系統運行于容器Docker中,使用P4語言官方提供的交換模型,這里的交換模型包含處理數據包的各個功能執行部件,有報頭解析、報文緩沖調度隊列、報文的match-action執行等.而我們所做的事情是編寫P4文件,來定義要解析報文的格式、match-action表結構,文中實現了限速功能.將定義好的P4配置文件使用軟件p4c轉換成json文件,再將json文件加載到交換模型,就形成了限速器.最后將限速器部署于容器Docker中運行.

圖4 系統結構圖Fig.4 Architecture of system

圖5 端口限速,GREEN通過Fig.5 Port speed limit,GREEN pass

圖6 端口限速,GREEN和YELLOW通過Fig.6 Port speed limit,GREEN and YELLOW pass

圖7 地址限速,GREEN通過Fig.7 Address speed limit,GREEN pass

圖8 地址限速,GREEN和YELLOW通過Fig.8 Address speed limit,GREEN and YELLOW pass

圖9 混合限速,GREEN通過Fig.9 Mixed speed limit,GREEN pass

圖10 混合限速,GREEN和YELLOW通過Fig.10 Mixed speed limit,GREEN and YELLOW pass
當前的限速只是對報文進行簡單的丟棄,在后續的工作中,將加入數據流的緩沖和整形,使限速更加友好.
本文實現的限速器主要有端口限速和根據源IP地址限速,其中源IP地址可以是一個網段.
構建一個發包器向虛擬網口veth1發送源IP地址為1.1.1.1的報文,發送速率分別為1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.在虛擬網口veth3進行流量監測.
①設定虛擬網口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,配置的規則為在GREEN狀態下通過,YELLOW狀態和RED狀態下丟棄.測試結果如圖5所示,最大速率為8MB/s.
②設定虛擬網口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,配置的規則為在GREEN狀態和YELLOW狀態下通過,在RED狀態下丟棄.測試結果如圖6所示,最大速率為12MB/s.
發包器向虛擬網口veth1發送源IP地址為1.1.1.1的報文,速率分別為1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.
①設定根據源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規則為在GREEN狀態下通過,YELLOW狀態和RED狀態下丟棄.測試結果如圖7所示,最大速率為6MB/s.
②設定根據源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規則為在GREEN狀態和YELLOW狀態下通過,在RED狀態下丟棄.測試結果如圖8所示,最大速率為14MB/s.
發包器向虛擬網口veth1發送源IP地址為1.1.1.1的報文,速率分別為1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.
①設定虛擬網口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,設定根據源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規則為在GREEN狀態下通過,YELLOW狀態和RED狀態下丟棄.測試結果如圖9所示,最大速率為6MB/s.
②設定虛擬網口veth1的限速閾值threshold1=8MB/s,threshod2=12MB/s,設定根據源IP地址限速的閾值threshold3=6MB/s,threshold4=14MB/s,配置的規則為在GREEN狀態和YELLOW狀態下通過,在RED狀態下丟棄.測試結果如圖10所示,最大速率為12MB/s.
無論是數據中心、企業網或是運營商,對于MiddleBox都要求可靈活配置、方便管理、支持協議擴展,而目前市場上大多數都是基于硬件的MiddleBox,不能很好的滿足應用需求.所以,本文提出了一種基于P4語言設計實現的有狀態的虛擬網絡功能(VNF).該VNF是協議無關的,支持協議的擴展.同時,網絡功能設備的一些控制功能(如端口的狀態、端口的速率等)可以從VNF的控制平面卸載到數據平面,這樣既可以提高控制的效率,又可以減少控制平面和數據平面的頻繁通信.數據流在數據平面處理的過程中,都是從一個處理模塊到另一個模塊進行處理,每次處理的結果都可以看成是數據流的一個處理狀態,特別是有些流的處理是根據其他流的狀態進行觸發的,故記錄數據流的狀態以及狀態的轉換顯得非常重要.然而P4語言的工作方式為match-action模式,無法實現復雜的網絡功能,故在VNF實現中采用擴展有限狀態機的方法,用于實現數據流狀態的轉換.通過這種擴展有限狀態機的方法可實現那些根據流狀態進行行為轉發的網絡功能(如防火墻、負載均衡器、限速器和ddos防御等).但在P4語言中,所實現的字段匹配大都是報文頭部的字段匹配,對于負載的處理較少,故對于一些報文負載檢測的功能(如深度報文檢測)無法在數據平面直接實現,可將其提交到控制平面進行處理,或是擴展P4語言的方法類庫,以支持報文負載的處理.我們將設計好的VNF部署在輕量級容器Docker中,因為使用Docker可以使得物理主機的資源利用效率更高,且部署于Docker當中,方便VNF的移植.
在后續的工作中,我們將設計實現更多的VNF,將其作為一個個模塊,建立一個軟件定義的MiddleBox平臺.用戶在平臺上根據自身的需求對VNF進行定制.如用戶需要防火墻和入侵檢測兩個功能,那他就可以使用這兩個功能的VNF模塊進行定制,在平臺上統一管理.若后期需要增加一個NAT功能,只需在原來的基礎上再增添一個NAT模塊.當然,構建這樣的MiddleBox平臺,就要考慮不同VNF Docker之間的通信等問題.