我有一个虚拟机在 x86 主机上运行,使用libvirt
. VM的界面创建如下:
<interface type='bridge'>
<mac address='52:54:00:d0:18:eb'/>
<source bridge='intfe2'/>
<target dev='vnet4'/>
<model type='virtio'/>
<alias name='net4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>
intfe2
= 主机上存在的 Linux 网桥如下:
# brctl show intfe2
bridge name bridge id STP enabled interfaces
intfe2 8000.90e2bab68ff8 no enp2s0f0
vnet4
现在,LACP 在虚拟机内部的接口上配置,并且在使用主机vnet4
接口的实际路由器上配置了相同的配置。enp2s0f0
我可以看到来自主机上这两个接口的多播帧。
# tcpdump -ni vnet4 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vnet4, link-type EN10MB (Ethernet), capture size 262144 bytes
15:56:48.160017 34:30:b4:59:06:00 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
15:56:49.162163 34:30:b4:59:06:00 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
# tcpdump -ni enp2s0f0 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:57:46.173002 ac:4b:c8:89:d7:c1 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
15:57:47.171282 ac:4b:c8:89:d7:c1 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
15:57:48.171252 ac:4b:c8:89:d7:c1 > 01:80:c2:00:00:02, ethertype Slow Protocols (0x8809), length 124: LACPv1, length 110
我正在运行 Ubuntu Xenial:
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04
Codename: xenial
我的问题是:
- 为什么它们没有被淹没?
- linux 网桥是否避免转发 L2 多播帧?
从一些链接,如Linux 虚拟交换机中的多播帧我什至禁用了 IGMP 监听,如下所示:
echo "0" > /sys/devices/virtual/net/intfe2/bridge/multicast_snooping
还可以切换以下值:/sys/devices/virtual/net/intfe2/bridge/multicast_querier
有什么指点吗?
答案1
我认为您遇到的问题是,默认情况下,Linux 网桥不会将帧转发到 01:80:c2:00:00:00 到 01:80:c2:00:00 范围内的目标 MAC 地址:0f。 IEEE 为不得由 MAC 桥转发的协议保留了该地址块。 LLDP、LACP、xSTP等协议都在这个范围内。
IEEE 有一篇很好的文章,标准组 MAC 地址:教程指南。如果您愿意,可以重新编译桥接内核模块以允许转发这些帧,但这样做需要您自担风险!您需要编辑并将for<source_path>/net/bridge/br_private.h
设置为。编译并重新加载驱动程序,然后运行:#define
BR_GROUPFWD_RESTRICTED
0x0u
echo 255 > /sys/class/net/<bridge_name>/bridge/group_fwd_mask
请注意,这不仅允许 LLDP 通过,还允许生成树帧通过。因此请确保不要引入任何桥接循环!
答案2
对我来说,利用现有信息准确理解您的设置有点困难。但我会给你我的设置,以便你可以查看和比较。网桥上的多播至关重要的是多播侦听,因此网桥知道哪个端口已加入多播组,并且只能将多播流转发到该端口。 multicast_snooping 的默认设置为打开。所以我不会禁用它。
如果我查看网桥上接口的设置,它会向我显示以下内容:
host ~$ sudo bridge -d link show
3: enp1s0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 4
hairpin off guard off root_block off fastleave on learning on flood on mcast_flood on
5: vnet0 state UNKNOWN : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100
hairpin off guard off root_block off fastleave on learning on flood off mcast_flood on
重要的是mcast_flood on
这是默认设置。fastleave on
很高兴拥有,但多播不需要。它仅适用于在访客离开组时离开多播组而不会在网桥上超时。flood on/off
属于单播,这里不相关。
如果访客加入多播组(启动多播客户端程序),则网桥会监听它并将其添加到其多播数据库(mdb)中。我用以下方法检查:
host ~$ sudo bridge -d -s mdb show
dev br0 port vnet0 grp 239.255.255.250 temp vid 10 257.14
router ports on br0: enp1s0 238.17 temp
我只有一个正在运行的 upnp 客户端 (grp 239.255.255.250) 并使用 VLAN 10。如果访客不发送 igmp REPORT 来停留更长时间,则它仍将在多播组中停留 257.14 秒。网桥发现下一个多播路由器(源)位于端口上恩普1s0如果源之前没有发送 igmp QUERY,则会在 238.17 秒后将其踢出。
在运行的多播流上,我看到以下 igmp 消息:
host ~$ sudo tcpdump -i vnet0 -n igmp
18:38:59.628249 IP 192.168.10.2 > 224.0.0.1: igmp query v3
18:39:02.502110 IP 192.168.10.106 > 224.0.0.22: igmp v3 report, 2 group record(s)
18:41:04.647731 IP 192.168.10.2 > 224.0.0.1: igmp query v3
18:41:13.061858 IP 192.168.10.106 > 224.0.0.22: igmp v3 report, 2 group record(s)
18:43:09.637111 IP 192.168.10.2 > 224.0.0.1: igmp query v3
18:43:19.525836 IP 192.168.10.106 > 224.0.0.22: igmp v3 report, 2 group record(s)
...
192.168.10.2 是我的互联网路由器(多播源),192.168.10.106 是带有流媒体客户端的访客。