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

一、实验目的

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

二、实验环境

 
1.下载虚拟机软件Oracle VisualBox 或 VMware;
2.在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;
 

三、实验要求

 

(一)基本要求

1.创建OVS交换机,并以ovs-switchxxx命名,其中xxx为本人在选课班级中的序号,例如ovs-switch001, ovs-switch088等。在创建的交换机上增加端口p0和p1,设置p0的端口号为100,p1的端口号为101,类型均为internal;为了避免网络接口上的地址和本机已有网络地址冲突,需要创建虚拟网络空间(参考命令netns)ns0和ns1,分别将p0和p1移入,并分别配置p0和p1端口的ip地址为190.168.0.100、192.168.0.101,子网掩码为255.255.255.0;最后测试p0和p1的连通性。

 
#创建ovs交换机,命名为ovs-switch028
sudo ovs-vsctl add-br ovs-switch028
#创建端口p0,设置编号为100,类型为“internal”
sudo ovs-vsctl add-port ovs-switch028 p0
sudo ovs-vsctl set Interface p0 ofport_request=100 type=internal
#查询p0网口的相关信息
sudo ethtool -i p0
#创建端口p1,设置编号为100,类型为“internal”
sudo ovs-vsctl add-port ovs-switch028 p1
sudo ovs-vsctl set Interface p1 ofport_request=101 type=internal
#查询p1网口的相关信息
sudo ethtool -i p1
#创建一个虚拟网络空间ns0,把p0接口移入网络空间ns0,并配置IP地址为190.168.0.100
sudo ip netns add ns0
sudo ip link set p0 netns ns0
sudo ip netns exec ns0 ip addr add 190.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
#测试
sudo ip netns exec ns0 ping 192.168.0.101
sudo ip netns exec ns1 ping 190.168.0.100

 
在命令行输入以下内容查看网络状态:

sudo ovs-vsctl show

 
p0和p1的连通性测试

  • p0 ping p1输入如下内容:
sudo ip netns exec ns0 ping 192.168.0.101

结果如下图所示,p0 ping p1成功ping通

  • p1 ping p0输入如下内容:
sudo ip netns exec ns1 ping 190.168.0.100

同样p1 ping p0也成功ping通

 

2.使用Mininet搭建的SDN拓扑,如下图所示,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。

* 在lab2目录下输入如下命令打开Mininet:
sudo ./../mininet/examples/miniedit.py

 

  • 搭建如下拓扑:
     

 

  • 点击左上角的Edit,再点击Preference,勾选OpenFlow 1.3
     

     
  • 点击左上角的file,再点击export level2 script,将该拓扑保存为py文件,命名为Topo.py。打开该py文件,修改Add links以下代码,修改部分如下:
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)

 

  • 在lab2目录下打开终端,在命令行中输入
sudo python Topo.py 

 

  • 输入links查看连接情况,由下图可见连接一切正常
     

 

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

VLAN_ID Hosts
0 h1 h3
1 h2 h4

 

  • 在lab2目录下打开终端,输入如下内容实现下发流表:
     
#s1添加流表
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
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添加流表
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
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
  • 在命令行输入如下内容查看s1的流表:
sudo ovs-ofctl -O OpenFlow13 dump-flows s1

  • 查看s2的流表:
sudo ovs-ofctl -O OpenFlow13 dump-flows s2

 

4.主机连通性要求:

  • h1 – h3互通

  • h2 – h4互通

  • 其余主机不通

  • 原来输入过sudo python Topo.py的命令行输入pingall查看连通性,如下图所示,可以看出符合主机连通性的要求。

 

  • 使用如下命令,抓取s1(或s2)的3号端口
sudo wireshark

 

  • 在有Mininet的命令行输入h1 ping h3 ,并在另一个终端输入上述命令,如图所示,抓包ID:0

 

  • 同理在有Mininet的命令行输入h2 ping h4 ,并在另一个终端输入sudo wireshark,如下,抓包ID:1
     

 

(二)进阶要求

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

 

  • 对原来保存的Topo.py进行修改,修改后如下,并将其重新命名为ovstopo.py
#!/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')
    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')

    
    info( '*** Post configure switches and hosts\n')
    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()
  • 在lab2目录下打开终端,运行ovstopo.py文件

  • 使用pingall命令查看连通性

  • 在lab2目录下再打开一个终端,使用如下命令查看流表
sudo ovs-ofctl -O Openflow13 dump-flows s1
sudo ovs-ofctl -O Openflow13 dump-flows s2

 

四、个人总结

 

  • 实验难度:较简单

  • 实验过程遇到的困难及解决办法:

    • 实验过程最开始创建ovs交换机后在创建端口时终端命令行出现了error,但是不知道到底是出什么问题了,问同学得知大家都这样,那于是就继续按照实验的步骤完成下去。该部分的进行到后续也没有出现连锁的问题,因此对于这个error没有进行深究。

    • 前面做创建ovs交换机时使用sudo ovs-vsctl show命令查看网络状态出现了很多东西,显然和同学的不太一致,通过询问同学得知是没有删除先前的拓扑,所以查看网络状态时先前拓扑内的东西也会随之出现。

    • 做实验时想用Mininet搭建SDN拓扑竟然尴尬地发现不知道Mininet怎么打开。重温先前打开Mininet的方法得以解决,可以说这种东西是熟能生巧,用得少记忆就不深刻,因此还需多加练习。

  • 个人感想:由于有老师的pdf指导本次作业做起来是没有什么太大的困难的,个别细节都是比较小的问题,但又需要细心去发现问题出在哪里。Mininet的使用比上一次的实验会更加得心应手些,SDN实验是理论联系实际的过程,通过实验我也会对这门学科有好的体会,希望本学期的实践经历能够增强我思考和实践的能力。

posted @ 2021-09-20 16:39  星星落兜里了  阅读(181)  评论(0编辑  收藏  举报