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

一、实验目的

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

二、实验环境

Ubuntu 20.04 Desktop amd64

三、实验要求

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

(2a)p0和p1连通性测试

(1b)/home/用户名/学号/lab2/目录下开启Mininet CLI并执行pingall命令

(2b)上述目录下查看OVS流表的命令结果截图

(3)wireshark抓包截图

四、拓展

(1)代码

点击查看代码
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()

(2)对结果pingall

posted @ 2022-09-22 19:01  刘宇旗  阅读(14)  评论(0编辑  收藏  举报