IGMP 和 MLD 侦听

IGMPMLD 侦听可防止本地网络上的主机接收其未明确加入的组播组的流量。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

  1. 配置 IGMP 查询器。请参阅上面的配置 IGMP 和 MLD 查询器

  2. 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 端口,以将未注册的组播流量转发到该端口。

Cumulus Linux 不提供此设置的 NVUE 命令。

编辑 /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
  1. 编辑 /etc/cumulus/control-plane/policers.conf 文件。

    • 对于 IGMP,更改 copp.igmp.ratecopp.igmp.burst 参数。
    • 对于 MLD,更改 copp.icmp6_def_mld.ratecopp.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
    ...
    
  2. 运行以下命令

    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)。