实验2 Open vSwitch虚拟交换机实践
Open vSwitch虚拟交换机实践
实验目的
- 能够对Open vSwitch进行基本操作
- 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表
- 能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open vSwitch交换机
(一)基本实验
实验1 创建OVS交换机
-
创建OVS交换机
-
为OVS交换机配置p0端口
-
创建虚拟空间ns0,将p0移入虚拟网络空间ns0,并配置IP
-
为OVS交换机配置p1端口
-
创建虚拟空间ns1,将p0移入虚拟网络空间ns1,并配置IP
-
测试联通性
成功ping通
实验2 Mininet下发流表
1. 自定义拓扑
运行拓扑
2. 划分VLAN
需求:
VLAN划分:
联通性要求:
h1-h3
h2-h4,其余不通
为s1配置流表项:
查看下发的流表项:
这四条命令原理:
1、2条命令:
- 首先对输入端口进行匹配,如果输入端口为1(即为h1),执行action:将h1设置为vlan0虚拟局域网的主机,并将数据包向3号端口转发
如果输入端口为3(即为h3),执行action:将h2设置为vlan1虚拟局域网的主机,并将数据包向3号端口转发
3、4条命令:
这两条命令处理接受到的数据包,匹配域:Vlan标签
如果Vlan号属于0,(h3属于Vlan0),则将数据包往1号端口发,也就是发给主机h1,从而实现h1和h3之间的通信;第四条同理,不再赘述
为s2配置流表项:
原理与s1配置类似
- 从1号或2号端口输入的数据包,则配上Vlan标签,1号端口输入的配上Vlan0(和h1在同一虚拟局域网),并向3号端口转发
- 2号端口输入的配上Vlan1标签(和h2在同一局域网),并向3号端口转发
- 从3号段口输入的数据包已经打过Vlan标记,对Vlan标记进行匹配,若为0则为发送给h3的数据包,若为1则为发送给h4的数据包
验证结果
符合h1和h3联通,h2和h4联通,其余不连通要求。
wireshark验证:
(二)进阶实验
要求:利用Python代码实现VlAN划分
- 分配ip
由于虚拟实现h1和h3在同一局域网,因此分配ip如下
- code
编写topo.py文件并运行
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import Link
from mininet.log import setLogLevel, info
def myNet():
"Create network from scratch using Open vSwitch."
info( "*** Creating nodes\n" )
switch1 = Node( 's1', inNamespace=False )
switch2 = Node( 's2', inNamespace=False )
h1 = Node( 'h1' )
h2 = Node( 'h2' )
h3 = Node( 'h3' )
h4 = Node( 'h4' )
info( "*** Creating links\n" )
Link( h1, switch1)
Link( h2, switch1)
Link( h3, switch2)
Link( h4, switch2)
Link( switch1, switch2)
info( "*** Configuring hosts\n" )
h1.setIP( '192.168.123.1/24' )
h2.setIP( '192.168.124.1/24' )
h3.setIP( '192.168.123.2/24' )
h4.setIP( '192.168.124.2/24' )
info( "*** Starting network using Open vSwitch\n" )
switch1.cmd( 'ovs-vsctl del-br dp0' )
switch1.cmd( 'ovs-vsctl add-br dp0' )
switch2.cmd( 'ovs-vsctl del-br dp1' )
switch2.cmd( 'ovs-vsctl add-br dp1' )
for intf in switch1.intfs.values():
print (intf)
print (switch1.cmd( 'ovs-vsctl add-port dp0 %s' % intf ))
for intf in switch2.intfs.values():
print (intf)
print (switch2.cmd( 'ovs-vsctl add-port dp1 %s' % intf ))
print (switch1.cmd(r'ovs-vsctl show'))
print (switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3'))
print (switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3'))
print (switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=0,actions=pop_vlan,output:1'))
print (switch1.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp0 priority=1,dl_vlan=1,actions=pop_vlan,output:2'))
print (switch2.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3'))
print (switch2.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3'))
print (switch2.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=0,actions=pop_vlan,output:1'))
print (switch2.cmd(r'ovs-ofctl -O OpenFlow13 add-flow dp1 priority=1,dl_vlan=1,actions=pop_vlan,output:2'))
#switch0.cmd('tcpdump -i s0-eth0 -U -w aaa &')
#h0.cmd('tcpdump -i h0-eth0 -U -w aaa &')
info( "*** Running test\n" )
h1.cmdPrint( 'ping -c 3 ' + h3.IP() )
h2.cmdPrint( 'ping -c 3 ' + h4.IP() )
h1.cmdPrint( 'ping -c 3 ' + h4.IP() )
h2.cmdPrint( 'ping -c 3 ' + h3.IP() )
#print switch0.cmd( 'ovs-ofctl show dp0' )
#print switch0.cmd( 'ovs-ofctl dump-tables dp0' )
#print switch0.cmd( 'ovs-ofctl dump-ports dp0' )
#print switch0.cmd( 'ovs-ofctl dump-flows dp0' )
#print switch0.cmd( 'ovs-ofctl dump-aggregate dp0' )
#print switch0.cmd( 'ovs-ofctl queue-stats dp0' )
info( "*** Stopping network\n" )
switch1.cmd( 'ovs-vsctl del-br dp0' )
switch1.deleteIntfs()
switch2.cmd( 'ovs-vsctl del-br dp1' )
switch2.deleteIntfs()
info( '\n' )
if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
myNet()
- 验证结果
验证1:直接在python脚本中验证
结果:
结果符合要求
验证2:通过wireshark验证
成功打上Vlan标签
- 错误总结
- 忘记为两台交换机设置连接,导致ping不通,太蠢了TAT
总结
实验总结
1)此次实验我学习了如何使用OvS命令让数据包打上Vlan标签,并学习了如何使用控制行实现流表下发。
2)通过进阶实验,我学习了如何使用python文件实现流表下发,并能在python文件中进行测试。编写python文件的过程中遇到不少bug,但通过不断尝试最终进行了解决,提升了我的问题解决能力及创新能力。
附:知识总结
实验原理:用VLAN技术可以设计广播域构成,交换机收到广播帧后,从而防止广播风暴
命令总结
创建ovs交换机过程
- 自动创建类型为internal的ovs-switch000网桥
sudo ovs-vsctl add-port ovs-switch000 p0
(通过ovs-vsctl show
解决报错)
2. 查询p0网口相关信息
sudo ethtool -i p0
- 创建虚拟网络空间ns0,把p0接口移入ns0,并配置IP
sudo ip netns add ns0
sudo ip link set p0 netns ns0
sudo ip netns exec ns0 ip addr add 192.168.1.100/24 dev p0
sudo ip netns exec ns0 ifconfig p0 promisc up
- 测试
sudo ip netns exec ns0 ping 192.168.1.101
- OVS命令
sudo ovs-ofctl show ovs-switch000
- OVS下发流表命令
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
查看流表项命令:
sudo ovs-ofctl -O OpenFlow13 dump-flows s1