实验2:Open vSwitch虚拟交换机实践

一、实验目的

  1. 能够对Open vSwitch进行基本操作;
  2. 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表;
  3. 能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open vSwitch交换机

二、实验环境

  1. 下载虚拟机软件Oracle VisualBox 或 VMware;
  2. 在虚拟机中安装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-vsctl show运行结果如下

    测试p0和p1的连通性:

    sudo p1 netns exec ns0 ping 192.168.0.101

  2. 使用Mininet搭建的SDN拓扑,如下图所示,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。

    • 使用miniedit生成如下拓扑,并保存为031902127.py

    • 勾选OpenFlow1.3

    • 修改生成的py文件

    • 运行拓扑文件,并查看网络结构

  3. 通过命令行终端输入“ovs-ofctl”命令,直接在s1和s2上添加流表,划分出所要求的VLAN。

    VLAN_ID Hosts
    0 h1 h3
    1 h2 h4
    • 先向s1、s2添加流表,并划分VLAN:
    • 查看流表
  4. 主机连通性要求:

  • h1 – h3互通
  • h2 – h4互通
  • 其余主机不通
    • 测试连通性:
    • 使用sudo wireshark命令打开wireshark,并且重新输入pingall命令:


      从图中可以看到,s1、s2在发送数据包时,会对host的数据分别打上对应的VLAN标记

(二)进阶要求

​ 阅读SDNLAB实验使用Mininet,编写Python代码,生成(一)中的SDN拓扑,并在代码中直接使用OVS令,做到可以直接运行Python程序完成和(一)相同的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(h2, s1, 1, 2)
        net.addLink(h3, s2, 1, 1)
        net.addLink(h4, s2, 1, 2)
        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()
    
    
    • 重新运行结果如下:

    • 查看流表:

    • 测试连通性,得到(一)中相同结果:

四、心得

实验难度:

  • 这一次实验涉及的内容不多,但是多是没有接触过的内容,也比较难以理解,难度较上次实验有明显的提高。

实验过程遇到的困难及解决办法:

  • 使用ovs-vsctl show 命令查看拓扑结构时,可能存在多个网桥结构,可以使用sudo mn --clean 清除所有网桥或者使用 ovs-vsctl del-br 网桥名 逐个删除
  • 在添加流表的过程中,显示:

    可以新开一个Terminal页面,重新运行031902127.py文件后保持拓扑网络运行即可。
  • (一)中拓扑网络p1端口ip地址应该为192.168.0.100,若如题目中使用190.168.0.100会导致ping不通,修改端口ip地址即可。

个人感想:

  • 最好要在理解的基础上编写代码,照抄材料提供的代码容易出现问题(比如端口号忘记改)。
  • 对于ovs的使用只是停留在表面,为了完成实验,查阅了很多网上的资料,对于一些方法的使用还是一知半解,还需要深入学习和掌握。
posted @ 2021-09-21 23:52  Jiangggg  阅读(116)  评论(0编辑  收藏  举报