1. 前言
本文主要介绍使用OVS实现VLAN组网的方法,并通过搭建基本的测试环境来验证实验结果。关于VLAN和VLAN Trunk的介绍,本站有篇文章《VLAN Trunk在OpenStack Neutron及SDN中的实现》中进行了基本原理和组网应用的详细描述,读者可以自行参考,本文不再对VLAN技术原理进行描述。
在OVS中,VLAN的概念和普通交换机一样,不同的是,在OVS中可以通过流表进行VLAN值的修改,这就使得VLAN在OVS中的应用更加灵活。本文通过举例两种基本的应用场景讲述OVS中的VLAN实现,其中场景一和普通交换机工作原理相同,通过access进行设置vlan tag,通过trunk进行转发vlan报文来完成vlan组网;场景二使用OVS的流表进行vlan id的转换来完成vlan的组网。
2. 应用场景一:传统方式设置vlan tag
如下图所示,多台PC设备分别接入不同的SDN交换机,通过vxlan隧道组成大二层网络。其中交换机中的eth1和eth2两个桥端口用于接入PC,vxlan端口通过eth0接入Internet并完成隧道封装和传输,OVS通过VLAN组网把PC1和PC2划分为VLAN 100,把PC3和PC4换分为VLAN 200,从而实现二层的网络隔离。
(1) 配置命令
创建ovs桥Java
- # ovs-vsctl add-br br-ovs
eth1和eth2加入OVSJava
- # ovs-vsctl add-port br-ovs eth1
- # ovs-vsctl add-port br-ovs eth2
设置eth1和eth2接口为access类型并配置tagJava
- # ovs-vsctl set Port eth1 tag=100
- # ovs-vsctl set Port eth2 tag=100
创建vxlan端口并加入OVSJava
- # ovs-vsctl add-port br-ovs vxlan -- set interface vxlan type=vxlan
- options:remote_ip=x.x.x.x option:key=1
设置vxlan端口为trunk类型并配置可以转发的vlanJava
- # ovs-vsctl set Port vxlan trunks=100,200
端口默认类型为trunk,如果需要转发所有vlan报文,该配置可以省略
(2) 测试结果
查看ovs的当前配置Java
- # ovs-vsctl show
PC1、PC2、PC3、PC4设置地址在同一子网中,可以通过ping测试PC1和PC3,PC2和PC4可以互通,PC1和PC2、PC4无法互通,VLAN起到了网络隔离的作用;通过在eth0抓包可以看到vxlan封装的vlan100和200报文。
3. 应用场景二:OVS流表转换实现vlan组网
这种场景下,接入OVS的某些端口报文自身带有vlan,而转发出去的OVS对应端口需要转换成其它vlan值(类似于OpenStack网络服务中的VLAN网络模式),我们用下图所示的组网进行实验测试,其中接入eth0端口的物理链路报文分别带有vlan 100和200,对应的内部虚拟主机VM1和VM2分别使用vlan 1和2进行网络隔离,这里采用OVS完成vlan100和vlan1,vlan200和vlan2的内外部vlan tag的转换。
(1) 实现原理
为了实现vlan的转换对应关系,我们用OVS建立两个桥,一个桥用于转换进入的vlan100和vlan200报文为vlan1和vlan2报文,另个一桥用于转换进入的vlan1和vlan2报文为vlan100和vlan200,两个OVS桥采用patch port进行连接,vlan的转换采用流表实现,网络结构图如下所示:
(2) 配置命令
创建ovs桥Java
- # ovs-vsctl add-br br-eth
- # ovs-vsctl add-br br-tap
端口加入ovs桥Java
- # ovs-vsctl add-port br-eth eth0
- # ovs-vsctl add-port br-tap tap1
- # ovs-vsctl add-port br-tap tap2
设置tap1和tap2的tagJava
- # ovs-vsctl set Port tap1 tag=1
- # ovs-vsctl set Port tap2 tag=2
连接ovs桥Java
- # ovs-vsctl add-port br-eth patch-eth -- set interface patch-eth type=patch options:peer=patch-tap
- # ovs-vsctl add-port br-tap patch-tap -- set interface patch-tap type=patch options:peer=patch-eth
查看OVS配置(实验测试中tap1和tap2用eth1和eth2代替)
br-eth设置 OVS流表完成vlan转换(其中eth0的端口号为1)Java
- # ovs-ofctl add-flow br-eth in_port=1,priority=2,dl_vlan=100,actions=mod_vlan_vid:1,NORMAL
- # ovs-ofctl add-flow br-eth in_port=1,priority=2,dl_vlan=100,actions=mod_vlan_vid:1,NORMAL
- # ovs-ofctl add-flow br-eth in_port=1,priority=1,actions=drop
br-tap设置 OVS流表完成vlan转换(其中tap1的端口号为1,tap2端口号为2)Java
- # ovs-ofctl add-flow br-tap in_port=1,priority=2,dl_vlan=1,actions=mod_vlan_vid:100,NORMAL
- # ovs-ofctl add-flow br-tap in_port=2,priority=2,dl_vlan=2,actions=mod_vlan_vid:200,NORMAL
- # ovs-ofctl add-flow br-tap in_port=1,priority=1,actions=drop
- # ovs-ofctl add-flow br-tap in_port=2,priority=1,actions=drop
(3) 测试结果
通过交换机发送vlan100的报文到eth0,在eth0上tcpdump抓包可以看到vlan100的报文,如下图所示:
在接口tap1(eth1)上抓包可以看到已经转换后的vlan1报文:
通过VM1发送vlan1的报文到tap1,抓包可以看到vlan1的报文:
在接口eth0上抓包可以看到已经转换后的vlan100的报文:
从上面双向测试结果可以验证,vlan的转换成功。4 总结
读者可以通过对上述两种应用场景中OVS的VLAN实现理解,优化出满足于自己的虚拟化网络的VLAN组网应用。