OpenvSwitch系列之六 vlan隔离

局域网游戏代表:红色警戒
Open vSwitch系列之一 Open vSwitch诞生
Open vSwitch系列之三 ovs-vsctl命令使用
Open vSwitch系列之四 ovs-ofctl命令使用
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地址自学习功能。
sh ovs-ofctl add-flow s1 action=normal

主机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数据流是怎么样
ovs-dpctl dump-dps

可以看到在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,关系可以参考如下:

tag在openstack中使用
openstack有多种网络插件,其中最重要的就是ovs,即openvswitch-plugin。在使用ovs实现openstack中的各种网络时,这里各种网络指:local,flat,vlan,vxlan等,tag标签的使用可以说是每一种网络都离不开的。下面说说在各种网络中tag标签的使用。由于手头上没有openstack环境,这里借用我的云计算启蒙教程cloudman先生的每天五分钟玩转openstack系列来说明。
local网络
local网络是虚拟机的网络和网桥连接,但是网络和服务器网卡之间没有连接。流量限制在网桥内部。在local网络中,为了实现网络隔离,不同网络之间连接到网桥的tag是不一样的。在同一个tag下的网络可以互相通信,当然网络是访问不到外网的,则是local网络的最大特征。

flat网络
flat网络叫平面网络即为不带tag的网络。不带也是一种特征。flat网络模式下,每创建一个网络,就需要独占一块网卡,所以一般也不会使用这种网络作为租户网络。虽然说flat网络不带tag,但是其实是所有的port都使用了默认的tag号1,所以能够看到网桥中port都有tag为1。

vlan网络
vlan网络是tag在openstack中的一个重要应用,值得重点讲解。
vlan网络的模型如下:

在vlan网络中。每一个网络在br-int上的tag号都是不一样的,比如使用网络1创建的虚拟机,其port的tag是1,使用网络2创建的虚拟机,其port的tag是2。有了不同的tag就能够实现了vlan隔离。如下图:

但是只使用tag隔离不同网络还不算完成vlan网络。因为如果同一个网络下的两个虚拟机调度到不同的节点,那么流量要经过一个节点达到另一个节点肯定要经过物理交换机。前面说过tag号就是vlan id。在br-int上定义的tag号不会考虑物理交换机上的vlan id支持。通俗来说就是ovs是虚拟交换机,tag号自己管理,而物理交换机的vlan id是物理交换机管理。这两个vlan是不同设备的,所有不能保证可以直接通用。万一ovs定义的vlan为3000,而物理交换机不能识别呢?所以在br-ethx这个网桥上需要对ovs的vlan和物理交换机的vlan做一个转换。规则也很简单:
- 在br-ethx上对来自br-int 的数据,将vlan 1转化成物理网卡能通过的vlan 100
- 在br-int上对来自br-ethx的数据,将vlan 100转成ovs交换机能通过的vlan 1。
br-int上流表:
#ovs-ofctl dump-flows br-int
cookie=0x0, duration=100.795s, table=0, n_packets=6, n_bytes=468, idle_age=90, priority=2,in_port=3 actions=drop
cookie=0x0, duration=97.069s, table=0, n_packets=22, n_bytes=6622, idle_age=31, priority=3,in_port=3,dl_vlan=101 actions=mod_vlan_vid:1,NORMAL
cookie=0x0, duration=95.781s, table=0, n_packets=8, n_bytes=1165, idle_age=11, priority=3,in_port=3,dl_vlan=102 actions=mod_vlan_vid:2,NORMAL
cookie=0x0, duration=103.626s, table=0, n_packets=47, n_bytes=13400, idle_age=11, priority=1 actions=NORMAL
br-ethx上流表:
#ovs-ofctl dump-flows br-eth0
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=73.461s, table=0, n_packets=51, n_bytes=32403, idle_age=2, hard_age=65534, priority=4,in_port=4,dl_vlan=1 actions=mod_vlan_vid:101,NORMAL
cookie=0x0, duration=83.461s, table=0, n_packets=51, n_bytes=32403, idle_age=2, hard_age=65534, priority=4,in_port=4,dl_vlan=2 actions=mod_vlan_vid:102,NORMAL
cookie=0x0, duration=651.538s, table=0, n_packets=72, n_bytes=3908, idle_age=2574, hard_age=65534, priority=2,in_port=4 actions=drop
cookie=0x0, duration=654.002s, table=0, n_packets=31733, n_bytes=6505880, idle_age=2, hard_age=65534, priority=1 actions=NORMAL
vxlan网络
vxlan网络看似比较复杂,其实如果能够理解vlan网络的ovs tag和物理vlan id转换原理就好理解。vxlan数据构造比较特殊,其数据结构如下:

在正常的网络封装上还有外层,并且重要的是中间还有一个vxlan头。重点就在这个vxlan的头,vxlan头部中有一个tunnel id。不同的vxlan网络之间使用tunnel id来隔离。ovs实现的vxlan结构如下:

创建虚拟机之后,在br-int上的port会有tag号。不同的网络之间tag号是不一样的。那么分情况讨论:
- 如果同一网络的虚拟机都在一个计算节点,同一个br-int上,它们之间的tag是一样的,所以直接通过br-int转发数据。不同网络之间tag不同,br-int根据tag实现隔离。
- 如果同一网络的虚拟机分布在不同的计算节点上,这时就需要通过bt-tun这个网桥发送出去。在br-tun上维护了一个vlan和vxlan之间的转换关系。比如对于计算节点1来说:vlan 4 对应了 vxlan 256。这时bt-tun就会把vlan 为4 的数据经过vxlan封装,封装成vxlan 256的数据包,然后发送出。同样当br-tun接收到数据包时,会将vxlan转化成vlan,然后发送到br-int,br-int 根据不同的vlan转发到对应虚拟机。
将vlan转化成vxlan
cookie=0x9814613d8b13e33b, duration=355743.467s, table=22, n_packets=121, n_bytes=5490, idle_age=65534, hard_age=65534, priority=1,dl_vlan=786 actions=strip_vlan,load:0x25a->NXM_NX_TUN_ID[],output:3,output:2,output:5,output:4
cookie=0x9814613d8b13e33b, duration=335047.168s, table=22, n_packets=114, n_bytes=5460, idle_age=23232, hard_age=65534, priority=1,dl_vlan=788 actions=strip_vlan,load:0x222->NXM_NX_TUN_ID[],output:3,output:2,output:5,output:4
将vxlan 转化成vlan
cookie=0x9814613d8b13e33b, duration=355644.212s, table=4, n_packets=1025, n_bytes=107512, idle_age=17091, hard_age=65534, priority=1,tun_id=0x25a actions=mod_vlan_vid:786,resubmit(,10)
cookie=0x9814613d8b13e33b, duration=334947.915s, table=4, n_packets=8487, n_bytes=710987, idle_age=38, hard_age=65534, priority=1,tun_id=0x222 actions=mod_vlan_vid:788,resubmit(,10)
刚好这两条处理是相互的,可以清晰看出vlan和vxlan之间的转换。
最后这里有一个有意思的东西,前面说过vxlan网络下,使用tunnel id 隔离。在不同的计算节点上发现 相同的tunnel id 0x222 对应的vlan 是不一样的?为什么会这样?
root@compute15:~# ovs-ofctl dump-flows br-tun | grep 0x222
cookie=0xa6b0faa0153f7efc, duration=335373.158s, table=4, n_packets=4741, n_bytes=9326933, idle_age=26, hard_age=65534, priority=1,tun_id=0x222 actions=mod_vlan_vid:,resubmit(,10)
cookie=0xa6b0faa0153f7efc, duration=26.944s, table=20, n_packets=0, n_bytes=0, hard_timeout=300, idle_age=26, priority=1,vlan_tci=0x0e5e/0x0fff,dl_dst=fa:16:3e:22:69:3a actions=load:0->NXM_OF_VLAN_TCI[],load:0x222->NXM_NX_TUN_ID[],output:4
cookie=0xa6b0faa0153f7efc, duration=335373.162s, table=22, n_packets=133, n_bytes=36387, idle_age=23569, hard_age=65534, priority=1,dl_vlan=3678 actions=strip_vlan,load:0x222->NXM_NX_TUN_ID[],output:4,output:3,output:2,output:5

同一个tunnel 在不同节点的对应的tag号不一样,那不同节点上的虚拟机之间vlan不同能够正常访问吗?毫无疑问是可以的,为啥呢?因为在出服务器时br-tun已经将tag剥离,到了相应的服务器时会加上该tunnel id在该服务器上的对应的tag号。每一个服务器上tunnel id对应的tag都是不一样的,但是只要tunnel id一致就能走遍天下。
ovs实现的vlan就讲这么多,一个小小的tag最后发现能够成为openstack这种巨大架构中很重要的一部分,充分说明难度再大的技术都是由小知识点组成的,所以面对庞然大物时也不要心生畏惧,将其分解成一个个小知识就能掌握。学习如此,人生亦如是~
OpenvSwitch系列之六 vlan隔离的更多相关文章
- OpenvSwitch系列之ovs-vsctl命令使用
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl 命令使用 OpenvSwit ...
- OpenvSwitch系列之五 网桥特性功能配置
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...
- OpenvSwitch系列之八 vxlan隧道
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...
- OpenvSwitch系列之七 meter表限速
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...
- OpenvSwitch系列之ovs-ofctl命令使用
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl 命令使用 OpenvSwit ...
- Red Gate系列之六 SQL Test 1.0.12.3 Edition SQL测试工具 完全破解+使用教程
原文:Red Gate系列之六 SQL Test 1.0.12.3 Edition SQL测试工具 完全破解+使用教程 Red Gate系列之六 SQL Test 1.0.12.3 Edition S ...
- .NET 并行(多核)编程系列之六 Task基础部分完结篇
原文:.NET 并行(多核)编程系列之六 Task基础部分完结篇 .NET 并行(多核)编程系列之六 Task基础部分完结篇 前言:之前的文章介绍了了并行编程的一些基本的,也注重的讲述了Task的一些 ...
- .Neter玩转Linux系列之六:Linux下MySQL的安装、配置、使用
一.Linux安装MySQL (1)下载安装包:https://dev.mysql.com/downloads/mysql/ (2)解压并安装 命令:tar zxvf 文件名 解压完成之后,重名一下文 ...
- 单元测试系列之六:JUnit5 技术前瞻
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6868495.html JUnit ...
随机推荐
- Python3.x+Fiddler抓取APP数据
随着移动互联网的市场份额逐步扩大,手机APP已经占据我们的生活,以往的数据分析都借助于爬虫爬取网页数据进行分析,但是新兴的产品有的只有APP,并没有网页端这对于想要提取数据的我们就遇到了些问题,本章以 ...
- Python3中,map()函数、filter()函数、reduce()函数的比较
1.map(function,iterable):function为函数,或者lambda表达式,iterable是可迭代的序列,即对iterable中的每个item执行一遍function或者lam ...
- Java编译解释之cmd
一.编译 1. javac 类名.java (在类当前目录下) 2. javac 类的全路径 二.解释 1. java 类名(在类当前目录下) 2. java -cp 类的当前目录路径 类名
- java.util.Scanner中hasNext()方法和next()方法的区别
先说结论: 两者均根据空格划分数据 两者在没有数据输入时均会等待输入 next()方法会将空格划分的数据依次输出,运行一次,输出一个 hasNext()方法会跟着next()方法移动,当前数据不为空, ...
- python 文件读写with open模式r,r+,w,w+,a,a+的区别
模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 否,追加写
- vue.extend和vue.component的区别
vue.extend 使用基础 Vue 构造器函数,通过原型继承,(返回)创建一个"子类"(构造器).参数是一个包含组件选项的对象. const Sub = function Vu ...
- python基础 - 切片
今日学习内容 切片 取一个list或者tuple的部分数据是常见的操作 a = [1,2,3] 比如取第一个数我们可以用a[0]的方式,如果我们想取第一个和第二个就有点困难了,a[0-1]或者a[0] ...
- Android EditText判断输入的字符串是否为数字(包含小数点)
有时候项目需要获取EditText所输入的字符串为纯数字(含小数),一般情况下在xml中设置EditText的的属性(我是直接设置digits为数字和小数点,即digits="0123456 ...
- 测量定位实践-:C#采集控制
用Halcon已经完成采集,在在C#中不行. 其实还是比较简单,主要是Halcon封装的太好了. 主要是以下几个算子: *打开 Image Acquisitionopen_framegrabber ( ...
- Clickhouse单机及集群部署详解
一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内社区火热,各个大厂纷纷跟进大规模使用: 今日头条 内部用ClickHous ...