IGMP 和 MLD 侦听
IGMP 和 MLD 侦听可防止本地网络上的主机接收其未明确加入的组播组的流量。IGMP 侦听适用于 IPv4 环境,而 MLD 侦听适用于 IPv6 环境。
Cumulus Linux 内核中的桥驱动程序包含 IGMP 和 MLD 侦听。如果禁用 IGMP 或 MLD 侦听,则组播流量将洪泛到桥中的所有桥端口。同样,在 VLAN 中没有接收器的情况下,组播流量将洪泛到 VLAN 中的所有端口。

配置 IGMP 和 MLD 查询器
在没有组播路由器的情况下,IP 子网中的单个交换机可以协调组播流量。此交换机是查询器或指定路由器。查询器生成查询消息以检查组成员身份,并处理成员报告和离开消息。
要在交换机上为 VLAN 感知桥配置查询器,请在桥上启用组播查询器,并将查询的源 IP 地址添加到 VLAN。
在配置查询器之前,请确保配置桥、VLAN 和端口。
以下示例
- 配置名为
br_default
的桥,该桥包括 VLAN 10,并将 swp1 分配给该桥。 - 启用组播查询器,并将查询的源 IP 地址设置为 10.10.10.1(交换机的环回地址)。
cumulus@switch:~$ nv set interface swp1-3 bridge domain br_default
cumulus@switch:~$ nv set bridge domain br_default vlan 10
cumulus@switch:~$ nv set interface swp1 bridge domain br_default vlan 10
cumulus@switch:~$ nv set bridge domain br_default multicast snooping querier enable on
cumulus@switch:~$ nv set bridge domain br_default vlan 10 multicast snooping querier source-ip 10.10.10.1
cumulus@switch:~$ nv config apply
不支持 传统模式下桥的 NVUE 命令。
编辑 /etc/network/interfaces
文件,将 bridge-mcquerier 1
添加到桥节 (这将在桥上启用组播查询器),并将 bridge-igmp-querier-src <ip-address>
添加到 VLAN 节 (这是查询的源 IP 地址)。
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto br_default.10
vlan br_default.10
bridge-igmp-querier-src 10.10.10.1
auto br_default
iface br_default
bridge-ports swp1 swp2 swp3
hwaddress 1c:34:da:b9:46:fd
bridge-vlan-aware yes
bridge-vids 10
bridge-pvid 1
bridge-stp yes
bridge-mcsnoop yes
bridge-mcquerier yes
mstpctl-forcevers rstp
...
运行 ifreload -a
命令以重新加载配置
cumulus@switch:~$ sudo ifreload -a
要在交换机上为 传统模式下的桥配置查询器,请编辑 /etc/network/interfaces
文件中的桥节,添加 bridge-mcquerier 1
(这将在桥上启用组播查询器) 和 bridge-mcqifaddr
并将其设置为 1 (这会将查询的源 IP 地址配置为桥 IP 地址)。
...
auto br0
iface br0
address 10.10.10.10/24
bridge-ports swp1 swp2 swp3
bridge-vlan-aware no
bridge-mcquerier 1
bridge-mcqifaddr 1
...
运行 ifreload -a
命令以重新加载配置
cumulus@switch:~$ sudo ifreload -a
优化的组播洪泛 (OMF)
IGMP 侦听仅将组播转发限制为接收 IGMP 报告消息的端口。如果端口未收到 IGMP 报告,则组播流量将洪泛到桥域中的所有端口 (也称为未注册组播 (URMC) 流量)。要将此洪泛限制为仅 mrouter 端口,您可以启用 OMF。
要启用 OMF
配置 IGMP 查询器。请参阅上面的配置 IGMP 和 MLD 查询器。
在
IGMP snooping unregistered L2 multicast flood control
部分的/etc/cumulus/switchd.conf
文件中,取消注释并将这些设置更改为 TRUE,然后重新启动switchd
。bridge.unreg_mcast_init
bridge.unreg_v4_mcast_prune
bridge.unreg_v6_mcast_prune
cumulus@switch:~$ sudo nano /etc/cumulus/switchd.conf ... #IGMP snooping unregistered L2 multicast flood control # #Initialize prune module: bridge.unreg_mcast_init = TRUE # #Note: #Below configuration allowed only when bridge.unreg_mcast_init is set to TRUE # #Set below to TRUE to enable unregistered L2 multicast prune to mrouter ports. #Default is to flood the unregistered L2 multicast # bridge.unreg_v4_mcast_prune = TRUE bridge.unreg_v6_mcast_prune = TRUE
cumulus@switch:~$ sudo systemctl restart switchd.service
重新启动 switchd
服务会导致所有网络端口重置,从而中断网络服务,此外还会重置交换机硬件配置。
当 IGMP 报告发送到组播组时,OMF 不起作用;将发生正常的 IGMP 侦听。
启用 OMF 后,您可以将桥端口配置为 mrouter 端口,以将未注册的组播流量转发到该端口。
编辑 /etc/network/interfaces
文件,将 bridge-portmcrouter enabled
添加到 swp1 节。
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto swp1
iface swp1
bridge-portmcrouter enabled
...
运行 ifreload -a
命令以重新加载配置
cumulus@switch:~$ sudo ifreload -a
OMF 会增加内存使用量,这可能会影响 Spectrum 1 交换机上的扩展。
改善组播收敛
对于大型组播环境,默认的 CoPP 策略器可能过于严格。您可以调整策略器以改善组播收敛。
- 对于 IGMP,默认转发速率和默认突发速率均设置为每秒 1000 个数据包。
- 对于 MLD,默认转发速率设置为每秒 300 个数据包,默认突发速率设置为每秒 100 个数据包。
要调整 IGMP 和 MLD 转发和突发速率
以下示例命令将 IGMP 转发速率设置为 400,将 IGMP 突发速率设置为每秒 200 个数据包
cumulus@switch:~$ nv set system control-plane policer igmp rate 400
cumulus@switch:~$ nv set system control-plane policer igmp burst 200
cumulus@switch:~$ nv config apply
编辑
/etc/cumulus/control-plane/policers.conf
文件。- 对于 IGMP,更改
copp.igmp.rate
和copp.igmp.burst
参数。 - 对于 MLD,更改
copp.icmp6_def_mld.rate
和copp.icmp6_def_mld.burst
参数。
以下示例将 IGMP 和 MLD 转发速率更改为每秒 400 个数据包,并将突发速率更改为每秒 200 个数据包
cumulus@switch:~$ sudo nano /etc/cumulus/control-plane/policers.conf ... copp.igmp.enable = TRUE copp.igmp.rate = 400 copp.igmp.burst = 200 ... copp.icmp6_def_mld.enable = TRUE copp.icmp6_def_mld.rate = 400 copp.icmp6_def_mld.burst = 200 ...
- 对于 IGMP,更改
运行以下命令
cumulus@switch:~$ /usr/lib/cumulus/switchdctl --load /etc/cumulus/control-plane/policers.conf
更改桥 IGMP 版本
您可以将桥配置为使用 IGMPv2 或 IGMPv3。IGMPv2 是默认版本。要更改 IGMP 版本,请将 bridge-igmp-version <version>
参数添加到 /etc/network/interfaces
文件中的桥节。例如,要将 IGMP 版本更改为 IGMPv3
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto br_default
iface br_default
bridge-ports swp3
hwaddress 44:38:39:22:01:bb
bridge-vlan-aware yes
bridge-vids 1
bridge-pvid 1
bridge-igmp-version 3
NVUE 不提供用于更改桥 IGMP 版本的命令。
禁用 IGMP 和 MLD 侦听
如果您不使用镜像功能或其他类型的组播流量,则可以禁用 IGMP 和 MLD 侦听。
cumulus@switch:~$ nv set bridge domain br_default multicast snooping enable off
cumulus@switch:~$ nv config apply
编辑 /etc/network/interfaces
文件,并将桥节中的 bridge-mcsnoop
设置为 0
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto bridge
iface bridge
bridge-mcquerier 1
bridge-mcsnoop 0
bridge-ports swp1 swp2 swp3
bridge-pvid 1
bridge-vids 100 200
bridge-vlan-aware yes
...
运行 ifreload -a
命令以重新加载配置
cumulus@switch:~$ sudo ifreload -a
故障排除
要显示 IGMP 和 MLD 侦听桥状态,请运行 brctl showstp <bridge>
命令
cumulus@switch:~$ sudo brctl showstp bridge
bridge
bridge id 8000.7072cf8c272c
designated root 8000.7072cf8c272c
root port 0 path cost 0
max age 20.00 bridge max age 20.00
hello time 2.00 bridge hello time 2.00
forward delay 15.00 bridge forward delay 15.00
ageing time 300.00
hello timer 0.00 tcn timer 0.00
topology change timer 0.00 gc timer 263.70
hash elasticity 4096 hash max 4096
mc last member count 2 mc init query count 2
mc router 1 mc snooping 1
mc last member timer 1.00 mc membership timer 260.00
mc querier timer 255.00 mc query interval 125.00
mc response interval 10.00 mc init query interval 31.25
mc querier 0 mc query ifaddr 0
flags
swp1 (1)
port id 8001 state forwarding
designated root 8000.7072cf8c272c path cost 2
designated bridge 8000.7072cf8c272c message age timer 0.00
designated port 8001 forward delay timer 0.00
designated cost 0 hold timer 0.00
mc router 1 mc fast leave 0
flags
swp2 (2)
port id 8002 state forwarding
designated root 8000.7072cf8c272c path cost 2
designated bridge 8000.7072cf8c272c message age timer 0.00
designated port 8002 forward delay timer 0.00
designated cost 0 hold timer 0.00
mc router 1 mc fast leave 0
flags
swp3 (3)
port id 8003 state forwarding
designated root 8000.7072cf8c272c path cost 2
designated bridge 8000.7072cf8c272c message age timer 0.00
designated port 8003 forward delay timer 8.98
designated cost 0 hold timer 0.00
mc router 1 mc fast leave 0
flags
Cumulus Linux 在 MDB 中跟踪组播组和端口状态。要显示组和桥端口状态,请运行 Linux sudo bridge mdb show
命令。要显示详细的路由器端口和组信息,请运行 sudo bridge -d -s mdb show
命令
cumulus@switch:~$ sudo bridge -d -s mdb show
dev bridge port swp2 grp 234.10.10.10 temp 241.67
dev bridge port swp1 grp 238.39.20.86 permanent 0.00
dev bridge port swp1 grp 234.1.1.1 temp 235.43
dev bridge port swp2 grp ff1a::9 permanent 0.00
router ports on bridge: swp3
规模注意事项
默认情况下,MDB 中支持的唯一组播组的数量为 4096。要增加 MDB 中组播组的最大数量,请编辑 /etc/network/interfaces
文件,并将 bridge-hashmax
值添加到桥节
auto br_default
iface br_default
bridge-hashmax 16384
bridge-ports swp1 swp2 swp3
bridge-vlan-aware yes
bridge-vids 10 20
bridge-pvid 1
bridge-mcquerier 1
bridge-mcsnoop 1
bridge-hashmax
支持的值为 512、1024、2048、4096、8192、16384、32768、65536。
- Spectrum 1 交换机将 MDB 中的组播组限制为 16300 个(禁用 OMF 时)和 14800 个组播组(启用 OMF 时)。
- 在 Spectrum 1 交换机上,要支持此上限,您必须将转发资源配置文件更改为
rash-custom-profile1
,然后重新启动switchd
。
基于 DIP 的组播转发
Cumulus Linux 不支持基于 DIP 的组播转发。请勿将 224.0.0.x 到 239.0.0.x 和 224.128.0.x 到 239.128.0.x IP 范围配置为组播组,这些范围映射到链路本地 MAC 地址 (01:00:5e:00:00:xx)。