天天看點

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

上一節我們完成了 OVS vlan 環境的搭建,目前拓撲結構如下:

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

cirros-vm1 位于控制節點,屬于 vlan100。

cirros-vm2 位于計算節點,屬于 vlan100。

cirros-vm3 位于計算節點,屬于 vlan101。

今天詳細分析 OVS 如何實作 vlan100 和 vlan101 的隔離。

與 Linux Bridge driver 不同,Open vSwitch driver 并不通過 eth1.100, eth1.101 等 VLAN interface 來隔離不同的 VLAN。

所有的 instance 都連接配接到同一個網橋 br-int,

Open vSwitch 通過 flow rule(流規則)來指定如何對進出 br-int 的資料進行轉發,進而實作 vlan 之間的隔離。

具體來說:當資料進出 br-int 時,flow rule 可以修改、添加或者剝掉資料包的 VLAN tag,

Neutron 負責建立這些 flow rule 并将它們配置到 br-int,br-eth1 等 Open vSwitch 上。

下面我們就來研究一下目前的 flow rule。

檢視 flow rule 的指令是 ovs-ofctl dump-flow <bridge>

首先檢視計算節點 br-eth1 的 flow rule:

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

br-eth1 上配置了四條 rule,每條 rule 有不少屬性,其中比較重要的屬性有:

priority

rule 的優先級,值越大優先級越高。Open vSwitch 會按照優先級從高到低應用規則。

in_port

inbound 端口編号,每個 port 在 Open vSwitch 中會有一個内部的編号。

可以通過指令 ovs-ofctl show <bridge>

檢視 port 編号。

比如 br-eth1:

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

eth1 編号為 1;phy-br-eth1 編号為 2。

dl_vlan

資料包原始的 VLAN ID。

actions

對資料包進行的操作。

br-eth1 跟 VLAN 相關的 flow rule 是前面兩條,下面我們來詳細分析。

清晰起見,我們隻保留重要的資訊,如下:

priority=4,in_port=2,dl_vlan=1 actions=mod_vlan_vid:100,NORMAL priority=4,in_port=2,dl_vlan=5 actions=mod_vlan_vid:101,NORMAL

第一條的含義是:

從 br-eth1 的端口 phy-br-eth1(in_port=2)接收進來的包,如果 VLAN ID 是 1(dl_vlan=1),

那麼需要将 VLAN ID 改為 100(actions=mod_vlan_vid:100)

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

從上面的網絡結構我們可知,phy-br-eth1 連接配接的是 br-int,phy-br-eth1 的 inbound 包實際上就是 instance 通過 br-int 發送給實體網卡的資料。

那麼怎麼了解将 VLAN ID 1 改為 VLAN ID 100 呢?

請看下面計算節點 ovs-vsctl show 的輸出:

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

br-int 通過 tag 隔離不同的 port,這個 tag 可以看成内部的 VLAN ID。

從 qvo4139d09b-30(對應 cirros-vm2,vlan100)進入的資料包會被打上 1 的 VLAN tag。

從 qvo98582dc9-db(對應 cirros-vm3,vlan101)進入的資料包會被打上 5 的 VLAN tag。

因為 br-int 中的 VLAN ID 跟實體網絡中的 VLAN ID 并不相同,是以當 br-eth1 接收到 br-int 發來的資料包時,

需要對 VLAN 進行轉換。Neutron 負責維護 VLAN ID 的對應關系,并将轉換規則配置在 flow rule 中。

了解了 br-eth1 的 flow rule,我們再來分析 br-int 的 flow rule。

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

最關鍵的是下面兩條:

priority=3,inport=1,dl_vlan=100 actions=mod_vlan_vid:1,NORMAL priority=3,inport=1,dl_vlan=101 actions=mod_vlan_vid:5,NORMAL
分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

port 1 為 int-br-eth1,那麼這兩條規則的含義就應該是:

1. 從實體網卡接收進來的資料包,如果 VLAN 為 100,則改為内部 VLAN 1。

2. 從實體網卡接收進來的資料包,如果 VLAN 為 101,則将為内部 VLAN 5。

簡單的說,資料包在實體網絡中通過 VLAN 100 和 VLAN 101 隔離,在計算節點 OVS br-int 中則是通過内部 VLAN 1 和 VLAN 5 隔離。

控制節點的 flow rule 非常類似,留給大家分析。

到這裡,我們已經完成了 Neutron OVS vlan 的學習,下節開讨論 OVS 環境下的路由。 

分析 OVS 如何實作 vlan 隔離 - 每天5分鐘玩轉 OpenStack(140)

繼續閱讀