基于OVS的VLAN应用及实现

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

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

[[210861]]

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组网应用。

责任编辑:赵宁宁 来源: SDNLAB
相关推荐

2017-12-21 03:46:26

OVSVLANDHCP

2014-11-06 09:36:50

OVSvlan

2014-06-23 09:48:02

VLAN

2020-02-13 20:13:35

Google-S2 算法服务旅行记录

2011-03-08 11:08:55

VLAN

2012-05-24 09:18:34

ibmdw

2021-09-12 22:23:14

区块链比特币技术

2023-06-12 07:50:45

2009-02-12 09:55:22

AjaxMVCDojo

2012-05-03 09:58:19

VLANVLAN划分

2009-12-30 10:33:19

VLAN技术

2014-06-30 09:32:24

VLAN交换机

2009-12-11 11:23:20

设置策略路由

2012-12-19 11:32:55

路由器VLAN

2024-01-11 15:54:55

eTS语言TypeScript应用开发

2023-04-19 08:43:52

Python面向对象编程

2024-02-06 08:18:30

用户画像标签数字化异常值处理

2022-06-28 14:42:26

ETS购物车应用

2013-11-06 10:28:14

IEEE 802.1Q VLAN Linux

2013-12-06 09:18:44

点赞
收藏

51CTO技术栈公众号