1.前言本文主要介绍了使用OVS实现VLAN组网的方法,并通过搭建基础测试环境来验证实验结果。关于VLAN和VLANTrunk的介绍,本站有一篇文章《VLAN Trunk在OpenStack Neutron及SDN中的实现》,详细介绍了基本原理和组网应用。读者可自行查阅。本文不介绍VLAN的技术原理。在OVS中,VLAN的概念与普通交换机相同。不同的是,在OVS中,可以通过流表修改VLAN值,这使得VLAN在OVS中的应用更加灵活。本文通过两个基本应用场景的例子来描述VLAN在OVS中的实现。第一种场景与普通交换机相同。通过access设置vlantag,通过trunk转发vlan报文,完成vlan组网;第二种场景使用OVS流表进行vlanid转换,完成vlan组网。2、应用场景一:传统的设置vlantags的方法如下图所示。多台PC连接到不同的SDN交换机,通过vxlan隧道组成一个大的二层网络。其中,交换机中的两个桥接端口eth1和eth2用于访问PC,vxlan端口通过eth0访问Internet,完成隧道封装和传输。OVS通过VLAN组网将PC1和PC2划分到VLAN100中,取代PC3和PC4。划分VLAN200,实现二层网络隔离。(1)配置创建ovs桥Java的命令#ovs-vsctladd-brbr-ovseth1和eth2加入OVSJava#ovs-vsctladd-portbr-ovseth1#ovs-vsctladd-portbr-ovseth2设置eth1和eth2接口访问类型并配置tagJava#ovs-vsctlsetPorteth1tag=100#ovs-vsctlsetPorteth2tag=100创建vxlan端口并加入OVSJava#ovs-vsctladd-portbr-ovsvxlan--setinterfacevxlantype=vxlanoptions:remote_ip=x.x.x.xoption:key=1设置vxlan端口为trunk类型并配置vlanJava可以被转发#ovs-vsctlsetPortvxlantrunks=100,200端口默认类型为trunk,如果需要转发所有vlan包,这个配置可以省略(2)在测试结果中查看ovs当前配置java#ovs-vsctlshowPC1,PC2,PC3,PC4设置地址在同一个网络中,可以ping通PC1和PC3,PC2和PC4可以互通,PC1,PC2和PC4不能互通,VLAN起到了网络隔离;通过在eth0上抓包可以看到vxlan封装的vlan100和200包。3、应用场景二:OVS流表转换实现vlan组网该场景下,连接OVS的部分端口包有自己的vlan,需要将OVS转发的对应端口转换为其他vlan值(类似OpenStackVLAN)网络服务中的网络模式),我们使用下图所示的网络进行实验测试,其中eth0端口连接的物理链路包分别有vlan100和200,对应的内部虚拟主机VM1和VM2分别使用vlan1和2用于网络隔离。这里使用OVS完成vlan100和vlan1、vlan200和vlan2的内外vlan标签的转换。(1)实现原理为了实现vlan的转换对应,我们使用OVS搭建了两个网桥,一个网桥用于将传入的vlan100和vlan200报文转换为vlan1和vlan2报文,另一个网桥用于将传入的vlan1报文进行转换和vlan2包分别是vlan100和vlan200,两个OVS网桥通过patch端口连接,vlan的转换是通过流表实现的,网络结构图如下:(2)配置创建ovs网桥的命令Java#ovs-vsctladd-brbr-eth#ovs-vsctladd-brbr-tapportjoinovsbridgeJava#ovs-vsctladd-portbr-eth0#ovs-vsctladd-portbr-taptap1#ovs-vsctladd-portbr-taptap2设置tap1和tap2的tagJava#ovs-vsctladd-portbr-taptap1tag=1#ovs-vsctladd-portbr-ethpatch-eth--setinterfacepatch-ethtype=patchoptions:peer=patch-tap#ovs-vsctladd-portbr-tappatch-tap--setinterfacepatch-taptype=patchoptions:peer=patch-eth查看OVS配置(实验测试中,tap1和tap2换成eth1和deth2)br-eth设置OVS流表完成vlan转换(eth0的端口号为1)java#ovs-ofctladd-flowbr-ethin_port=1,priority=2,dl_vlan=100,actions=mod_vlan_vid:1,NORMAL#ovs-ofctladd-flowbr-ethin_port=1,priority=2,dl_vlan=100,actions=mod_vlan_vid:1,NORMAL#ovs-ofctladd-flowbr-ethin_port=1,priority=1,actions=dropbr-tap设置OVS流表完成vlan转换(tap1的端口号为1,tap2的端口号为2)java#ovs-ofctladd-flowbr-tapin_port=1,priority=2,dl_vlan=1,actions=mod_vlan_vid:100,NORMAL#ovs-ofctladd-flowbr-tapin_port=2,priority=2,dl_vlan=2,actions=mod_vlan_vid:200,NORMAL#ovs-ofctlad-flowbr-tapin_port=1,priority=1,actions=drop#ovs-ofctladd-flowbr-tapin_port=2,priority=1,actions=drop(3)测试结果通过交换机发送vlan100包到??eth0,tcpdumpsoneth0抓包可以看到vlan100的包,如下图:在接口tap1(eth1)上抓包,可以看到vlan1转换后的包:将vlan1的包通过VM1发送到tap1,可以看到通过抓包vlan1的数据包:在接口eth0上抓包,可以看到转换后的vlan100的数据包:从以上两种方式的测试结果可以验证vlan转换成功实现对VLAN组网的理解和优化满足您自己的虚拟化网络的应用程序。
