踩坑经验之OVS跨子网流表以及vlan操作

作者简介:徐小冰:毕业于河北大学,主要从事嵌入式软件开发,虚拟化,SDN。目前基于ODL和Open vSwitch进行二次开发,希望与广大网友一起探讨学习。作者系OpenDaylihgt群(194240432)资深活跃用户,@IT难人

虽然在去年研究过OpenvSwitch(ovs)源码,但是真正玩ovs还是最近这两个多月。为了记录学习历程(呕心沥血),为了后者少陷入深坑(无底洞),特地总结一下。本篇主要是介绍以下两个方向:跨子网流表和vlan操作。

一、跨子网流表

虽然网络上有很多关于如何下发流表,如何把多个主机互联的文章,但是关于跨子网多主机互联的场景,却是凤毛菱角啊,我们要玩就模拟真实网络,对于简单网络没有任何意义。

在研究跨子网应该如何下发流表,这边博客受益匪浅http://hwchiu.logdown.com/posts/203260-mininet-and-network-subnet (台湾同胞),下面进入正题

网络topo环境


组网介绍:

1)以上环境均在一台机器上,这台机器有多个物理网卡。
2)两个虚拟机交换机:brA和brB
Mac地址自动生成,ip地址手动配上。为什么要给他们配上ip地址呢?虚拟交换机作为三层转发工能,换句话说就是交换机当网关路由器用。
3)四台kvm虚拟机:a1,a2,b1,b2
网上有很多例子都是基于mininet,这种组网虽然很方便,但也有很多缺陷和不足,所以一开始定位就是要搞真实网络环境。虚拟机ip地址、mac地址手动配置好。
4)交换机互联
使用其中两个网卡:em3、em4,分别加入到brA,brB中,并且将em3和em4用网线连接。如果没有多余网卡,可以采用patch方式连接,可以参考:http://blog.csdn.net/qiqishuang/article/details/51546673

1、创建topo

下面是操作命令行:
1)创建网桥

2)将物理网卡em3 em4 托管到网桥中

3)网桥设置ip地址

2、下发流表(命令行)

在下发流表之前,需要先启动虚拟机,按照如下顺序启动:a1,a2,b1,b2。启动完成后,查看网桥brA信息,为什么要查看端口编号呢?下发流表的时候需要使用到。

这个实验中,我们只用命令行,不连接控制器,原因有2个:

  • 连接控制器后,控制器会下发一些默认流表,可能会影响到我们实验过程。
  • 由于流表项内容比多,通过控制器下发流表比较麻烦。

ovs有两种工作模式:standalone和secure

standalone(默认):
在三次探测控制器连接不成功后,此时ovs-vswitchd将会接管转发逻辑(后台仍然尝试连接到控制器,一旦连接则退出fail状态),OpenvSwitch将作为一个正常的mac 学习的二层交换机。

secure:ovs-vswitchd将不会自动配置新的转发流表,OpenvSwitch将按照原先有的流表转发。
因此需要设置ovs模式为secure,这样能保证ovs完全按照我们自己下发的流表规则进行转发,不会有其他的干扰。

以上流程如果正确的话,查看流表信息,应该是这样的(流表空):

I:打通同一子网
通过vnc登录虚拟机a1,然后ping a2,会发现无法ping通,如下图:

我们开始配置流表:

这个时候我在ping a2,仍发现无法ping通。原因是:需要处理arp请求。

配置完arp流表项,此时在去ping a2 发现可以通了!!

对于网桥brB下发类似,请自行参考。
II:打通跨子网
对于同一个网络,下发的流表比较简单,跨子网就比较麻烦了,需要打通两个网桥之间路由转发(对于码农的我,不了解网络,陷入这个坑很长一段时间)。

若实现跨子网通信(a1和b1),必须存在网关和路由才行。针对在我们的模拟环境根本没有网关,因此需给brA,brB设置两个ip地址,让对应的vm虚拟机把br当做网关,这就是为什么在文章开始的时候给brA,brB设置IP的原因。
我们需要把vm和br之间的路由打通,因此需要进行如下配置:

我们需要把vm和br之间的路由打通,因此需要进行如下配置:


对于brB流表配置类似,请自行尝试。我们现在将a1和b1打通网络,下发如下命令:

brA增加流表:

brB增加流表:

下面是ping结果:

对于a1和b2,a2和b2之间流表使类似的,可以自行尝试。

为了方便测试,下面是流表最终内容:

【遗留问题--需要网友帮忙支持】
虽然a1可以ping通b1,但是a1 不能ping通brB,即使我增加了对应流表处理
brA:增加的处理:

brB增加的处理:

通过抓em4网卡数据报文,arp reply没有回:

如果有哪位朋友知道如何解决,请帮忙支招,不胜感激!!

二、Vlan操作

接下来研究一下vlan,vlan的拓扑图和上面类似:

组网介绍:
1)brA,brB不在拥有ip地址
2)通过ovs命令行,将em3,em4设置trunk,vlan取值为10和20
3)通过ovs命令行,让brA,brB连接控制器,控制器采用floodlight(odl太复杂,太臃肿)。
一切环境都弄好之后,连接控制器,然后a1 ping b1,发现是可以ping通,此时候查看流表:

但是会发现第一个包响应时间很长,这是为什么呢?查看流表得知:

从图中可知有一个默认流表项,默认是把不识别的报文转发给控制器,当我们用h1 ping h3的时候会发现,流表项多了几条:

为了保证不影响测试,避免控制器自动下发流表,将默认流表项删除掉:

通过控制器下发流表,最终显示结果如下,发现有802.1Q头:


对于h2和h4的流表配置,可参考下面流表内容:

【大坑】
例如flow_vlan_tag_3,流表项中set_field=eth_vlan_vid->20,这个地方20,就是vlan值,是不包含第13bit的有效标志位。
例如flow_vlan_tag_4,match域中"eth_vlan_vid":"4116",这个4116是包含第13bit的有效标志位
例如flow_vlan_tag_4,如果想增加pop_vlan这个操作必须,在match域中有eth_vlan_vid和eth_type两个,并且这两个参数要设置对,否则ovs会报错的!!

验证vlan trunk功能:
通过ovs命令行将em3,em4的trunk范围改成100,20,然后h1 ping h3是无法ping通的!!此处不再展示演示结果

三、感谢网友

由于本人不是网工,不是很了解网络,因此在研究二层转发、三层路由的时候很费劲,再此期间,感谢广东-Jino(QQ群),星月-我们最终毕业(QQ群),张东亚(微信群)以及其他帮助我的网友。希望这篇文章能够帮助更多的人。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/19532.html
分享到:
相关文章
条评论

登录后才可以评论

xxb249 发表于17-07-05
1