1. 去混杂模式
1.1 背景
混杂模式(Promiscuous Mode)是指一台机器能够接收所有经过它的数据流,而不论其目的地址是否是它。是相对于通常模式(又称“非混杂模式”)而言的。
这被网络管理员使用来诊断网络问题,但是也被无认证的想偷听网络通信(其可能包括密码和其它敏感的信息)的人利用。
在云计算openstack背景下,去混杂模式就是要抑制未知单播,只让目的mac是自身的报文或者广播/组播报文才允许进入虚拟机,减少不必要的虚拟机对报文处理所需的性能消耗。
1.2 未知单播
未知单播,即设备MAC表中没有该单播帧的目的MAC条目。
在交换机工作原理中,当交换机起动时,MAC地址表是空的,所以如果此时A主机发送一个帧给主机B,那么当交换机接受此帧的时候,查看源地址(主机A),并将它添加到MAC地址表中,但是交换机并不知道主机B在哪个端口上(MAC地址表中没有主机B的MAC地址),所以这个帧就是 未知单播帧 。交换机会泛洪这个帧。
1.3 组网图
1.4 流表分析
混杂模式时,policy网桥流表类似"...actions=normal...",不对流量进行区别,按正常转发即可。
去混杂模式时,policy网桥会添加以下相关流表:
priority=,in_port=,dl_dst=:::::/:::::,action=normal //广播、组播报文正常转发
priority=,in_port=,dl_dst=$vm_mac,actions=normal //对目的地址是VM本身mac的报文则正常转发
prrority=,in_port=,actions=drop //其他报文就丢弃
2. vlan in vxlan
2.1 作用
虚拟机之间通信的vlan报文能够封装到vxlan中在外部网络中传输,类似于qinq(vlan in vlan)。
2.2 组网图
2.3 流表分析
- policy网桥
- 虚拟机出来的报文
不带vlan信息的报文,在pkt_mark做下标记后往下送,pkt_mark 信息存储在寄存器中:
vlan_tci = 0x0000/0x1ffff actions=load:1 -> NXM_NX_PKT_MARK[..], normal
带vlan的报文,将vlan信息(共12bit)保存在pkt_mark后往下送:
actions = move:OXM_OF_VLAN_VID[..] -> NXM_NX_PKT_MARK[..], load: 0-> NXM_NX_PKT_MARK[..], strip_vlan, normal
- 进入虚拟机的报文
pkt_mark为0x1的报文,直接送往虚拟机:
pkt_mark = 0x00000001 actions = normal
pkt_mark不为0x1的报文,从pkt_mark获取到vlan信息后送往虚拟机:
actions = move:NXM_NX_PKT_MARK[..] -> OXM_OF_VLAN_VID[..], normal
- br-tun网桥
- 虚拟机出来的报文
pkt_mark为0x1的报文,按正常流程直接走table 20/22 :
pkt_mark = 0x00000001, actions = resubmit(,) / (,)
pkt_mark不为0x1的报文,获取并设置vlan信息,设置vni后走vxlan隧道出主机:
actions = move:NXM_NX_PKT_MARK[..] -> OXM_OF_VLAN_VID[..], set_tunnel:0x1388, output:
- 进入虚拟机的报文
报文不带vlan信息时,设置pkt_mark标志后,按照正常流程走table 10:
vlan_tci = 0x0000/0x1fff, tunnel_id = 0x1388, actions = load: -> NXM_NX_PKT_MARK[..], resubmit(, )
报文带vlan信息时,保存vlan信息到pkt_mark中,并将vxlan的vni修改为local vlan
tun_id = 0x1388, actions = move: OXM_OF_VLAN_VID[..] -> NXM_NX_PKT_MARK[..], load: ->NXM_NX_PKT_MARK[..], mod_vlan_vid:, resubmit(, )