zoukankan      html  css  js  c++  java
  • 实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令

    实验目的

    Mininet 安装之后,会连带安装 Open vSwitch,可以直接通过 Python 脚本调用
    Open vSwitch 命令,从而直接控制 Open vSwitch,通过实验了解调用控制的方法。

    实验任务

    在本实验中,使用 Mininet 基于 Python 的脚本,调用“ovs-vsctl”命令直接控制
    Open vSwitch。使用默认的交换机泛洪规则,设置更高的优先级规则进行预先定
    义 IP 报文的转发。在多个交换机中通过设置不同 TOS 值的数据包将通过不同的
    方式到达目的地址,验证主机间的连通性及到达目的地址的时间。

    实验步骤

    实验环境

    安装了 Ubuntu 18.04.5 Desktop amd64 的虚拟机

    实验过程

    SDNLAB 实验参考资料:https://www.sdnlab.com/15083.html

    创建 ovsSingleBr.py 脚本并添加内容,代码参考 SDNLAB


    脚本对应的拓扑如上图所示,执行 ovsSingleBr.py,在没有控制器的情况下,在Mininet 脚本中通过调用 ovs 命令直接向 switch0 交换机下发流表,将入端口号为1/2/3 的数据包泛洪广播,并对目的地址为 192.168.123.1/2/3 的数据包分别从1/2/3 端口转发出去。之后测试 h0 ping h1,h0 ping h2,网络连通。

    创建 ovsMultiBr.py 脚本并添加内容,代码参考 SDNLAB


    脚本对应的拓扑如上图所示,执行 ovsMultiBr.py,在没有控制器的情况下,在Mininet 脚本中通过调用 ovs 命令给多个交换机下发流表,通过 h0 ping h1 操作测试验证主机间的连通性,并通过-Q 参数设置不通的 tos 值查看主机间的连通性。通过验证发现,tos 值设置越大,时间使用越少。

    实验要求

    学习 ovsSingleBr.py 和 ovsMultiBr.py,在下图拓扑中实现一个 VLAN。


    上述代码将 h0 和 h2 划分在 VLAN 0 中,h1 和 h3 划分在 VLAN 1 中,由于拓扑没有控制器,并且初始化时删除了交换机中的所有流表,因此除非下发流表,否则主机之间网络无法连通。请尝试修改代码,利用 ovs 命令直接下发 VLAN 设置的流表项,最终测试 h0 和 h2 互通,h1 和 h3 互通,其余主机均不通,结果如下图。OVS 实现 VLAN 可参考博客:https://www.cnblogs.com/fjlinww/p/11791846.html

    网络的拓扑
    from mininet.net import Mininet
    from mininet.node import Node
    from mininet.link import TCLink
    from mininet.log import setLogLevel, info
    
    
    def myNet():
        "Create network from scratch using Open vSwitch."
    
        info("*** Creating nodes
    ")
        switch0 = Node('s0', inNamespace=False)
        switch1 = Node('s1', inNamespace=False)
        h0 = Node('h0')
        h1 = Node('h1')
        h2 = Node('h2')
        h3 = Node('h3')
    
        info("*** Creating links
    ")
        linkopts0 = dict(bw=100, delay='1ms', loss=0)
        linkopts1 = dict(bw=200, delay='10ms', loss=0)
        # linkopts2 = dict(bw=10, delay='50ms', loss=0)
        # linkopts3 = dict(bw=100, delay='1ms', loss=0)
        TCLink(h0, switch0, **linkopts0)
        TCLink(h1, switch0, **linkopts0)
        TCLink(h2, switch1, **linkopts0)
        TCLink(h3, switch1, **linkopts0)
        TCLink(switch0, switch1, **linkopts1)
    
        info("*** Configuring hosts
    ")
        h0.setIP('192.168.123.1/24')
        h1.setIP('192.168.123.2/24')
        h2.setIP('192.168.123.3/24')
        h3.setIP('192.168.123.4/24')
    
    创建网桥及其端口
    info("*** Starting network using Open vSwitch
    ")
        switch0.cmd('ovs-vsctl del-br dp0')
        switch0.cmd('ovs-vsctl add-br dp0')
        switch1.cmd('ovs-vsctl del-br dp1')
        switch1.cmd('ovs-vsctl add-br dp1')
    
        for intf in switch0.intfs.values():
            print(intf)
            print(switch0.cmd('ovs-vsctl add-port dp0 %s' % intf))
    
        for intf in switch1.intfs.values():
            print(intf)
            print(switch1.cmd('ovs-vsctl add-port dp1 %s' % intf))
    
    配置流表
    print(switch0.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096->vlan_vid,output:3')) #从端口1进,为数据包添加新的vlan tag,将4096写入字段vlan_vid,转发3端口
        print(switch0.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097->vlan_vid,output:3'))
        print(switch0.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=0,actions=pop_vlan,output:1'))
        print(switch0.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=1,actions=pop_vlan,output:2'))
    
        print(switch1.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096->vlan_vid,output:3'))
        print(switch1.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097->vlan_vid,output:3'))
        print(switch1.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=0,actions=pop_vlan,output:1'))
        print(switch1.cmd(r'sudo ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=1,actions=pop_vlan,output:2'))
    
    ping连接测试
    info("*** Running test
    ")
        h0.cmdPrint('ping -Q 0x10 -c 3 ' + h1.IP())
        h0.cmdPrint('ping -Q 0x20 -c 3 ' + h2.IP())
        h0.cmdPrint('ping -Q 0x30 -c 3 ' + h3.IP())
        h1.cmdPrint('ping -Q 0x10 -c 3 ' + h2.IP())
        h1.cmdPrint('ping -Q 0x20 -c 3 ' + h3.IP())
        h2.cmdPrint('ping -Q 0x30 -c 3 ' + h3.IP())
    
    删除网桥
    info("*** Stopping network
    ")
        switch0.cmd('ovs-vsctl del-br dp0')
        switch0.deleteIntfs()
        switch1.cmd('ovs-vsctl del-br dp1')
        switch1.deleteIntfs()
        info('
    ')
    
    输出结果截图


  • 相关阅读:
    PAT (Advanced Level) 1114. Family Property (25)
    PAT (Advanced Level) 1113. Integer Set Partition (25)
    PAT (Advanced Level) 1112. Stucked Keyboard (20)
    PAT (Advanced Level) 1111. Online Map (30)
    PAT (Advanced Level) 1110. Complete Binary Tree (25)
    PAT (Advanced Level) 1109. Group Photo (25)
    PAT (Advanced Level) 1108. Finding Average (20)
    PAT (Advanced Level) 1107. Social Clusters (30)
    PAT (Advanced Level) 1106. Lowest Price in Supply Chain (25)
    PAT (Advanced Level) 1105. Spiral Matrix (25)
  • 原文地址:https://www.cnblogs.com/robinxlh/p/4net.html
Copyright © 2011-2022 走看看