OpenvSwitch系列之六 vlan隔离

ovs交换机可以实现vlan的隔离,功能上类似于普通交换的vlan隔离。并且vlan隔离在openstack的网络各种发挥着十分重要的作用。ovs的隔离通通过tag标签来实现。下面首先使用mininet仿真软件创建一个最简单的拓扑,然后设置端口tag来实现vlan。

 Mininet创建简单拓扑

mininet是SDN学习中用来创建各种拓扑的仿真软件,能够使用最小的消耗完成主机,交换机,控制器的模拟。使用mn命令创建两个主机连接到一个交换机中的拓扑。

 查看交换机的端口。两个主机连接到交换机的两个端口,分别是s1-eth2,s1-eth2。所有的端口默认其实都是有tag的,tag为0,但不会显示在这里。

打开h1

mininet 仿真器可以打开任何一个模拟出来的设备,可以将新开的端口看做一个虚拟机。

 主机h1这时还不能和主机h2通信,因为ovs交换机中没有任何流表。

下发正常转发流表

action=NORMAL的流表意思是该交换机配置成一个正常传统交换机工作。ovs交换机有两种工作模式:SDN模式和传统模式。传统的ovs交换机是通过mac地址自学习来完成数据帧交换,SDN模式是交换机里的流表匹配数据流然后有相应的转发动作。这里就是让交换机实现mac地址自学习功能。

 主机1能够ping通主机2

查看mac地址自学习表,可以看到这个时候交换机的端口,特别是VALN都是0。

设置tag号

tag是在端口上设置的,使用命令将tag号打在端口上。

ovs-vsctl set Port s1-eth1 tag=100
ovs-vsctl set Port s1-eth2 tag=200

再次让h1 ping h2 可以发现已经无法通信了。

查看交换机的mac地址自学习表,能够看到VLAN发生了变化。正是这种LVAN的变化导致数据

ovs-dpctl:可以统计每条 datapath 上的设备通过的流量,打印流的信息。datapath模块是最底层交换机机制的实现,功能是接收网包-查表-执行action。下面使用dpctl查看经过datapath数据流是怎么样

可以看到在h1 h2互相ping时的数据流。

 

recirc_id(0),in_port(1),eth(src=46:5d:b5:ee:45:bf,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=10.0.0.2,tip=10.0.0.1,op=1/0xff), 
packets:59, bytes:2478, used:0.528s, actions:push_vlan(vid=200,pcp=0),3
recirc_id(0),in_port(2),eth(src=be:1c:a1:b5:c5:9f,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),arp(sip=10.0.0.1,tip=10.0.0.2,op=1/0xff), 
packets:78, bytes:3276, used:0.799s, actions:push_vlan(vid=100,pcp=0),3 

这两条经过的数据流分别是h2和h1发出的。其中action表明了该条流vlan的产生过程。数据帧进入s1是不带vlan的,因为ovs是软件模拟,所以datapath负责对设置了tag的端口在数据帧中加入tag(个人理解)。从h2出来的数据帧进入datapath打上vlan tag200,从h1出来的数据帧进入datapath打上vlan tag100。正是因为数据流的tag导致了匹配之后无法转发。

注意这里的in_port并不是网桥s1上的port,而是datapath自己的的port,关系可以参考如下:

猜你喜欢

转载自www.cnblogs.com/goldsunshine/p/12748378.html