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

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

一、实验目的

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

二、实验环境

Ubuntu 20.04 Desktop amd64

三、实验要求

(一)基本要求

1-1 /home/用户名/学号/lab2/目录下执行 ovs-vsctl show 命令:

1-2 p0和p1连通性测试的执行结果:

2-1 /home/用户名/学号/lab2/目录下开启Mininet CLI并执行pingall命令的截图

2-2 /home/用户名/学号/lab2/目录下目录下查看OVS流表的命令结果截图

2-3 wireshark抓包截图

  • 首先在Mininet命令行界面输入 h1 ping h3 ,再在另外一个终端中输入sudo wireshark 命令,可以看到抓取的包id为0。

  • 在Mininet命令行界面输入 h2 ping h4 ,在另外一个终端中输入sudo wireshark 命令,可以看到抓取的包id为1。

(二)进阶要求

代码:

#!/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(s1, s2, 3, 3)
    net.addLink(h4, s2, 1, 2)
    net.addLink(h3, s2, 1, 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("*** Send the flow table down\n\n")
    s1.cmd('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('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('ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output=1')
    s1.cmd('ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output=2')

    s2.cmd('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('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('ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output=1')
    s2.cmd('ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output=2')
    
    info( "*** print the streamtable\n" )
    info( s1.cmd( 'ovs-ofctl dump-flows s1 -O OpenFlow13' ))
    info( s2.cmd( 'ovs-ofctl dump-flows s2 -O OpenFlow13' ))
    
    info( '*** Post configure switches and hosts\n')
    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()

运行结果

四、个人总结

1.实验整体难度一般,但相关操作不甚明确,耗时多。通过实验对OVS命令的使用有了初步的了解和掌握,同时也对流表和VLAN等概念有了初步的了解。
2.实验过程中不知道如何如何进行抓包,通过网上查阅到往年学长、学姐的实验报告知道了相应的操作,需要在在Mininet命令行界面输入 X ping X,再开启另一个终端中输入sudo wireshark 命令。
3.在下流表后执行pingall 命令时出现错误,只有h1与h4连通,后关闭所有终端重新运行代码和下流表后得到所求连通情况。

posted @ 2022-09-20 14:56  BlueBotton  阅读(55)  评论(0)    收藏  举报