打開 vSwitch 數據路徑和 linux 網橋
我試圖了解 Open vSwitch 如何利用 linux 基礎架構的內部機制,特別是 OVS 網橋和 br-xx(linux 網橋)之間的區別。我是這個領域的新手,所以我可能在很多方面都錯了。
背景:到目前為止,我知道要創建虛擬網路,可以使用網路命名空間來模擬主機(網路的端點),並且可以使用 veth 對作為連接兩個節點的連結。此外,使用 iproute2 包,可以設置網橋(br-xx)並向其添加虛擬介面,從而完成虛擬網路。
為了了解 OVS 網橋和 linux 網橋(由 iproute2 創建)之間的區別,我瀏覽了 mininet 程式碼。我可以弄清楚的一件事是 mininet 依賴 ovs-vsctl 來創建 OVS 網橋。我探索了 OVS 程式碼,以弄清楚它們實際上是如何設置的,以及它們與 linux 網橋有何不同,但沒有取得多大成功。
問題:OVS 網橋(使用 ovs-vsctl 創建)和 linux 網橋(使用 iproute2 創建)在內部有何不同?我直覺地感覺它們都基於兩個不同的核心模組在後面(在Open vSwitch的上下文中它稱為datapath,不確定linux橋的核心模組的名稱)。我的直覺對嗎?如果是,我如何創建自己的核心模組並使用它作為“後端”建立一個橋接器?
在這里分享一些理解,這可能不像你想的那麼低層次,因為我沒有在這個層次/方面投入太多精力。
首先,Linux 橋接器依賴核心堆棧進行簡單的 L2 轉發。換句話說:根據映射規則轉發數據包
src_mac
,in_port
儲存在系統ARP記憶體中。列出轉發規則(映射)
iproute2
:$ ip neigh show 192.168.157.2 dev ens33 lladdr f0:50:54:fd:b2:34 STALE 192.168.157.254 dev ens33 lladdr f0:50:54:fd:b2:34 STALE
使用老式(但列印精美)
arp
命令:$ arp -n Address HWtype HWaddress Flags Mask Iface 192.168.157.2 ether f0:50:54:fd:b2:34 C ens33 192.168.157.254 ether f0:50:54:fd:b2:34 C ens33
此外,所有正常網路工具都可以在 Linux 網橋上的設備(veth pair、tun/tap)上執行良好。
相比之下,OVS 維護自己的轉發表和轉發規則,分別稱為
flow table
和flow
。一旦數據包進入 OVS 網橋,它將與流(規則)匹配,然後執行規則中指定的操作。這種轉發機制更加靈活、可擴展,最重要的是——可程式。以下面流表中的第二條規則為例:
$ ovs-ofctl dump-flows br-int NXST_FLOW reply (xid=0x4): cookie=0x9661, duration=8986958.206s, table=0, n_packets=2285, n_bytes=82852, idle_age=0, hard_age=65534, priority=1 actions=NORMAL cookie=0x9661, duration=2944224.063s, table=0, n_packets=148, n_bytes=32018, idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=18 actions=mod_vlan_vid:43,NORMAL cookie=0x9661, duration=8986823.648s, table=0, n_packets=9151, n_bytes=17148, idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=21 actions=mod_vlan_vid:7,NORMAL
in_port=1
匹配標準:來自埠 1 ( ) 和 vlan 標籤 18 (dl_vlan=18
)的入口數據包(到此 OVS 網橋)- 行動:修改數據包的vlan標籤為43( ),然後在這個OVS網橋()內
mod_vlan_vid=43
進行正常的L2轉發()NORMAL``br-int
相應
src_mac:in_port
的映射也儲存在它自己的fdb
(轉發數據庫)中:$ ovs-appctl fdb/show br-int port VLAN MAC Age 1 5 fb:26:3f:e8:1e:1c 298 1 8 fb:26:3f:b7:26:55 297
具體來說,如果流表中沒有指定其他規則,OVS 網橋將遵循預設規則 (
action=NORMAL
),該規則執行正常的 L2 轉發,就像普通的 Linux 網橋一樣。其次,隨著 OVS 從核心堆棧中提升數據包,因此依賴於核心堆棧的網路工具可能會停止在 OVS 設備(埠)上工作,例如無法
tcpdump
擷取 OVS 上的任何數據包patch port
,並且iptables
規則將無法在 OVS 埠上工作任何一個。第三,關於實現:Linux橋接器非常直接,可能是核心堆棧中最早的網路設備之一,並且只有數百行程式碼,請查看Kernel 5.1中的程式碼。相反,OVS 程式碼要復雜得多,因為它要處理很多事情,才能像可程式、強大、高效和全功能的 OpenFlow 交換機一樣工作。如果您想快速了解一下,請查看早期版本(功能較少)。