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

实验目的

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

实验环境

Ubuntu 20.04 Desktop amd64

实验1-创建ovs交换机

1. 创建OVS交换机

2. 为OVS交换机配置p0端口

3.创建虚拟空间ns0,将p0移入虚拟网络空间ns0,并配置IP

4.为OVS交换机配置p1端口

5.创建虚拟空间ns1,将p0移入虚拟网络空间ns1,并配置IP

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

7.测试联通性

实验2 Mininet下发流表

1.自定义拓扑

from mininet.topo import Topo

class MyTopo(Topo):

    def __init__(self):
    
        # initilaize topology
        Topo.__init__(self)
    
        # add hosts
        h1 = self.addHost('h1')
        h2 = self.addHost('h2')
        h3 = self.addHost('h3')
        h4 = self.addHost('h4')
    
        # add switches
        s1 = self.addSwitch('s1')
        s2 = self.addSwitch('s2')

        # add links
        self.addLink(h1, s1, 1, 1)
        self.addLink(h2, s1, 1, 2)
        self.addLink(h3, s2, 1, 1)
        self.addLink(h4, s2, 1, 2)
        self.addLink(s1, s2, 3, 3)
topos = {'mytopo': (lambda:MyTopo())}

2.运行文件,查看连接

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

VLAN_ID Hosts
0 h1 h3
1 h2 h4

下发流表

查看流表

4.主机连通性要求:

  • h1 – h3互通

  • h2 – h4互通

  • 其余主机不通

进行pingall操作,进行连通性检查

利用 sudo wireshark 命令的3号端口

  • Mininet命令行界面输入 h1 ping h3 ,抓取的包id为0

进阶要求

阅读SDNLAB实验使用Mininet,编写Python代码,生成(一)中的SDN拓扑,并在代码中直接使用OVS命令,做到可以直接运行Python程序完成和(一)相同的VLAN划分。

 
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(s1, s2,3,3)
    net.addLink(h1, s1,1,1)
    net.addLink(h2, s1,1,2)
    net.addLink(h3, s2,1,1)
    net.addLink(h4, s2,1,2)
 
    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交换机

    sudo ovs-vsctl add-br ovs-switch000

  • 如何删除ovs交换机

    sudo ovs-vsctl add-del ovs-switch000

  • 创建端口p0,设置编号为100,类型为“internal”

  • 创建一个虚拟网络空间ns0,把p0接口移入网络空间ns0,并配置IP地址为 192.168.1.100

  • 如何测试端口是否ping通

  • mininet相关函数

    self.addHost()添加主机

    self.addSwitch()添加交换机

    self.addLink()连接两台设备并分别设置端口号

    Link( h0, switch0)只连接设备

    h0.setIP( '192.168.123.1/24' )为主机设置IP地址

    switch0.cmd( 'ovs-vsctl del-br dp0' )对交换机实行cmd命令

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

感想:

本次实验学到了关于Open vSwitch虚拟交换机的很多操作,刚开始由于粗心,创建虚拟机的时候没有把学号输进去而是直接复制了老师ppt上的指令,后来再创时发现要求删掉前面新创建的一个,然后上网找了很久终于找到删除指令,结果发现ppt里有TAT,下次一定认真看ppt。然后是关于p1与p0的地址,ppt上是1.100与1.101,但是要求的报告里是0.100与0.101,与同学经过一番讨论后决定还是按照报告里面的来,然后是下发流表项,进阶的代码也是通过相应的初始化与对拓扑执行cmd命令下发流表来实现的,感觉这次实验难度不大了,但是需要格外细心,不然要经常从头再来。

posted @ 2022-09-19 18:57  伱你  阅读(31)  评论(0编辑  收藏  举报