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


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

  1. 能夠對Open vSwitch進行基本操作;
  2. 能夠通過命令行終端使用OVS命令操作Open vSwitch交換機,管理流表;
  3. 能夠通過Mininet的Python代碼運行OVS命令,控制網絡拓撲中的Open vSwitch交換機

二、實驗環境

  • 下載虛擬機軟件Oracle VisualBox 或 VMware;
  • 在虛擬機中安裝Ubuntu 20.04 Desktop amd64,並完整安裝Mininet;

三、實驗要求

(一)基本要求

  1. 創建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交換機,並按照題目要求配置
#創建ovs交換機
sudo ovs-vsctl add-br ovs-switch002
#添加p0、p1端口,並按要求配置
sudo ovs-vsctl add-port ovs-switch002 p0 -- set Interface p0 ofport_request=100 type=internal
sudo ovs-vsctl add-port ovs-switch002 p1 -- set Interface p1 ofport_request=101 type=internal
#查看端口信息
sudo ethtool -i p0
sudo ethtool -i p1
#創建並配置虛擬空間
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
  • 使用sudo ovs-vsctl show查看ovs交換機狀態

  • 使用sudo ip netns exec ns0 ping 192.168.0.101測試p0和p1的連通性,連通性良好

  1. 使用Mininet搭建的SDN拓撲,如下圖所示,要求支持OpenFlow 1.3協議,主機名、交換機名以及端口對應正確。
  • 使用Miniedit生成拓朴
  • 支持OpenFlow1.3協議
  • 保存為python腳本
  • 對link對應端口進行修改
  • 生成網絡拓撲
  1. 通過命令行終端輸入“ovs-ofctl”命令,直接在s1和s2上添加流表,划分出所要求的VLAN。
VLAN_ID Hosts
0 h1 h3
1 h2 h4
# 將主機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
# 將主機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

# 將主機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
# 將主機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
  • 另打開一個命令行,並在其中輸入上述指令
  1. 主機連通性要求:
  • h1 – h3互通

  • h2 – h4互通

  • 其余主機不通

  • 測試其連通性

    h1 和 h3互相連通,h2 和 h4互相連通,其他主機均不互通

  • 命令行中輸入下述指令查看下發流表

sudo ovs-ofctl -O OpenFlow13 dump-flows s1
sudo ovs-ofctl -O OpenFlow13 dump-flows s2

  • 使用sudo wireshark運行wireshark,同時mininet使用pingall,令wireshark抓取數據包

    對h1 和 h3發送包vlan標記為0


對h2 和 h4發送包vlan標記為1,符合實驗要求

(二)進階要求

閱讀SDNLAB實驗使用Mininet,編寫Python代碼,生成(一)中的SDN拓撲,並在代碼中直接使用OVS命令,做到可以直接運行Python程序完成和(一)相同的VLAN划分。

  • 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='192.168.0.0/24') #修改ip網段

    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)
    
    #設置主機ip地址
    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='192.168.0.1', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='192.168.0.2', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='192.168.0.3', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='192.168.0.4', defaultRoute=None)
    
    #設置連接端口號
    info( '*** Add links\n')
    net.addLink(h1, s1, 1, 1)
    net.addLink(s1, h2, 2, 1)
    net.addLink(s1, s2, 3, 3)
    net.addLink(s2, h3, 1, 1)
    net.addLink(s2, h4, 2, 1)

    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分別調用cmd()執行添加流表和划分vlan操作
    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()

  • 使用所寫代碼生成拓撲,並測試連通性

    與(一)中要求一致
  • 查看流表

個人總結

實驗二難度

存在一定困難
這次實驗總體來說,相比第一次實驗難度還是拔高了不少的。也許是因為剛進行線上授課還不適應,感覺上並沒有像實驗一那樣理解那么透徹。同時,在實驗過程中遇到的困難和問題也相應的更多一些。(也許是我菜吧)但是在參考材料和搜索相關做法后,也都成功解決了。

實驗遇到的困難

  • Q1:在實驗課開始前,我嘗試先通過自主學習的方式完成(一)基本要求中的部分內容,但是阻力比預想中更大一些

  • 解決方法:通過從網上尋找相對應的博客教程,我成功地在實驗前將(一)基本要求中的OVS交換機創建出來,並測試p0(ip:192.168.0.100/24)和p1(ip:192.168.0.101/24)的連通性良好。同時對於ovs中不同的指令和屬性標簽都有了更加全面的了解。然而從結果上而言,仍未達到開始的預期進度,還有很多知識有待學習。

  • Q2:在(一)基礎要求的第2題中,試圖用命令行實現,然而並不知道怎么添加支持OpenFlow1.3

  • 解決方法:最終權衡之下,選擇先使用Miniedit搭建拓撲,設定支持OpenFlow1.3。然后在將其保存為.py腳本文件,直接對腳本文件進行修改。雖然問題得以解決,而且這樣做也十分便捷且簡單,但是疑問本身並沒消失。最終在實驗完成之后,通過進一步學習,我了解到可以通過sudo mn --switch ovs,protocols=openflow13來用OpenFlow1.3模式啟動OVS。

  • Q3:對於流表的添加和VLAN的划分理解並未十分透徹

  • 解決方法:正如前面所言,這次實驗的原理和概念我仍未理解得十分明晰與透徹,雖然完成了實驗,但是仍有許多原理上得疑問未能找到解答,很多問題仍是一知半解。所以,這就需要今后進一步得學習以及課后更加深入地了解相關的知識來充實自己現有的不足與問題。

實驗心得

本次實驗學習了Open vSwitch虛擬交換機的相關知識與概念。實驗中,通過ovs-vsctlovs-ofctl等指令實現OVS交換機的創建以及添加流表、划分VLAN等操作。同時,也嘗試使用Python代碼直接在代碼中調用OVS命令,令我對於Open vSwitch以及Mininet有了進一步深入的了解。雖然本次實驗與之前的實驗相比難度有所提高,但通過一步步解決問題,也令我對SDN相關的知識有了更加充實的儲備。同樣,對於仍未解決的疑問,也將會是今后學習和鑽研的目標,有待課后進一步學習與探討去最終切實解決。可以順帶一提,這次(二)進階要求相較於(一)基礎要求而言,個人感覺並沒有特別進階的感覺,個人希望下次可以做點更不同的東西。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM