一、實驗目的
- 能夠對Open vSwitch進行基本操作;
- 能夠通過命令行終端使用OVS命令操作Open vSwitch交換機,管理流表;
- 能夠通過Mininet的Python代碼運行OVS命令,控制網絡拓撲中的Open vSwitch交換機
二、實驗環境
- 下載虛擬機軟件Oracle VisualBox 或 VMware;
- 在虛擬機中安裝Ubuntu 20.04 Desktop amd64,並完整安裝Mininet;
三、實驗要求
(一)基本要求
-
創建OVS交換機,並以ovs-switchxxx命名,其中xxx為本人在選課班級中的序號,例如ovs-switch001, ovs-switch088等。在創建的交換機上增加端口p0和p1,設置p0的端口號為100,p1的端口號為101,類型均為internal;為了避免網絡接口上的地址和本機已有網絡地址沖突,需要創建虛擬網絡空間(參考命令netns)ns0和ns1,分別將p0和p1移入,並分別配置p0和p1端口的ip地址為190.168.0.100、192.168.0.101,子網掩碼為255.255.255.0;最后測試p0和p1的連通性。
-
按要求創建交換機、端口及虛擬網絡空間
#創建ovs交換機 sudo ovs-vsctl add-br ovs-switch023 #創建端口p0,設置編號為100,類型為“internal” sudo ovs-vsctl add-port ovs-switch023 p0 sudo ovs-vsctl set Interface p0 ofport_request=100 type=internal #查詢p0網口的相關信息 sudo ethtool -i p0 #創建端口p1,設置編號為101,類型為“internal” sudo ovs-vsctl add-port ovs-switch023 p1 sudo ovs-vsctl set Interface p1 ofport_request=101 type=internal #查詢p0網口的相關信息 sudo ethtool -i p1 # 創建一個虛擬網絡空間ns0,把p0接口移入網絡空間ns0,並配置IP地址為 192.168.0.100 sudo ip netns add ns0 sudo ip link set p0 netns ns0 sudo ip netns exec ns0 ip addr add 192.168.0.100/24 dev p0 sudo ip netns exec ns0 ifconfig p0 promisc # 創建一個虛擬網絡空間ns1,把p1接口移入網絡空間ns1,並配置IP地址為 192.168.0.101 sudo ip netns add ns1 sudo ip link set p1 netns ns1 sudo ip netns exec ns1 ip addr add 192.168.0.101/24 dev p1 sudo ip netns exec ns1 ifconfig p1 promisc #測試 sudo ip netns exec ns0 ping 192.168.0.101 sudo ip netns exec ns1 ping 192.168.0.100
sudo ovs-vsctl show
-
測試p0和p1的連通性
sudo ip netns exec ns0 ping 192.168.0.101
sudo ip netns exec ns1 ping 192.168.0.100
-
-
使用Mininet搭建的SDN拓撲,如下圖所示,要求支持OpenFlow 1.3協議,主機名、交換機名以及端口對應正確。
-
打開miniedit
-
搭建如題述拓撲
-
Edit ->Preferences設置支持OpenFlow 1.3協議
-
保存拓撲
-
用文本編輯器打開test.py,修改鏈接端口
-
命令行中運行test.py,拓撲符合題意
-
-
通過命令行終端輸入“ovs-ofctl”命令,直接在s1和s2上添加流表,划分出所要求的VLAN。
VLAN_ID | Hosts |
---|---|
0 | h1 h3 |
1 | h2 h4 |
-
下發流表
另開一命令行輸入以下代碼在s1和s2上添加流表,划分出所要求的VLAN
#添加s1流表 sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3 sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3 sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1 sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2 #添加s2流表 sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3 sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3 sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1 sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2
-
主機連通性要求:
- h1 – h3互通
- h2 – h4互通
- 其余主機不通
-
使用pingall指令查看主機連通性
可知連通性滿足要求
最終結果
-
查看配置的流表
sudo ovs-ofctl -O OpenFlow13 dump-flows s1 sudo ovs-ofctl -O OpenFlow13 dump-flows s2
-
使用wireshark抓包,抓取s1的3號端口
在mininet命令行界面中執行pingall
指令可以發現s1向s3發送的包中vlan標記為0,而s2向s4發送的包中vlan標記為1,說明上面的實驗操作成功
(二)進階要求
閱讀SDNLAB實驗使用Mininet,編寫Python代碼,生成(一)中的SDN拓撲,並在代碼中直接使用OVS命令,做到可以直接運行Python程序完成和(一)相同的VLAN划分。
-
修改test.py,添加直接使用OVS命令完成VLAN划分的功能
#!/usr/bin/env python from mininet.net import Mininet from mininet.node import Controller, RemoteController, OVSController from mininet.node import CPULimitedHost, Host, Node from mininet.node import OVSKernelSwitch, UserSwitch from mininet.node import IVSSwitch from mininet.cli import CLI from mininet.log import setLogLevel, info from mininet.link import TCLink, Intf from subprocess import call def myNetwork(): net = Mininet( topo=None, build=False, ipBase='10.0.0.0/8') info( '*** Adding controller\n' ) c0=net.addController(name='c0', controller=Controller, protocol='tcp', port=6633) info( '*** Add switches\n') s1 = net.addSwitch('s1', cls=OVSKernelSwitch) s2 = net.addSwitch('s2', cls=OVSKernelSwitch) info( '*** Add hosts\n') h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None) h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None) h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None) h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None) info( '*** Add links\n') net.addLink(h1, s1, 1, 1) net.addLink(s1, h2, 2, 1) net.addLink(h3, s2, 1, 1) net.addLink(s2, h4, 2, 1) net.addLink(s1, s2, 3, 3) info( '*** Starting network\n') net.build() info( '*** Starting controllers\n') for controller in net.controllers: controller.start() info( '*** Starting switches\n') net.get('s1').start([c0]) net.get('s2').start([c0]) info( '*** Post configure switches and hosts\n') # 添加流表 s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3') s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3') s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1') s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2') s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3') s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3') s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1') s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2') CLI(net) net.stop() if __name__ == '__main__': setLogLevel( 'info' ) myNetwork()
-
查看結果
-
使用
pingall
指令查看主機連通性 -
查看流表
VLAN划分成功
-
四、個人總結
-
實驗難度:適中
-
實驗過程遇到的困難:
1.問題:對shell和mininet的使用還是有些生疏,在實際使用過程中就會出現思維定勢,一些問題其實只要換個角度其實就可以解決
解決方法:整理同個操作的不同解決方案,熟悉知識點,多使用
2.問題:我在做第1題的時候因為疏忽,在
sudo ip netns exec ns0 ip addr add 192.168.0.100/24 dev p0
這步時將ip設錯了,想要重新時發現名為ns0的虛擬網絡空間已經存在,嘗試使用sudo rm -rf / run/netns
刪除虛擬網路絡空間會發現下圖錯誤經過搜索發現問題原因是: 造成該問題的原因是服務器集群(文件服務器的存儲分別掛載到各個計算服務器中)中,在計算服務器上刪除文件服務器(NFS:網絡文件系統)上的內容時提示的錯誤。
解決方法:通過
sudo umount /run/netns/ns0
卸載文件系統后,即可用sudo rm -rf / run/netns/ns0
刪除 -
個人感想:
通過這次實驗,我對於mininet的操作有了更深的認識。雖然在做實驗的過程中,遇到了各種的問題,有些問題例如如何刪除虛擬網絡空間還花費了不少時間去解決,不過通過不斷地遇到問題和自主地解決問題,我思考這些問題的角度變得成熟了一些,能更好的運用知識去分析原因、解決問題,所以還是挺有收獲的。