|
|
|
|
移动端

基于OVS的VLAN应用及实现

本文通过举例两种基本的应用场景讲述OVS中的VLAN实现,其中场景一和普通交换机工作原理相同,通过access进行设置vlan tag,通过trunk进行转发vlan报文来完成vlan组网;场景二使用OVS的流表进行vlan id的转换来完成vlan的组网。

作者:刘成天来源:SDNLAB|2017-11-22 14:08

【新品产上线啦】51CTO播客,随时随地,碎片化学习

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的组网。

OVS实现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

  1. # ovs-vsctl add-br br-ovs 

eth1和eth2加入OVSJava

  1. # ovs-vsctl add-port br-ovs eth1 
  2. # ovs-vsctl add-port br-ovs eth2 

设置eth1和eth2接口为access类型并配置tagJava

  1. # ovs-vsctl set Port eth1 tag=100 
  2. # ovs-vsctl set Port eth2 tag=100 

创建vxlan端口并加入OVSJava

  1. # ovs-vsctl add-port br-ovs vxlan -- set interface vxlan type=vxlan 
  2. options:remote_ip=x.x.x.x option:key=1 

设置vxlan端口为trunk类型并配置可以转发的vlanJava

  1. # ovs-vsctl set Port vxlan trunks=100,200 

端口默认类型为trunk,如果需要转发所有vlan报文,该配置可以省略

(2) 测试结果

查看ovs的当前配置Java

  1. # 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

  1. # ovs-vsctl add-br br-eth 
  2. # ovs-vsctl add-br br-tap 

端口加入ovs桥Java

  1. # ovs-vsctl add-port br-eth eth0 
  2. # ovs-vsctl add-port br-tap tap1 
  3. # ovs-vsctl add-port br-tap tap2 

设置tap1和tap2的tagJava

  1. # ovs-vsctl set Port tap1 tag=1 
  2. # ovs-vsctl set Port tap2 tag=2 

连接ovs桥Java

  1. # ovs-vsctl add-port br-eth patch-eth -- set interface patch-eth type=patch options:peer=patch-tap 
  2. # 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

  1. # ovs-ofctl add-flow br-eth in_port=1,priority=2,dl_vlan=100,actions=mod_vlan_vid:1,NORMAL 
  2. # ovs-ofctl add-flow br-eth in_port=1,priority=2,dl_vlan=100,actions=mod_vlan_vid:1,NORMAL 
  3. # ovs-ofctl add-flow br-eth in_port=1,priority=1,actions=drop 

br-tap设置 OVS流表完成vlan转换(其中tap1的端口号为1,tap2端口号为2)Java

  1. # ovs-ofctl add-flow br-tap in_port=1,priority=2,dl_vlan=1,actions=mod_vlan_vid:100,NORMAL 
  2. # ovs-ofctl add-flow br-tap in_port=2,priority=2,dl_vlan=2,actions=mod_vlan_vid:200,NORMAL 
  3. # ovs-ofctl add-flow br-tap in_port=1,priority=1,actions=drop 
  4. # 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组网应用。

【编辑推荐】

  1. 虚拟化部署之linux网卡的VLAN配置
  2. 混合虚拟化网络,网络性能优化之辩
  3. 思科推全功能型平台 为移动运营商提供虚拟化网络服务
  4. 可用性追踪是虚拟化网络的关键
  5. 如何使用三层交换机构建企业VLAN
【责任编辑:赵宁宁 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢

热门职位+更多

读 书 +更多

J2EE开发全程实录

J2EE是目前企业级软件开发的首选平台。本书从架构的角度讲解了一个完整的J2EE系统的搭建。内容包括:正则表达式、JSP、Swing、XML等技术在...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊