软件定义网络实验二

实验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

  • 输入sudo python3 miniedit.py利用 mininet可视化工具,搭建以下拓扑:

  • 打开Preferences勾选支持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的包

可以看到ID=0,VLAN标记0已标上

  1. 抓取h2->h4的包

可以看到ID=1,VLAN标记1已标上

第二部分:进阶实验

通过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(s2, s1,3,3)
    net.addLink(s1, h1,1,1)
    net.addLink(s1, h2,2,1)
    net.addLink(h3, s2,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')

    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
  
     myNetwork()
  • 测试连通性

主机间连通性要求吻合

第三部分:个人总结

  • 实验难度比较简单,经过上周的实验,对linux系统和mininet环境有了一定的了解,对于操作更加适应,加上课程的ppt提供了很好的指导和帮助,实验过程没有碰到太多的问题
  • 在本次实验中遇到的问题就是刚开始创建交换机和设置端口的时候总是报错,但是后面经过多次试验发现,第二次输入创建指令时提示已经存在,这个问题就直接忽略了,但是具体原因还是不能理解。
  • 经过了两次的实验,让我对这门课有了更深的兴趣,对linux系统和mininet环境的应用有了更深的了解,能够更容易的理解课程内容并将其实践应用。
posted @ 2021-09-22 14:04  fzux  阅读(190)  评论(0编辑  收藏  举报