1. 程式人生 > 其它 >軟體定義網路實驗二

軟體定義網路實驗二

實驗2:Open vSwitch虛擬交換機實踐

第一部分:基本實驗

實驗步驟1

  • 以ovs-switch034命名,建立ovs交換機
    sudo ovs-vsctl add-br ovs-switch034

  • 建立的交換機上增加埠p0和p1,設定p0的埠號為100,p1的埠號為101,型別均為internal
    sudo ovs-vsctl add-port ovs-switch034 p0
    sudo ovs-vsctl set Interface p0 ofport_request=100 type=internal
    sudo ovs-vsctl add-port ovs-switch034 p1
    sudo ovs-vsctl set Interface p1 ofport_request=101 type=internal

  • 建立虛擬網路空間ns0,把p0介面移入網路空間ns0,並配置IP地址為 192.168.0.100,建立ns1,把p1介面移入網路空間ns1,並配置IP地址為 192.168.0.101
    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 up

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 up

  • 輸入ovs-vsctl show檢視ovs交換機狀態

  • 輸入sudo ip netns exec ns0 ping 192.168.0.101進行p0和p1連通性測試

實驗步驟2

  • 在examples目錄下執行終端,輸入sudo python3 miniedit.py開啟Mininet視覺化工具,搭建出以下拓撲:
  • 開啟Preferences勾選OpenFlow1.3以支援OpenFlow 1.3協議

開啟上面儲存好的python檔案,修改程式碼,使得主機名、交換機名以及埠對應和實驗要求一致
links命令檢驗:

實驗步驟3

  • 首先在終端執行上一步的py檔案
    然後開啟其他一個終端執行以下內容

在s1上新增流表

  1. 將主機1 2傳送來的包打上VLAN標記
    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
  2. 將主機3 4傳送來的包取下VLAN標記
    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上新增流表

  1. 將主機3 4傳送來的包打上VLAN標記
    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
  2. 將主機1 2傳送來的包取下VLAN標記
    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

實驗步驟4

  • 在mininet命令列下輸入pingall,測試主機最終的連通性
  • 終端輸入sudo ovs-ofctl -O OpenFlow13 dump-flows s1,檢視s1流表,輸入sudo ovs-ofctl -O OpenFlow13 dump-flows s2,檢視s2流表

終端輸入sudo wireshark,mininet命令列輸入pingall,抓取s1的3號埠上所傳送的包

  1. 抓取h1發往h3的包

可知VLAN標記0已標上

抓取h2發往h4的包

可知VLAN標記1已標上

第二部分:進階實驗
通過python編寫以下程式碼
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(h2, s1,1,2)
net.addLink(s2, h3,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 s2新增流表
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()
執行結果
測試連通性

主機間連通性要求吻合
第三部分:個人總結
一、實驗難度:適中
經過上週對linux系統的運用以及mininet環境的掌握,對本課程有了初步的認識和體會,相較於上一次實驗一開始的茫然無措,這次實驗大體上思路還算清晰。

二、實驗過程遇到的困難及解決方法
在這次實驗上,首先遇到的困難是在實驗步驟二中,剛開始主觀的認為只要按圖上標註的順序連,那麼埠號就會正確。後面通過在mininet命令列下輸入net,才發現交換機埠號對應
正確,但是主機的埠號全為0,聯想到上週實驗通過python檔案程式碼直接新增鏈路,主機的思路,這次也懂得了直接在腳本里面對埠號直接進行修改。其次是在實驗步驟三新增流表中
卡了挺長時間,主要是對老師發出的pdf裡面的那些命令列的大體意思不太瞭解,之後結合百度翻譯理清其中文意思,並結合計網關於虛擬網隔離廣播域的知識點,勉強弄懂了其原理。

三、個人感想
經過兩週的SDN實驗環節,慢慢了解了一點關於軟體定義網路的原理知識,通過自己的動手實踐,對mininet的用法及一些命令的用法更加熟練,相信自己能夠學好這門課的。