寫在前面
- 學會了如何下發流表及刪除流表的操作。
- 第一個不用腳本的實驗。
實驗原理
- 在SDN環境下,當交換機收到一個數據包並且交換機中沒有與該數據包匹配的流表項時,交換機將此數據包發送給控制器,由控制器決策數據包如何處理。
- 控制器下發決策后,交換機根據控制器下發的信息來進行數據包的處理,即轉發或者丟棄該數據包。我們可以通過對流表操作來控制交換機的轉發行為。
實驗任務
- Mininet創建一個默認樹形拓撲。
- 選擇Mininet的控制器指定為ODL,進行基本的添加、刪除流表操作,使網絡實現網絡通信和不通信。
- 拓撲如下所示:
實驗步驟
Opendaylight控制器
- 打開一個終端,輸入
ifconfig
,查看ODL所在IP為127.0.0.1
(環回IP)。 - 進入bin目錄下,運行karaf文件。
Mininet創建topo
sudo su
進入管態。- 輸入命令
mn --controller=remote,ip=127.0.0.1,port=6633
。
- Mininet或默認創建一個交換機下掛兩台主機的topo。
流表的簡單操作
- 輸入
sh ovs-ofctl dump-flows s1
,查看s1
中的流表項。
- 輸入
pingall
查看主機之間連通性。
- 這時我們再查看
s1
中的流表項時,會發現多出兩條由Controller下發的流表項。 - Controller學習了
h1
,h2
的MAC地址后下發的流表。
我們看到每條流規則由一系列字段組成,它們由基本字段、條件字段和動作字段三部分組成。有了流表后交換機就根據流表來進行數據包的操作,當然我們也可以人工的進行流表的新增、修改、刪除操作,在我們這個環境下可直接在終端下輸入命令。
添加刪除流表項
- 我們想讓
h1
,h2
之間ping不通,只需要讓交換機把從2號端口發來的數據包全部丟棄即可,1端口也可以。 h1
即使把ICMP包發過去,h2
回應的ICMP包也過不來。h2
向h1
發送ICMP包根本發不過去。- 下發一條流表實現上述功能:
sh ovs-ofctl add-flow s1 priority=12,in_port=2,actions=drop
- 注意:這條流表項的優先級要高於原來流表項的優先級
10
。 - 增加這條流表以后,
h1
和h2
主機之間無法通信了。
- 輸入
sh ovs-ofctl dump-flows s1
,查看s1
中的流表項。
- 再刪除一條流規則:如將刪除條件字段中包含in_port=2的所有流表,如下圖所示,將含有in_port=2的所有流表被刪除了。
sh ovs-ofctl del-flows s1 in_port=2
- 因為之前添加的丟棄2號端口包的流表已被刪除,這時
h1
和h2
又可以正常通信了。
- 輸入
sh ovs-ofctl dump-flows s1
,查看s1
中的流表項。
實驗小結
主要是對OpenFlow流表有更進一步的了解,簡略介紹一些基本的流表操作。在此基礎上可以進行比如改寫源和目地主機的ip和mac地址、對數據包泛洪、回環等操作,用戶可以根據需求通過修改流表來自主地控制轉發行為,這本身也是SDN的初衷之一,也使得我們控制網絡更加的便捷、靈活、多樣。