利用環境配置資訊,自動化連接 VLAN 群體,完成在 SDN 下的 VLAN 管理。
-
以 Switch 為單位,建立各個 VLAN 群體
- 一個 VLAN 產生一棵無迴圈樹,並以此樹轉送此 VLAN 的廣播封包。
-
同 VLAN 的各主機間,規劃最短路徑轉送封包(並非走 VLAN 樹)
- 提高整體效率。
因使用到EventSwitchEnter
事件來紀錄拓樸,所以在執行sdn_vlan_v2.py
時,需加入--observe-links
:
$ ryu-manager --observe-links sdn_vlan_v2.py
self.vlans = {
'hosts':{
'00:00:00:00:00:01':{"IP":'10.0.0.1',"VLAN_ID":20},
'00:00:00:00:00:02':{"IP":'10.0.0.2',"VLAN_ID":20},
'00:00:00:00:00:03':{"IP":'10.0.0.3',"VLAN_ID":30},
'00:00:00:00:00:04':{"IP":'10.0.0.4',"VLAN_ID":30},
'00:00:00:00:00:05':{"IP":'10.0.0.5',"VLAN_ID":30}
}
}
# 預留用來過濾封包
Table 0:
* 沒有 Match 任何規格 -> 轉送至 Table 1
# 1. 加入對應 VLAN tag
Table 1:
priority=99
* Match(eth_src=管轄內主機, vlan_vid=none) -> 加入對應 VLAN tag,轉往 Table 2
# 1. VLAN 樹通道
# 2. 同 VLAN 主機間最短路徑
# 3. 轉送封包至對應主機
# 4. trunk 預設 Drop
Table 2:
priority=20
* Match(vlan_vid=此 Switch 所在的 VLAN 群體) -> 送往 trunk、主機
priority=50
* Match(eth_dst ,vlan_vid) -> 送往對應 trunk(最短路徑)
priority=50
* Match(eth_dst ,vlan_vid) -> 送往對應主機
priority=0
* Match(in_port=trunk) -> Drop
-
Switch 加入個別 VLAN 樹之條件(情境):
- Switch 中包含此 VLAN 之主機。
- Switch 位於它台 Switch 連接至此 VLAN 樹的最短路徑上。
-
Switch 符合條件(情境)後:
- 情境 1
- 學習此主機,並將規則的優先權設定為 50。
- 在規劃為通道的 trunk 及同 VLAN 的主機下規則,開通包含此 VLAN ID 的封包,並將規則的優先權設定為 20。
- 情境 2
- 在規劃為通道的 trunk 及同 VLAN 的主機下規則,開通包含此 VLAN ID 的封包,並將規則的優先權設定為 20。
- 情境 1
if switch 偵測到新的 host 加入:
if switch 並不在 host 所屬 VLAN 群體(樹)中:
使用洪水演算法找尋此 VLAN 離目前 switch 最近的 switch,並開通這條路徑,使目前 switch 加入 VLAN 群體。