摘 要:當今,隨著網絡規模的擴大和網絡復雜性的增大,虛擬網絡的應用越來越廣泛,虛擬網絡的平臺也越來越多的進入各個數據中心或實驗網絡環境中。OpenvSwitch是一個由Nicira Networks發起的開源項目,通過運行在虛擬化平臺上的虛擬交換機,為物理主機/服務器上的VM提供虛擬網絡服務功能。網絡管理員通過OpenvSwitch可以構建虛擬網,但虛擬網絡可能會產生二層環路的問題,OpenvSwitch原有的避免二層環路的方式會在網絡中產生多余的流量,本文分析了虛擬網絡中二層環路的產生原因,提出了改進的避免二層環路的方式,解決了網絡中多余流量的問題。
關鍵詞:計算機網絡 虛擬網絡 OpenvSwitch 二層環路
中圖分類號 : TP393 文獻標識碼:A 文章編號:1672-3791(2014)01(A)-0000-00
Open vSwitch基于開源Apache2.0許可下的多層虛擬交換平臺,旨在通過可編程擴展,實現大規模網絡的自動化(配置、管理、維護)。OpenvSwitch通過運行在虛擬化平臺上,為物理主機/服務器上的VM提供二層網絡接入和多層網絡交換功能。虛擬交換機與云中的其它物理交換機一樣工作。Open vSwitch充分考慮了在不同虛擬化平臺間的移植性,采用平臺無關的C語言開發。它支持現有標準管理接口和協議(如netFlow、sFlow、SPAN、RSPAN、CLI、LACP、802.1ag等),熟悉物理網絡維護的管理員可以毫不費力地通過Open vSwitch進行虛擬網絡管理[1]。
正因為OpenvSwitch具有如此多的優勢,它在實際的應用中越來越廣泛。當應用OpenvSwitch構建虛擬網絡時,可能會在虛擬網絡之間出現二層環路問題,OpenvSwitch默認的方式采用STP生成樹協議來避免,但是這種方式會產生流量冗余的問題。本文分析了OpenvSwitch產生二層環路的原因,指出了OpenvSwitch采用STP生成樹協議避免二層環路時所產生的問題,提出了改進OpenvSwitch避免二層環路的方式,解決了流量冗余的問題。
1 OpenvSwitch產生的二層環路
1.1 OpenvSwitch端口類型
OpenvSwitch中定了幾種類型的端口,這些端口的類型和作用如下:
1)netdev_port:真實的網絡設備,提供對外數據通信的功能;
2)inter_dev:由OpenvSwitch實現的內部網絡設備,在OVS內部進行數據交換;
3)tunnel_port:由OpenvSwitch實現的用于封裝數據包的端口,進行vxlan/gre封裝。
1.2 二層環路產生的原因
本文利用OpenvSwitch構建虛擬網絡是通過VXLAN格式封裝實現的。網絡虛擬邊緣節點(Network Virtual Edge,NVE)上運行虛擬機(VM),不同的VM之間的通信采用VXLAN隧道封裝的格式,VXLAN的封裝與解封裝都是由NVE完成。當VM首次通信時,會發出ARP廣播幀,ARP廣播幀會在不同的NVE之間相互傳遞。
組建由三臺NVE構成的網絡,NVE1、NVE2和NVE3分別位于不同的網絡段,但它們上面的VM屬于同一個VN網絡。假設NVE1中的虛擬機VM1要與VNE2中的虛擬機VM4通信。
NVE1發送由VXLAN封裝的原始ARP幀,當到達目的NVE(如NVE3)后,首先由netdev_port接收,然后送給inter_dev處理,隨后到達tunnel_port進行解封裝。Tunnel_port解封裝后,將原始的ARP廣播幀在各個端口進行廣播,因而tunnel_port會再次對其進行VXLAN封裝,目的NVE為除去發送此幀的NVE2。
經過以上過程的重復,由VXLAN封裝的ARP請求幀構成了二層環路。
端口的不適當封裝是產生二層環路的原因。NVE接收到的VXLAN封裝ARP廣播幀再次封裝后發送給其他的NVE,因而這些操作會導致網絡產生由VXLAN封裝的ARP廣播風暴。
2 OpenvSwitch默認消除環路的方式
Openvswitch默認提供消除環路的方法是采用STP生成樹協議,通過創建生成樹來避免二層環路,然而這可能在網絡中產生多余的流量。
STP的原理是通過在交換機之間傳遞報文網橋協議數據單元(BPDU)來確定網絡的拓撲結構。
STP將網絡拓撲看成是一個樹,樹的根是稱為根橋的橋設備,根橋的確立是由交換機或網橋的BID(Bridge ID)確定的。經過報文交換后,STP選舉出根橋,根橋不會對收到數據包進行轉發,因而可以消除二層環路。
在上述情形中,無論選舉出來的根網橋是哪個NVE,都會產生冗余的數據包。盡管消除了二層環路,但是網絡中產生了多余的流量。
3 改進OpenvSwitch避免二層環路的方式
既然引起二層環路的原因是從tunnel_port端口發出的ARP廣播幀被再次送入此端口進行VXLAN封裝,因而避免環路的方式是避免從tunnel_port端口發出的數據包第二次進入此端口。
改進的方式是數據包在tunnel_port端口發出的時候添加標志位。當tunnel_port端口接收數據包的時候對標志位進行判斷,如果標志位為真,說明此數據包已經被封裝過,則端口丟棄;如果標識為假,說明此數據包第一次被封裝,則對數據包VXLAN封裝后發送。
4 結論
本文首先給出了在虛擬網絡中應用OpenvSwitch可能產生的二層環路問題,隨后分析了OpenvSwitch默認消除二層環路的方式,即OpenvSwitch采用STP生成樹協議來避免二層環路,但這種方式可能會造成冗余的網絡流量。本文在分析了二層環路產生原因的基礎上,改進了OpenvSwitch避免二層環路的方式,采用端口過濾的方式從根本上避免了二層環路,并且不會產生多余的流量。
參考文獻
[1] 丁順,李明祿,翁楚良,劉謙. 一種基于虛擬機的安全監測方法[J]. 計算機應用與軟件. 2012(06)
[2] 劉謙,駱源,翁楚良,李明祿. 基于可信平臺模塊的虛擬機安全協議[J]. 信息安全與技術. 2010(06)
[3][日]竹下隆史,村山公保,荒井透.圖解TCP/IP.北京:人民郵電出版社.2013