Linux 网桥中的组播帧被丢弃

Linux 网桥中的组播帧被丢弃

我有一个虚拟机在 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

我的问题是:

  1. 为什么它们没有被淹没?
  2. 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设置为。编译并重新加载驱动程序,然后运行:#defineBR_GROUPFWD_RESTRICTED0x0u

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 是带有流媒体客户端的访客。

相关内容