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

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

第一部分:基本实验

实验步骤1

  • 创建ovs交换机,以ovs-switch033命名
    sudo ovs-vsctl add-br ovs-switch033

  • 创建端口p0,p1,设置编号为100和101,类型都为“internal”
    sudo ovs-vsctl add-port ovs-switch033 p0 sudo ovs-vsctl set Interface p0 ofport_request=100 type=internal
    sudo ovs-vsctl add-port ovs-switch033 p1 sudo ovs-vsctl set Interface p1 ofport_request=101 type=internal

  • 创建一个虚拟网络空间ns0,把p0接口移入网络空间ns0,并配置IP地址为 192.168.0.100
    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

  • 创建一个虚拟网络空间ns1,把p1接口移入网络空间ns1,并配置IP地址为 192.168.0.101
    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

  • 在examples目录下运行终端,输入sudo python3 miniedit.py打开Mininet可视化工具,搭建出以下拓扑:
  • 打开Preferences勾选OpenFlow1.3以支持OpenFlow 1.3协议
  • 打开上面保存好的python文件,修改代码,使得主机名、交换机名以及端口对应和实验要求一致
    links命令检验:

实验步骤3

  • 首先在终端运行上一步的py文件
  • 然后打开其他一个终端执行以下内容

在s1上添加流表

  • 将主机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
  • 将主机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上添加流表

  • 将主机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
  • 将主机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号端口上所传送的包

  • 抓取h1发往h3的包

    可知VLAN标记0已标上

  • 抓取h2发往h4的包

    可知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(h1, s1,1,1)
    net.addLink(h2, s1,1,2)
    net.addLink(s2, h3,1,1)
    net.addLink(s2, h4,2,1)
    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 s2添加流表
    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()

执行结果

  • 测试连通性

    主机间连通性要求吻合

第三部分:个人总结

一、实验难度:适中

经过上周对linux系统的运用以及mininet环境的掌握,对本课程有了初步的认识和体会,相较于上一次实验一开始的茫然无措,这次实验大体上思路还算清晰。

二、实验过程遇到的困难及解决方法

在这次实验上,首先遇到的困难是在实验步骤二中,刚开始主观的认为只要按图上标注的顺序连,那么端口号就会正确。后面通过在mininet命令行下输入net,才发现交换机端口号对应
正确,但是主机的端口号全为0,联想到上周实验通过python文件代码直接添加链路,主机的思路,这次也懂得了直接在脚本里面对端口号直接进行修改。其次是在实验步骤三添加流表中
卡了挺长时间,主要是对老师发出的pdf里面的那些命令行的大体意思不太了解,之后结合百度翻译理清其中文意思,并结合计网关于虚拟网隔离广播域的知识点,勉强弄懂了其原理。

三、个人感想

经过两周的SDN实验环节,慢慢了解了一点关于软件定义网络的原理知识,通过自己的动手实践,对mininet的用法及一些命令的用法更加熟练,相信自己能够学好这门课的。

posted @ 2021-09-16 13:38  运动ing的美食探险家  阅读(102)  评论(0编辑  收藏  举报