协议无关组播 - PIM

PIM 是一种组播控制平面协议,用于在路由的第 3 层网络上播发组播源和接收器。第 3 层组播依赖于 PIM 来播发有关支持组播的路由器以及组播发送者和接收器的位置的信息。如果没有 PIM,组播将无法通过路由网络。

PIM 在 PIM-SMPIM-DM 模式下运行。Cumulus Linux 仅支持 PIM-SM。

PIM-SM 是一种拉取组播分发方法;只有在接收器明确请求时,组播流量才会通过网络。当接收器拉取组播流量时,它必须定期通知网络它想要继续组播流。

PIM-SM 有三个配置选项

  • ASM 依赖于组播汇集点 (RP) 来连接组播发送者和接收器,这些发送者和接收器动态地确定通过网络的最短路径。
  • SSM 要求组播接收器知道他们想要从哪个源接收组播流量,而不是依赖于 RP。
  • BiDir 通过 RP 转发所有流量,而不是跟踪组播源 IP,从而允许更大的规模,但可能导致低效的流量转发。

Cumulus Linux 仅支持 ASM 和 SSM。

  • IGMPv3 仅适用于 SSM 组播组范围。
  • Cumulus Linux 不支持使用 PIM 的 IPv6 组播路由。

有关 PIM-SM 的更多信息,请参阅 RFC 7761 - 协议无关组播 - 稀疏模式。有关 PIM 工作原理的简要说明,请参阅 PIM 概述

PIM 拓扑示例

下图显示了一个基本的 PIM ASM 配置

  • leaf01 是 FHR,它控制 PIM 注册过程。FHR 是组播源连接到的设备。
  • leaf02 是 LHR,它是路径中的最后一个路由器,并连接到感兴趣的组播接收器。
  • spine01 是 RP,它从源接收组播数据,并将流量向下转发到共享分发树到接收器。

基本 PIM 配置

要配置 PIM

  • 在连接到组播源或接收器的所有接口上以及具有 RP 地址的接口上启用 PIM。

    使用 NVUE,您还必须运行 nv set router pim enable on 命令来启用和启动 PIM 服务。vtysh 配置不需要这样做。

  • 在连接到主机的所有接口和连接到组播接收器的所有接口上启用 IGMP。IGMP 版本 3 是默认版本。如果您想使用 IGMP 版本 2,则仅指定版本。对于 SSM,您必须使用 IGMP 版本 3。

  • 对于 ASM,在每个启用 PIM 的交换机上,为组播组指定 RP 的 IP 地址。您还可以配置 PIM 以将来自特定组播组的流量发送到特定的 RP。

    SSM 使用前缀列表来配置接收器,使其仅允许来自单个源的组播地址的流量。这消除了对 RP 的需求,因为接收器必须在接受流量之前知道源。要启用 SSM,您只需在接口上启用 PIM 和 IGMPv3。

当您启用或禁用 PIM 时,FRR 服务会重新启动,这可能会影响流量。

以下示例命令配置 leaf01、leaf02 和 spine01,如上面的拓扑示例所示。

cumulus@leaf01:~$ nv set router pim enable on
cumulus@leaf01:~$ nv set interface vlan10 router pim
cumulus@leaf01:~$ nv set interface vlan10 ip igmp
cumulus@leaf01:~$ nv set interface swp51 router pim
cumulus@leaf01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101
cumulus@leaf01:~$ nv config apply
cumulus@leaf02:~$ nv set router pim enable on
cumulus@leaf02:~$ nv set interface vlan20 router pim
cumulus@leaf02:~$ nv set interface vlan20 ip igmp
cumulus@leaf02:~$ nv set interface swp51 router pim
cumulus@leaf02:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101
cumulus@leaf02:~$ nv config apply
cumulus@spine01:~$ nv set router pim enable on
cumulus@spine01:~$ nv set interface swp1 router pim
cumulus@spine01:~$ nv set interface swp2 router pim
cumulus@spine01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101 
cumulus@spine01:~$ nv config apply

FRR 软件包包括 PIM。为了使 PIM 正常运行,PIM 依赖于 Zebra。您必须配置单播路由和路由协议或静态路由。

  1. 编辑 /etc/frr/daemons 文件,并在文件末尾添加 pimd=yes

    cumulus@leaf01:~$ sudo nano /etc/frr/daemons
    ...
    pimd=yes
    ...
    
  1. 使用以下命令重新启动 FRR

cumulus@switch:~$ sudo systemctl restart frr.service

重新启动 FRR 会重新启动所有已启用并正在运行的路由协议守护程序。

  1. 在 vtysh shell 中,运行以下命令来配置 PIM 接口。PIM 必须在所有面向组播源或组播接收器的接口上,以及具有 RP 地址的接口上。

    cumulus@leaf01:~$ sudo vtysh
    ...
    leaf01# configure terminal
    leaf01(config)# interface vlan10
    leaf01(config-if)# ip pim
    leaf01(config-if)# exit
    leaf01(config)# interface swp51
    leaf01(config-if)# ip pim
    leaf01(config-if)# exit
    
  2. 在所有连接主机的接口上启用 IGMP。

    leaf01(config)# interface vlan10
    leaf01(config-if)# ip igmp
    leaf01(config-if)# exit
    
  3. 对于 ASM,为静态 RP 配置组映射

    leaf01(config)# ip pim rp 10.10.10.101
    leaf01(config)# exit
    leaf01# write memory
    leaf01#  exit
    
  1. 编辑 /etc/frr/daemons 文件,并在文件末尾添加 pimd=yes

    cumulus@leaf02:~$ sudo nano /etc/frr/daemons
    ...
    pimd=yes
    ...
    
  1. 使用以下命令重新启动 FRR

cumulus@switch:~$ sudo systemctl restart frr.service

重新启动 FRR 会重新启动所有已启用并正在运行的路由协议守护程序。

  1. 在 vtysh shell 中,运行以下命令来配置 PIM 接口。PIM 必须在所有面向组播源或组播接收器的接口上,以及具有 RP 地址的接口上。

    cumulus@leaf02:~$ sudo vtysh
    ...
    leaf02# configure terminal
    leaf02(config)# interface vlan20
    leaf02(config-if)# ip pim
    leaf02(config-if)# exit
    leaf02(config)# interface swp51
    leaf02(config-if)# ip pim
    leaf02(config-if)# exit
    
  2. 在所有连接主机的接口上启用 IGMP。

    leaf02(config)# interface vlan20
    leaf02(config-if)# ip igmp
    leaf02(config-if)# exit
    
  3. 对于 ASM,为静态 RP 配置组映射

    leaf02(config)# ip pim rp 10.10.10.101
    leaf02(config)# exit
    leaf02# write memory
    leaf02# exit
    
  1. 编辑 /etc/frr/daemons 文件,并在文件末尾添加 pimd=yes

    cumulus@spine01:~$ sudo nano /etc/frr/daemons
    ...
    pimd=yes
    ...
    
  1. 使用以下命令重新启动 FRR

cumulus@switch:~$ sudo systemctl restart frr.service

重新启动 FRR 会重新启动所有已启用并正在运行的路由协议守护程序。

  1. 在 vtysh shell 中,运行以下命令来配置 PIM 接口。PIM 必须在所有面向组播源或组播接收器的接口上,以及具有 RP 地址的接口上。

    cumulus@spine01:~$ sudo vtysh
    ...
    spine01# configure terminal
    spine01(config)# interface swp1
    spine01(config-if)# ip pim
    spine01(config-if)# exit
    spine01(config)# interface swp2
    spine01(config-if)# ip pim
    spine01(config-if)# exit
    
  2. 对于 ASM,为静态 RP 配置组映射

    spine01(config)# ip pim rp 10.10.10.101
    spine01(config-if)# end
    spine01# write memory
    spine01# exit
    

以上命令配置交换机将所有组播流量发送到 RP 10.10.10.101。以下命令配置 PIM 将来自组播组 224.10.0.0/16 的流量发送到 RP 10.10.10.101,并将来自组播组 224.10.2.0/24 的流量发送到 RP 10.10.10.102

cumulus@leaf01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101 group-range 224.10.0.0/16
cumulus@leaf01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.102 group-range 224.10.2.0/24
cumulus@leaf01:~$ sudo vtysh
...
spine01# configure terminal
spine01(config)# ip pim rp 10.10.10.101 224.10.0.0/16
spine01(config)# ip pim rp 10.10.10.102 224.10.2.0/16
spine01(config)# end
spine01# exit

以下命令使用前缀列表配置 PIM 将来自组播组 224.10.0.0/16 的流量发送到 RP 10.10.10.101,并将来自组播组 224.10.2.0/24 的流量发送到 RP 10.10.10.102

cumulus@leaf01:~$ nv set router policy prefix-list MCAST1 rule 1 action permit
cumulus@leaf01:~$ nv set router policy prefix-list MCAST1 rule 1 match 224.10.0.0/16
cumulus@leaf01:~$ nv set router policy prefix-list MCAST2 rule 1 action permit
cumulus@leaf01:~$ nv set router policy prefix-list MCAST2 rule 1 match 224.10.2.0/24
cumulus@leaf01:~$ nv config apply
cumulus@leaf01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101 prefix-list MCAST1
cumulus@leaf01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.102 prefix-list MCAST2
cumulus@leaf01:~$ nv config apply
cumulus@leaf01:~$ sudo vtysh
...
spine01# configure terminal
switch(config)# ip prefix-list MCAST1 seq 1 permit 224.10.0.0/16
switch(config)# ip prefix-list MCAST2 seq 1 permit 224.10.2.0/24
spine01(config)# ip pim rp 10.10.10.101 prefix-list MCAST1
spine01(config)# ip pim rp 10.10.10.102 prefix-list MCAST2
spine01(config)# end
spine01# exit

  • 您可以为不同的组播组配置 RP 映射,也可以使用前缀列表来指定 RP 到组的映射。您不能同时使用这两种方法。
  • NVIDIA 建议在使用 Clos 网络中的 eBGP 时,不要使用 spine 交换机作为 RP。请参阅 PIM 概述知识库文章
  • zebra 不通过默认路由解析 RP 的下一跳。为防止组播转发失败,请提供到 RP 的特定路由,或运行 vtysh ip nht resolve-via-default 配置命令,以通过默认路由解析 RP 的下一跳。

可选 PIM 配置

本节介绍可选的配置过程。

ASM SPT 无限

当 LHR 接收到第一个组播数据包时,它会向 FHR 发送一个 PIM (S,G) 加入,以通过网络转发流量。这构建了 SPT,即到源的最短路径树。当流量通过 SPT 到达时,PIM (S,G) RPT 剪枝会向上共享树发送到 RP。这会从共享树中删除组播流量;组播数据仅通过 SPT。

您可以配置每个组的 SPT 切换(SPT 无限),这允许某些组永远不会切换到最短路径树。LHR 现在同时向 RP 发送 (*,G) 加入和 (S,G) RPT 剪枝消息。

当您在 Cumulus Linux 中使用前缀列表来匹配组播组目标地址 (GDA) 范围时,您必须包含 /32 运算符。在下面的 NVUE 命令示例中,组匹配范围后的 max-prefix-len 32 指定了 /32 运算符。在 vtysh 命令示例中,组允许范围后的 ge 32 指定了 /32 运算符。

要配置一个组永远不遵循 SPT,请创建必要的前缀列表,然后为前缀列表配置 SPT 切换

cumulus@switch:~$ nv set router policy prefix-list SPTrange rule 1 match 235.0.0.0/8 max-prefix-len 32
cumulus@switch:~$ nv set router policy prefix-list SPTrange rule 1 action permit
cumulus@switch:~$ nv set router policy prefix-list SPTrange rule 2 match 238.0.0.0/8 max-prefix-len 32
cumulus@switch:~$ nv set router policy prefix-list SPTrange rule 2 action permit
cumulus@switch:~$ nv set vrf default router pim address-family ipv4 spt-switchover prefix-list SPTrange
cumulus@switch:~$ nv set vrf default router pim address-family ipv4 spt-switchover action infinity
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ip prefix-list spt-range permit 235.0.0.0/8 ge 32
switch(config)# ip prefix-list spt-range permit 238.0.0.0/8 ge 32
switch(config)# ip pim spt-switchover infinity prefix-list spt-range
switch(config)# end
switch# exit

要查看配置的前缀列表,请运行 vtysh show ip mroute 命令。以下命令显示 SPT 切换 (pimreg) 已在 235.0.0.0 上开启。

cumulus@switch:~$ sudo vtysh
...
switch# show ip mroute
Source          Group           Proto   Input     Output     TTL  Uptime
*               235.0.0.0       IGMP     swp1     pimreg     1    00:03:3
                                IGMP              vlan10     1    00:03:38
*               238.0.0.0       IGMP     swp1     vlan10     1    00:02:08

SSM 组播组范围

232.0.0.0/8 是为 SSM 保留的默认组播组范围。要修改 SSM 组播组范围,请定义前缀列表并应用它。您可以更改(扩展)默认组或向此范围添加其他组。

您必须在前缀列表中包含 232.0.0.0/8,因为这是保留的 SSM 范围。使用前缀列表,您可以扩展 SSM 范围,但源树中的所有设备都必须同意 SSM 范围。当您在 Cumulus Linux 中使用前缀列表来匹配组播组目标地址 (GDA) 范围时,您必须包含 /32 运算符。在下面的 NVUE 命令示例中,组匹配范围后的 max-prefix-len 32 指定了 /32 运算符。在 vtysh 命令示例中,组允许范围后的 ge 32 指定了 /32 运算符。

创建一个带有 permit 关键字的前缀列表,以匹配您想要视为组播组的地址范围,并使用 deny 关键字来匹配您不想视为组播组的地址范围

cumulus@switch:~$ nv set router policy prefix-list MyCustomSSMrange rule 5 match 232.0.0.0/8 max-prefix-len 32
cumulus@switch:~$ nv set router policy prefix-list MyCustomSSMrange rule 5 action permit
cumulus@switch:~$ nv set router policy prefix-list MyCustomSSMrange rule 10 match 238.0.0.0/8 max-prefix-len 32
cumulus@switch:~$ nv set router policy prefix-list MyCustomSSMrange rule 10 action permit

应用自定义前缀列表

cumulus@switch:~$ nv set vrf default router pim address-family ipv4 ssm-prefix-list MyCustomSSMrange
cumulus@switch:~$ nv config apply

创建一个带有 permit 关键字的前缀列表,以匹配您想要视为组播组的地址范围,并使用 deny 关键字来匹配您不想视为组播组的地址范围

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ip prefix-list ssm-range seq 5 permit 232.0.0.0/8 ge 32
switch(config)# ip prefix-list ssm-range seq 10 permit 238.0.0.0/8 ge 32

将自定义前缀列表应用为 ssm-range

switch(config)# ip pim ssm prefix-list ssm-range
switch(config)# exit
switch# write memory
switch# exit

要查看配置的前缀列表,请运行 vtysh show ip prefix-list my-custom-ssm-range 命令

switch#  show ip prefix-list my-custom-ssm-range
ZEBRA: ip prefix-list my-custom-ssm-range: 1 entries
   seq 5 permit 232.0.0.0/8 ge 32
PIM: ip prefix-list my-custom-ssm-range: 1 entries
   seq 10 permit 232.0.0.0/8 ge 32

PIM 和 ECMP

PIM 使用 RPF 来选择上游接口以构建转发状态。如果您配置 ECMP,PIM 会根据 ECMP 哈希算法选择 RPF。

您可以配置 PIM 在安装 mroute 时使用所有可用的下一跳。例如,如果您有四路 ECMP,PIM 会将 S,G*,G mroute 分布在四个不同的路径上。

您还可以配置 PIM 在交换机丢失路径时重新计算其中一个 ECMP 路径上的所有流路径。否则,只有使用丢失路径的流才会移动到备用 ECMP 路径。此重新计算不会影响现有组。

在其中一个 ECMP 路径上重新计算所有流路径可能会导致一些数据包丢失。

要配置 PIM 在安装 mroute 时使用所有可用的下一跳

cumulus@switch:~$ nv set vrf default router pim ecmp enable on
cumulus@switch:~$ nv config apply

要在交换机丢失路径时重新计算其中一个 ECMP 路径上的所有流路径

cumulus@switch:~$ nv set vrf default router pim ecmp rebalance on
cumulus@switch:~$ nv config apply

要配置 PIM 在安装 mroute 时使用所有可用的下一跳

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ip pim ecmp
switch(config)# exit
switch# write memory
switch# exit

要在交换机丢失路径时重新计算其中一个 ECMP 路径上的所有流路径

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ip pim ecmp rebalance
switch(config)# exit
switch# write memory
switch# exit

要显示特定源或组的下一跳,请运行 vtysh show ip pim nexthop 命令

cumulus@switch:~$ sudo vtysh
...
switch# show ip pim nexthop
Number of registered addresses: 3
Address         Interface      Nexthop
-------------------------------------------
6.0.0.9         swp31s0        169.254.0.9
6.0.0.9         swp31s1        169.254.0.25
6.0.0.11        lo             0.0.0.0
6.0.0.10        swp31s0        169.254.0.9
6.0.0.10        swp31s1        169.254.0.25

IP 组播边界

使用组播边界来限制组播流量的分发,并将组播推送到网络的子集。在设置边界后,交换机根据前缀列表丢弃或接受传入的 IGMP 或 PIM 加入。要配置边界,请在接口上应用 IP 组播边界 OIL(传出接口列表)。

首先创建一个由组播组地址组成的前缀列表,然后运行以下命令

cumulus@switch:~$ nv set interface swp1 router pim address-family ipv4-unicast multicast-boundary-oil MyPrefixList
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp1
switch(config-if)# ip multicast boundary oil my-prefix-list
switch(config-if)# end
switch# write memory
switch# exit

MSDP

您可以使用 MSDP 使用 PIM-SM RP 连接多个 PIM-SM 组播域。如果您在多个组播交换机(在环回接口上)上使用相同的 IP 地址配置任播 RP,则每个组播组可以使用多个 RP。

当 RP 发现新源(PIM-SM 注册消息)时,它会向每个 MSDP 对等方发送 SA 消息。然后,对等方确定是否有任何感兴趣的接收器。

  • Cumulus Linux 支持任播 RP 的 MSDP,而不是多个组播域。您必须在全网格中配置每个 MSDP 对等方。交换机不转发收到的 SA 消息。
  • Cumulus Linux 仅支持一个 MSDP 网格组。

以下步骤配置 Cumulus 交换机以使用 MSDP

  1. 为域中每个 RP 的环回接口添加任播 IP 地址

    cumulus@rp01:~$ nv set interface lo ip address 10.10.10.101/32
    cumulus@rp01:~$ nv set interface lo ip address 10.100.100.100/32
    
  2. 在每台组播交换机上,使用任播地址配置组到 RP 的映射

    cumulus@switch:$ nv set vrf default router pim address-family ipv4 rp 10.100.100.100 group-range 224.0.0.0/4
    cumulus@switch:$ nv config apply
    
  3. 为所有活动 RP 配置 MSDP 网格组。以下示例使用三个 RP

    网格组必须包括域中的所有 RP 作为成员,并使用唯一地址作为源。此配置导致所有 RP 之间的 MSDP 对等互连。

    cumulus@rp01:$ nv set vrf default router pim msdp-mesh-group cumulus member-address 100.1.1.2
    cumulus@rp01:$ nv set vrf default router pim msdp-mesh-group cumulus member-address 100.1.1.3
    
    cumulus@rp02:$ nv set vrf default router pim msdp-mesh-group cumulus member-address 100.1.1.1
    cumulus@rp02:$ nv set vrf default router pim msdp-mesh-group cumulus member-address 100.1.1.3
    
    cumulus@rp03:$ nv set vrf default router pim msdp-mesh-group cumulus member-address 100.1.1.1
    cumulus@rp03:$ nv set vrf default router pim msdp-mesh-group cumulus member-address 100.1.1.2
    
  4. 选择本地环回地址作为 MSDP 控制数据包的源

    cumulus@rp01:$ nv set vrf default router pim msdp-mesh-group cumulus source-address 10.10.10.101
    
    cumulus@rp02:$ nv set vrf default router pim msdp-mesh-group cumulus source-address 10.10.10.102
    
    cumulus@rp03:$ nv set vrf default router pim msdp-mesh-group cumulus source-address 10.10.10.103
    
  5. 将任播 IP 地址注入到域的 IGP 中。如果网络使用未编号的 BGP 作为 IGP,请避免使用任播 IP 地址来建立单播或组播对等互连。对于 PIM-SM,请通过设置源来确保您使用唯一地址作为 PIM Hello 源

    cumulus@rp01:$ nv set interface lo router pim address-family ipv4-unicast use-source 10.100.100.100
    cumulus@rp01:$ nv config apply
    
  1. 编辑 /etc/network/interfaces 文件,为域中每个 RP 的环回接口添加任播 IP 地址。例如

    cumulus@rp01:~$ sudo nano /etc/network/interfaces
    auto lo
    iface lo inet loopback
       address 10.10.10.101/32
       address 10.100.100.100/32
    ...
    
  2. 运行 ifreload -a 命令以加载新配置

    cumulus@switch:~$ ifreload -a
    
  3. 在每台组播交换机上,使用任播地址配置组到 RP 的映射

    cumulus@rp01:~$ sudo vtysh
    ...
    rp01# configure terminal
    rp01(config)# ip pim rp 10.100.100.100 224.0.0.0/4
    
  4. 为所有活动 RP 配置 MSDP 网格组(以下示例使用三个 RP)

    网格组必须包括域中的所有 RP 作为成员,并使用唯一地址作为源。此配置导致所有 RP 之间的 MSDP 对等互连。

    rp01(config)# ip msdp mesh-group cumulus member 100.1.1.2
    rp01(config)# ip msdp mesh-group cumulus member 100.1.1.3
    
    rp02(config)# ip msdp mesh-group cumulus member 100.1.1.1
    rp02(config)# ip msdp mesh-group cumulus member 100.1.1.3
    
    rp03(config)# ip msdp mesh-group cumulus member 100.1.1.1
    rp03(config)# ip msdp mesh-group cumulus member 100.1.1.2
    
  5. 选择本地环回地址作为 MSDP 控制数据包的源

    rp01(config)# ip msdp mesh-group cumulus source 10.10.10.101
    rp02(config)# ip msdp mesh-group cumulus source 10.10.10.102
    rp03(config)# ip msdp mesh-group cumulus source 10.10.10.103
    
  6. 将任播 IP 地址注入到域的 IGP 中。如果网络使用未编号的 BGP 作为 IGP,请避免使用任播 IP 地址来建立单播或组播对等互连。对于 PIM-SM,请通过设置源来确保您使用唯一地址作为 PIM Hello 源

    rp01# interface lo
    rp01(config-if)# ip pim use-source 100.100.100.100
    rp01(config-if)# end
    rp01# write memory
    rp01# exit
    

VRF 中的 PIM

VRF 按租户划分路由表,以在单个第 3 层基础架构上提供单独的第 3 层网络。使用 VRF,每个租户都有自己的虚拟化第 3 层网络,因此 IP 地址可以在租户之间重叠。

VRF 中的 PIM 使 PIM 树和组播数据流量能够在第 3 层虚拟化网络内运行,每个域或租户都有单独的树。每个 VRF 都有自己的组播树,具有自己的 RP、源等。因此,您可以为每个公司部门、客户端或产品设置一个租户。

如果您不启用 MP-BGP MPLS VPN,则不同交换机上的 VRF 通常通过子接口连接或对等互连,其中每个子接口都在其自己的 VRF 中。

要在 VRF 中配置 PIM

添加 VRF 并将其与交换机端口关联

cumulus@switch:~$ nv set vrf RED
cumulus@switch:~$ nv set vrf BLUE
cumulus@switch:~$ nv set interface swp1 ip vrf RED
cumulus@switch:~$ nv set interface swp2 ip vrf BLUE

添加 PIM 配置

cumulus@switch:~$ nv set interface swp1 router pim
cumulus@switch:~$ nv set interface swp2 router pim
cumulus@switch:~$ nv set vrf RED router bgp autonomous-system 65001
cumulus@switch:~$ nv set vrf BLUE router bgp autonomous-system 65000
cumulus@switch:~$ nv set vrf RED router bgp router-id 10.1.1.1
cumulus@switch:~$ nv set vrf BLUE router bgp router-id 10.1.1.2
cumulus@switch:~$ nv set vrf RED router bgp neighbor swp1 remote-as external
cumulus@switch:~$ nv set vrf BLUE router bgp neighbor swp2 remote-as external
cumulus@switch:~$ nv config apply

编辑 /etc/network/interfaces 文件,并将 VRF 与交换机端口关联,然后运行 ifreload -a 以重新加载配置。

cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto swp1
iface swp1
    vrf RED

auto swp2
iface swp2
    vrf BLUE

auto RED
iface RED
    vrf-table auto

auto BLUE
iface BLUE
    vrf-table auto
...

添加 PIM 配置

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp1
switch(config-if)# ip pim
switch(config-if)# exit
switch(config)# interface swp2
switch(config-if)# ip pim
switch(config-if)# exit
switch(config)# router bgp 65001 vrf RED
switch(config-router)# bgp router-id 10.1.1.2
switch(config-router)# neighbor swp1 interface remote-as external
switch(config-router)# exit
switch(config)# router bgp 65000 vrf BLUE
switch(config-router)# bgp router-id 10.1.1.1
switch(config-router)# neighbor swp2 interface remote-as external
switch(config-router)# end
switch# write memory
switch# exit

PIM 邻居的 BFD

您可以将 BFD 用于 PIM 邻居,以检测链路故障。当您配置接口时,请包含 pim bfd 选项。以下示例命令配置 leaf01 和 spine01 之间的 BFD

cumulus@leaf01:~$ nv set interface swp51 router pim bfd enable on
cumulus@leaf01:~$ nv config apply
cumulus@spine01:~$ nv set interface swp1 router pim bfd enable on
cumulus@spine01:~$ nv config apply
cumulus@leaf01:~$ sudo vtysh
...
leaf01# configure terminal
leaf01(config)# interface swp51
leaf01(config-if)# ip pim bfd
leaf01(config-if)# end
leaf01# write memory
leaf01# exit
cumulus@spine01:~$ sudo vtysh
...
spine01# configure terminal
spine01(config)# interface swp1
spine01(config-if)# ip pim bfd
spine01(config-if)# end
spine01# write memory
spine01# exit

允许 RP

为了开始接收组播组的组播流量,接收器通过在其连接的 LAN 上发送 IGMP 成员报告来表达其对该组的兴趣。LHR 接收到此报告并开始构建返回源的组播路由树。为了构建此树,需要存在另一个路由器,该路由器既为 LHR 所知,也为组播源所知,以充当发送者和接收者的 RP。LHR 查找接收器指定的组的 RP,并向 RP 发送 PIM 加入消息。根据 RFC 7761,LHR 和 RP 之间的中间路由器必须检查该组的 RP 是否与 PIM 加入中的 RP 匹配,如果不匹配,则丢弃加入。

在某些配置中,希望使用与该组的实际 RP 地址不匹配的 RP 地址来配置 LHR。在这种情况下,您必须配置上游路由器以接受加入并将其传播到该组的相应 RP,忽略 PIM 加入中不匹配的 RP 地址,并将其替换为自己的组 RP。

您可以配置交换机以允许来自所有上游邻居的加入,或者您可以提供前缀列表,以便交换机仅接受具有上游邻居地址的加入。

以下示例命令配置 PIM 以忽略所有上游邻居的 RP 检查

cumulus@switch:~$ nv set interface swp50 router pim address-family ipv4-unicast allow-rp enable on
cumulus@switch:~$ nv config apply

以下示例命令配置 PIM 仅忽略前缀列表(名为 allowRP)中 RP 地址的 RP 检查

cumulus@switch:~$ nv set interface swp50 router pim address-family ipv4-unicast allow-rp rp-list allowRP
cumulus@switch:~$ nv config apply

以下示例命令配置 PIM 以忽略所有上游邻居的 RP 检查

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp50
switch(config-if)# ip pim allow-rp
switch(config-if)# end
switch# write memory
switch# exit

以下示例命令配置 PIM 仅忽略前缀列表(名为 allowRP)中 RP 地址的 RP 检查

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp50
switch(config-if)# ip pim allow-rp rp-list allowRP
switch(config-if)# end
switch# write memory
switch# exit

PIM 计时器

Cumulus Linux 提供以下 PIM 计时器

计时器描述
hello-intervalPIM 路由器发送 Hello 消息以发现 PIM 邻居并维护 PIM 邻居关系的间隔(以秒为单位)。您可以指定介于 1 到 180 之间的值。默认设置为 30 秒。使用 vtysh,您可以为特定的启用 PIM 的接口设置 Hello 间隔。使用 NVUE,您可以为所有启用 PIM 的接口或特定的启用 PIM 的接口全局设置 Hello 间隔。
holdtime邻居必须处于可达状态的秒数。auto(默认设置)使用 hello-interval 的三倍半。您可以指定介于 1 到 180 之间的值。使用 vtysh,您可以为特定的启用 PIM 的接口设置保持时间。使用 NVUE,您可以为所有启用 PIM 的接口或特定的启用 PIM 的接口全局设置保持时间。
join-prune-intervalPIM 路由器向其上游邻居发送加入/剪枝消息以进行状态更新的间隔(以秒为单位)。您可以指定介于 60 到 600 之间的值。默认设置为 60 秒。您可以为所有启用 PIM 的接口全局设置 join-prune-interval。NVUE 还提供了为特定 VRF 设置 join-prune-interval 的选项。
keepaliveS,G 流的超时值(以秒为单位)。您可以指定介于 31 到 60000 之间的值。默认设置为 210 秒。您可以为所有启用 PIM 的接口或特定 VRF 全局设置 keepalive 计时器。
在 vtysh 中,计时器为 keep-alive
register-suppress停止向 RP 发送注册消息的秒数。您可以指定介于 5 到 60000 之间的值。默认设置为 60 秒。您可以为所有启用 PIM 的接口或特定 VRF 全局设置 keepalive 计时器。
rp-keepalive仅限 NVUE。RP 的超时值(以秒为单位)。您可以指定介于 31 到 60000 之间的值。默认设置为 185 秒。您可以为所有启用 PIM 的接口或特定 VRF 全局设置 register-suppress-time 计时器。
在 vtysh 中,计时器为 rp-keep-alive

以下示例命令将 join-prune-interval 设置为 100 秒,将 keepalive 计时器设置为 10000 秒,并将 register-suppress 时间设置为 20000 秒,全局适用于所有启用 PIM 的接口

cumulus@switch:~$ nv set router pim timers join-prune-interval 100
cumulus@switch:~$ nv set router pim timers keepalive 10000
cumulus@switch:~$ nv set router pim timers register-suppress 20000
cumulus@switch:~$ nv config apply

以下示例命令将 swp51 的 hello-interval 设置为 60 秒

cumulus@switch:~$ nv set interface swp51 router pim timers hello-interval 60
cumulus@switch:~$ nv config apply

以下示例命令将 VRF RED 的 rp-keepalive 设置为 10000

cumulus@switch:~$ nv set vrf RED router pim timers rp-keepalive 10000
cumulus@switch:~$ nv config apply

以下示例命令将 join-prune-interval 设置为 100 秒,将 keep-alive 计时器设置为 10000 秒,并将 register-suppress 时间设置为 20000 秒,全局适用于所有启用 PIM 的接口

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# ip pim join-prune-interval 100
switch(config)# ip pim keep-alive-timer 10000
switch(config)# ip pim register-suppress-time 20000
switch(config)# end
switch# write memory
switch# exit

以下示例命令将 swp51 的 hello-interval 设置为 60 秒,将 holdtime 设置为 120 秒

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp51
switch(config-if)# ip pim hello 60 120
switch(config-if)# end
switch# write memory
switch# exit

以下示例命令将 VRF RED 的 keep-alive-timer 设置为 10000 秒

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# vrf RED
switch(config-vrf)# ip pim keep-alive-timer 10000
switch(config-if)# end
switch# write memory
switch# exit

改进组播收敛

对于大型组播环境,默认的 CoPP 策略器可能过于严格。您可以调整策略器以改进组播收敛。

  • 默认的 PIM 转发速率和突发速率设置为每秒 2000 个数据包。
  • 默认的 IGMP 转发速率和突发速率设置为每秒 1000 个数据包。

要调整策略器

以下示例命令将 PIM 转发和突发速率设置为每秒 400 个数据包

cumulus@switch:~$ nv set system control-plane policer pim-ospf-rip rate 400
cumulus@switch:~$ nv set system control-plane policer pim-ospf-rip burst 400
cumulus@switch:~$ nv config apply 

以下示例命令将 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 文件

    • 要调整 PIM 转发和突发速率,请更改 copp.pim_ospf_rip.ratecopp.pim_ospf_rip.burst 参数。

    • 要调整 IGMP 转发和突发速率,请更改 copp.igmp.ratecopp.igmp.burst 参数。

      以下示例将 PIM 转发速率和 PIM 突发速率更改为每秒 400 个数据包,将 IGMP 转发速率更改为每秒 400 个数据包,并将 IGMP 突发速率更改为每秒 200 个数据包

      cumulus@switch:~$ sudo nano /etc/cumulus/control-plane/policers.conf
      ...
      copp.pim_ospf_rip.enable = TRUE
      copp.pim_ospf_rip.rate = 400
      copp.pim_ospf_rip.burst = 400
      ...
      copp.igmp.enable = TRUE
      copp.igmp.rate = 400
      copp.igmp.burst = 200
      ...
      
  2. 运行以下命令

    cumulus@switch:~$ /usr/lib/cumulus/switchdctl --load /etc/cumulus/control-plane/policers.conf
    

IGMP 设置

您可以在 PIM 接口上设置以下可选 IGMP 设置

  • 最后成员查询间隔,即响应于组的最后一个成员收到的离开消息的查询之间的间隔。您可以指定介于 1 到 6553 秒之间的值。默认设置为 10。
  • IGMP 常规查询的最大响应时间。您可以指定介于 1 到 6553 秒之间的值。默认设置为 100。最大响应时间必须小于最后成员查询间隔。
  • 最后成员查询计数,即查询器在收到来自组的最后一个成员的离开消息后可以发送的特定于组的查询的数量。您可以指定介于 1 到 255 之间的值。默认设置为 2。
  • IGMP 发送查询消息以发现哪些组播组在连接的网络上具有成员的频率。您可以指定介于 1 到 65535 秒之间的值。默认设置为 125。
  • 快速离开,即当端口收到离开消息时,交换机立即从组播组的转发条目中删除端口。默认设置是关闭。

以下示例将最后成员查询间隔设置为 80,将 IGMP 常规查询的最大响应时间设置为 120 秒,将查询器可以发送的特定于组的查询数量设置为 5,并将 IGMP 配置为每 180 秒发送一次查询主机消息

cumulus@switch:~$ nv set interface swp1 ip igmp last-member-query-interval 80
cumulus@switch:~$ nv set interface swp1 ip igmp query-max-response-time 120
cumulus@switch:~$ nv set interface swp1 ip igmp last-member-query-count 5
cumulus@switch:~$ nv set interface swp1 ip igmp query-interval 180
cumulus@switch:~$ nv config apply

以下示例启用快速离开处理

cumulus@switch:~$ nv set interface swp1 ip igmp fast-leave on
cumulus@switch:~$ nv config apply

要禁用快速离开处理,请运行 nv set interface <interface> ip igmp fast-leave off 命令。

以下示例将最后成员查询间隔设置为 80,将 IGMP 常规查询的最大响应时间设置为 120 秒,将查询器发送的特定于组的查询数量设置为 5,并将 IGMP 配置为每 180 秒发送一次查询主机消息

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# 
switch(config)# interface vlan10
leaf02(config-if)# ip igmp last-member-query-interval 80
leaf02(config-if)# ip igmp query-max-response-time 120
leaf02(config-if)# ip igmp last-member-query-count 5
leaf02(config-if)# ip igmp query-interval 180
leaf02(config-if)# end
switch# write memory
switch# exit

vtysh ip igmp last-member-query-count 命令将配置添加到 /etc/frr/frr.conf file

cumulus@switch:~$ sudo nano /etc/frr/frr.conf
...
ip igmp
ip igmp version 3
ip igmp query-interval 180
ip igmp last-member-query-interval 80
ip igmp last-member-query-count 5
ip igmp query-max-response-time 120
...

要启用快速离开处理,请编辑 /etc/network/interfaces 文件,并在接口节下添加 bridge-portmcfl yes 参数

cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto vlan10
iface vlan10
    address 10.1.10.1/24
    hwaddress 44:38:39:22:01:b1
    bridge-portmcfl yes
    vlan-raw-device br_default
    vlan-id 10
...

要禁用快速离开处理,请编辑 /etc/network/interfaces 文件,并在接口节下设置 bridge-portmcfl no 参数。

具有 MLAG 的 PIM 主动-主动模式

组播发送者连接到 MLAG 链路聚合时,发送者会对出站组播流量进行哈希,使其通过链路聚合中的单个成员。流量到达其中一个启用 MLAG 的交换机。无论哪个交换机接收到流量,它都会通过 MLAG 对等链路到达另一个启用 MLAG 的交换机,因为对等链路始终是组播路由器端口,并且始终接收组播流。

来自连接到 MLAG 链路聚合的组播源的流量始终通过 MLAG 对等链路。请务必适当调整对等链路的大小,以适应此流量。

源所在的 VLAN 的 PIM DR 向 RP 发送 PIM 注册消息。PIM DR 是该网段上 IP 地址最高的 PIM 设备。在 PIM 注册过程完成后,并且流量沿着 SPT流动时,MLAG 交换机都会向接收者转发流量。

发送到源的 PIM 加入消息可以通过上游 PIM 邻居进行 ECMP 负载分担。无论 DR 状态如何,任何 MLAG 成员都可以接收 PIM 加入消息并转发流量。

双连接的组播接收者在连接的 VLAN 上发送 IGMP 加入消息。其中一个 MLAG 交换机接收 IGMP 加入消息,然后将 IGMP 加入消息添加到 IGMP 加入表和二层 MDB 表。二层 MDB 表,就像单播 MAC 地址表一样,通过 MLAG 控制消息在对等链路上同步。这允许两个 MLAG 交换机都编程 IGMP 和 MDB 表转发信息。两个交换机都向 RP 发送 *,G PIM 加入消息。如果源已经在发送,则两个 MLAG 交换机都会接收组播流。

传统上,PIM DR 是唯一发送 PIM *,G 加入消息的节点。为了在发生故障时提供弹性,两个 MLAG 交换机都向 RP 发送 PIM *,G 加入消息以接收组播流。

为了防止重复的组播数据包,PIM 选举一个 DF,它是 MLAG 对中的 primary 成员。MLAG 辅助交换机将 VLAN 放入 OIL 中,从而防止重复的组播流量。

示例流量流

下面的示例显示了 server02 和 server03 之间的流量流

步骤 1
1. server02 向 leaf02 发送流量。

2. leaf02 将流量转发到 leaf01,因为对等链路是组播路由器端口。

3. spine01 从 DR leaf01 接收 PIM 注册消息。

4. leaf02 作为 MLAG 主动-主动对等方,从 leaf01 同步 *,G 表。
步骤 2
1. leaf02 具有 *,G 路由,指示它必须向 spine01 转发流量。

2. leaf02 或 leaf01 都可以直接发送此流量,具体取决于哪个 MLAG 交换机从连接的源接收到流量。

3. 在这种情况下,leaf02 在 MLAG 链路聚合上接收流量,并将其直接向上游转发。

配置具有 MLAG 的 PIM

您可以在双连接的 MLAG 链路聚合上使用组播发送者或接收者。在存在组播源或接收者的 VLAN 接口上,配置 PIM 主动-主动模式和 IGMP。启用 PIM 主动-主动模式会自动在该接口上启用 PIM。

cumulus@leaf01:~$ nv set interface vlan10 router pim active-active on
cumulus@leaf01:~$ nv set interface vlan10 ip igmp
cumulus@leaf01:~$ nv config apply
cumulus@leaf01:~$ sudo vtysh
...
leaf01# configure terminal
leaf01(config)# interface vlan10
leaf01(config-if)# ip pim active-active
leaf01(config-if)# ip igmp
leaf01(config-if)# end
leaf01# write memory
leaf01# exit

要验证 PIM 主动-主动配置,请运行 vtysh show ip pim mlag summary 命令

cumulus@leaf01:mgmt:~$ sudo vtysh
...
leaf01# show ip pim mlag summary
MLAG daemon connection: up
MLAG peer state: up
Zebra peer state: up
MLAG role: PRIMARY
Local VTEP IP: 0.0.0.0
Anycast VTEP IP: 0.0.0.0
Peerlink: peerlink.4094
Session flaps: mlagd: 0 mlag-peer: 0 zebra-peer: 0
Message Statistics:
mroute adds: rx: 5, tx: 5
mroute dels: rx: 0, tx: 0
peer zebra status updates: 1
PIM status updates: 0
VxLAN updates: 0

故障排除

本节提供用于检查您的 PIM 配置的命令,并提供故障排除技巧。

PIM Show 命令

要显示 IP 组播路由表的内容,请运行 vtysh show ip mroute 命令。您可以从标志中验证 (S,G) 和 (*,G) 状态条目,并检查传入和传出接口是否正确

cumulus@fhr:~$ sudo vtysh
...
fhr# show ip mroute
IP Multicast Routing Table
Flags: S - Sparse, C - Connected, P - Pruned
       R - RP-bit set, F - Register flag, T - SPT-bit set

Source          Group           Flags    Proto  Input            Output           TTL  Uptime
10.1.10.101     239.1.1.1       SFP      none   vlan10           none             0    --:--:-- 

要查看交换机上的活动源,请运行 vtysh show ip pim upstream 命令。

cumulus@fhr:~$ sudo vtysh
...
fhr# show ip pim upstream
Iif    Source        Group     State   Uptime    JoinTimer  RSTimer   KATimer   RefCnt
vlan10 10.1.10.101   239.1.1.1 Prune   00:07:40  --:--:--   00:00:36  00:02:50  1

要显示 S,Gs 的上游信息以及加入组播树的意愿,请运行 vtysh show ip pim upstream-join-desired 命令。

cumulus@fhr:~$ sudo vtysh
...
fhr# show ip pim upstream-join-desired
Source          Group           EvalJD
10.1.10.101     239.1.1.1       yes 

要显示交换机上的 PIM 接口,请运行 vtysh show ip pim interface 命令。

cumulus@fhr:mgmt:~$ sudo vtysh
...
fhr# show ip pim interface
Interface         State          Address  PIM Nbrs           PIM DR  FHR IfChannels
lo                   up       10.10.10.1         0            local    0          0
swp51                up       10.10.10.1         1     10.10.10.101    0          0
vlan10               up        10.1.10.1         0            local    1          0

vtysh show ip pim interface detail 命令显示有关交换机上 PIM 接口的更多详细信息

cumulus@fhr:~$ sudo vtysh
...
fhr# show ip pim interface detail
...
Interface  : vlan10
State      : up
Address    : 10.1.10.1 (primary)
             fe80::4638:39ff:fe00:31/64

Designated Router
-----------------
Address   : 10.1.10.1
Priority  : 1(0)
Uptime    : --:--:--
Elections : 1
Changes   : 0

FHR - First Hop Router
----------------------
239.1.1.1 : 10.1.10.101 is a source, uptime is 00:03:08
...

要显示 PIM 接口的本地成员信息,请运行 vtysh show ip pim local-membership 命令。

cumulus@lhr:~$ sudo vtysh
...
lhr# show ip pim local-membership
Interface         Address          Source           Group            Membership
vlan20            10.2.10.1        *                239.1.1.1        INCLUDE 

要显示有关已知 S,Gs、IIFOIL 的信息,请运行 vtysh show ip pim state 命令。

cumulus@fhr:~$ sudo vtysh
...
fhr# show ip pim state
Codes: J -> Pim Join, I -> IGMP Report, S -> Source, * -> Inherited from (*,G), V -> VxLAN, M -> Muted
Active Source           Group            RPT  IIF               OIL
1      10.1.10.101      239.1.1.1        n    vlan10 

要显示接口的 IGMP 配置设置,请运行 nv show interface <interface> ip igmp 命令

cumulus@lhr:~$ nv show interface swp3 ip igmp
                            operational  applied
---------------------------  -----------  -------
enable                                    on
version                      3            3
fast-leave                                off
query-interval               125          125
query-max-response-time      100          100
last-member-query-interval                10
last-member-query-count      2            2
[static-group]
interface-state              up
ip-address                   33.1.1.10
ifindex                      3
querier                      local
querier-ip                   33.1.1.10
query-start-count            0
group-membership-interval    350
older-host-present-interval  350
other-querier-interval       300
robustness-variable          2
startup-query-interval       31
last-member-query-time       20
timers
  query-timer                00:00:12
  query-other-timer          --:--:--
flags
  multicast                  on
  broadcast                  on
  lan-delay                  on             

要显示接口的 IGMP 运行数据,请运行 NVUE nv show interface <interface> ip igmp -o json 命令或 vtysh show ip igmp statistics 命令。

要验证接收者是否正在为组发送 IGMP 报告(加入消息),请运行 NVUE nv show interface <interface> ip igmp group 命令或 vtysh show ip igmp groups 命令。

cumulus@lhr:~$ nv show interface swp3 ip igmp group
StaticGroupID  filter-mode  source-count  timer     uptime    version  Summary
-------------  -----------  ------------  --------  --------  -------  -------------------------
225.1.101.1    exclude      1             00:02:43  00:02:56  3        source-address:         *
225.1.101.2    exclude      1             00:02:43  00:02:56  3        source-address:         *
225.1.101.3    exclude      1             00:02:43  00:02:56  3        source-address:         *
225.1.101.4    exclude      1             00:02:43  00:02:56  3        source-address:         *
225.1.101.5    exclude      1             00:02:43  00:02:56  3        source-address:         *
232.1.1.99     include      1             --:--:--  00:00:02  3        source-address: 10.1.10.1

要显示 IGMP 源信息,请运行 vtysh show ip igmp sources 命令。

cumulus@lhr:~$ sudo vtysh
...
lhr# show ip igmp sources
Interface        Address         Group           Source          Timer Fwd Uptime  
vlan20           10.2.10.1       239.1.1.1       *               03:13   Y 05:28:42 

FHR 卡在注册过程中

当组播源启动时,FHR 从 RPF 接口向源发送单播 PIM 注册消息。在 RP 接收到 PIM 注册消息后,它会向 FHR 发送 PIM register stop 消息以结束注册过程。如果此通信出现问题,FHR 将卡在注册过程中,这可能会导致高 CPU 负载(FHR CPU 生成并向 RP CPU 发送 PIM 注册数据包)。

要评估此问题,请查看 FHR。您可以在此处看到 pimreg 的输出接口。如果它在几秒钟内没有更改为接口,则 FHR 可能仍处于注册过程中。

cumulus@fhr:~$ sudo vtysh
...
fhr# show ip mroute
Source          Group           Proto  Input      Output     TTL  Uptime
10.1.10.101     239.2.2.3       PIM    vlan10     pimreg     1    00:03:59

要排除此问题,请执行以下操作

  1. 验证 FHR 是否可以到达 RP。如果 RP 和 FHR 无法通信,则注册过程将失败

    cumulus@fhr:~$ ping 10.10.10.101
    PING 10.10.10.101 (10.10.10.101) from 10.1.10.1: 56(84) bytes of data.
    ^C
    --- 10.0.0.21 ping statistics ---
    4 packets transmitted, 0 received, 100% packet loss, time 3000ms
    
  2. 在 RP 上,使用 tcpdump 查看 PIM 注册数据包是否到达

    cumulus@rp01:~$ sudo tcpdump -i swp1
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on swp1, link-type EN10MB (Ethernet), capture size 262144 bytes
    23:33:17.524982 IP 10.1.10.101 > 10.10.10.101: PIMv2, Register, length 66
    
  3. 如果交换机正在接收 PIM 注册数据包,请通过运行 vtysh debug pim packets 命令来验证 PIM 是否看到它们

    cumulus@fhr:~$ sudo vtysh -c "debug pim packets"
    PIM Packet debugging is on
    
    cumulus@rp01:~$ sudo tail /var/log/frr/frr.log
    2016/10/19 23:46:51 PIM: Recv PIM REGISTER packet from 172.16.5.1 to 10.0.0.21 on swp30: ttl=255 pim_version=2 pim_msg_size=64 checksum=a681
    
  4. 在 FHR 上重复该过程,以查看它是否接收到 PIM register stop 消息并将其传递给 PIM 进程

    cumulus@fhr:~$ sudo tcpdump -i swp51
    23:58:59.841625 IP 172.16.5.1 > 10.0.0.21: PIMv2, Register, length 28
    23:58:59.842466 IP 10.0.0.21 > 172.16.5.1: PIMv2, Register Stop, length 18
    
    cumulus@fhr:~$ sudo vtysh -c "debug pim packets"
    PIM Packet debugging is on
    
    cumulus@fhr:~$ sudo tail -f /var/log/frr/frr.log
    2016/10/19 23:59:38 PIM: Recv PIM REGSTOP packet from 10.10.10.101 to 10.10.10.1 on swp51: ttl=255 pim_version=2 pim_msg_size=18 checksum=5a39
    

LHR 未构建 *,G

如果您未在面向接收者的接口上同时启用 PIM IGMP,则 LHR 不会构建 *,G

cumulus@lhr:~$ sudo vtysh
...
lhr# show run
!
interface vlan20
 ip igmp
 ip pim

要排除此问题,请确保在同时启用 PIM 和 IGMP 时,接收者发送 IGMPv3 加入消息

cumulus@lhr:~$ sudo tcpdump -i vlan20 igmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vlan20, link-type EN10MB (Ethernet), capture size 262144 bytes
00:03:55.789744 IP 10.2.10.1 > igmp.mcast.net: igmp v3 report, 1 group record(s)

FHR 上未创建 mroute

要排除此问题,请执行以下操作

  1. 验证 FHR 是否正在接收组播流量

    cumulus@fhr:~$ sudo tcpdump -i vlan10
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on vlan10, link-type EN10MB (Ethernet), capture size 262144 bytes
    19:57:58.429632 IP 10.1.10.101.42420 > 239.1.1.1.1000: UDP, length 8
    19:57:59.431250 IP 10.1.10.101.42420 > 239.1.1.1.1000: UDP, length 8
    
  2. 验证面向源的接口上的 PIM 配置

    cumulus@fhr:~$ sudo vtysh
    ...
    fhr# show run
    !
    interface vlan10
     ip igmp
     ip pim
    !
    
  3. 验证源的 RPF 接口是否与接收组播流量的接口匹配

    fhr# show ip rpf 10.1.10.1
    Routing entry for 10.1.10.0/24 using Unicast RIB
    Known via "connected", distance 0, metric 0, best
    Last update 1d00h26m ago
    * directly connected, vlan10
    
  4. 验证组播组的 RP 配置

    fhr# show ip pim rp-info
    RP address       group/prefix-list   OIF               I am RP    Source      Group-Type
    10.10.10.101     224.0.0.0/4         swp51             no         Static      ASM
    

活跃组的 RP 上没有 S,G

即使 FR 创建了 mroute,当组播组没有活跃接收者时,RP 也不会构建 mroute。

cumulus@rp01:~$ sudo vtysh
...
rp01# show ip mroute
Source          Group           Flags    Proto  Input            Output           TTL  Uptime

您可以使用 vtysh show ip pim upstream 命令在 RP 上查看活动源。

cumulus@rp01:~$ sudo vtysh
...
rp01# show ip pim upstream
Iif             Source          Group           State       Uptime   JoinTimer RSTimer   KATimer   RefCnt
vlan10          10.1.10.101     239.1.1.1       Prune       00:08:03 --:--:--  --:--:--  00:02:20       1

硬件中没有 mroute 条目

要验证硬件 IP 组播条目是否为最大值,请运行 cl-resource-query | grep Mcast 命令。

cumulus@switch:~$ cl-resource-query  | grep Mcast
Total Mcast Routes:         450,   0% of maximum value    450

请参阅转发表示例和配置文件大小

验证 MSDP 会话状态

要验证 MSDP 会话的状态,请运行 vtysh show ip msdp mesh-group 命令。

cumulus@switch:~$ sudo vtysh
...
switch# show ip msdp mesh-group
Mesh group : pod1
  Source : 10.1.10.101
  Member                 State
  10.1.10.102        established
  10.1.10.103        established

cumulus@switch:~$ sudo vtysh
switch# show ip msdp peer
Peer                    Local         State     Uptime    SaCnt
10.1.10.102       10.1.10.101   established    00:07:21       0
10.1.10.103       10.1.10.101   established    00:07:21       0

查看活动源

要查看交换机本地(通过 PIM 注册消息)和从 MSDP 对等方学习到的活动源,请运行 vtysh show ip msdp sa 命令。

cumulus@switch:~$ sudo vtysh
...
switch# show ip msdp sa
Source                Group               RP   Local    SPT      Uptime
10.1.10.101       239.1.1.1     10.10.10.101       n      n    00:00:40
10.1.10.101       239.1.1.2    100.10.10.101       n      n    00:00:25

清除 PIM 状态和统计信息

如果您正在排除故障或更改组播环境,您可以

  • 清除 VRF 中所有 PIM 接口的 PIM 邻居。
  • 清除 VRF 中所有 PIM 接口的流量统计信息。
  • 清除 IGMP 接口状态。

要清除 VRF 中所有 PIM 接口的 PIM 邻居

cumulus@switch:~$ nv action clear vrf default router pim interfaces
Action succeeded

要清除 VRF 中所有 PIM 接口的流量统计信息

cumulus@switch:~$ nv action clear vrf default router pim interface-traffic
Action succeeded

要清除 IGMP 接口状态

cumulus@switch:~$ nv action clear router igmp interfaces
Action succeeded

要清除 VRF 中所有 PIM 接口的 PIM 邻居

cumulus@switch:~$ sudo vtysh
...
switch# clear ip pim vrf default interfaces
switch# exit

要清除 VRF 中所有 PIM 接口的流量统计信息

cumulus@switch:~$ sudo vtysh
...
switch# clear ip pim vrf default interface traffic
switch# exit

要重新扫描 PIM OIL 以更新 VRF 中的输出接口列表

cumulus@switch:~$ sudo vtysh
...
switch# clear ip pim vrf default oil
switch# exit

要清除 VRF 中的所有 PIM 进程统计信息

cumulus@switch:~$ sudo vtysh
...
switch# clear ip pim statistics vrf default
switch# exit

要清除所有 PIM 进程统计信息

cumulus@switch:~$ sudo vtysh
...
switch# clear ip pim statistics
switch# exit

要清除 IGMP 接口状态

cumulus@switch:~$ sudo vtysh
...
switch# clear ip igmp interfaces
switch# exit

配置示例

以下示例在 leaf01、leaf02 和 spine01 上配置 PIM 和 BGP。

  • server01(源)通过 VLAN 感知网桥(VLAN 10)连接到 leaf01 (FHR)。
  • leaf01 通过 swp51 连接到 spine01 (RP)。
  • spine01 通过 swp2 连接到 leaf02 (LHR)。
  • leaf02 通过 VLAN 感知网桥(VLAN 20)连接到 server02(接收者)。
沿共享树的流量流




1. FHR 从源接收组播数据包,将数据包封装在单播 PIM 注册消息中,然后将其发送到 RP。

2. RP 构建 (S,G) mroute,解封装组播数据包,然后沿着 (*,G) 树向接收者转发。

3. LHR 接收组播流量,并看到它具有到源的更短路径。它从 leaf01 请求组播流,并同时将组播流发送到接收者。
最短路径树的流量流




1. FHR 直接从 LHR 听到 PIM 加入消息,并将组播流量直接转发到它。

2. LHR 同时从 FHR 和 RP 接收组播数据包。LHR 丢弃来自 RP 的数据包,并从 RP 剪枝自身。

3. RP 从 LHR 接收剪枝消息,并指示 FHR 停止发送 PIM 注册消息

4. 流量继续在 FHR 和 LHR 之间直接传输。
cumulus@leaf01:~$ nv set router pim enable on
cumulus@leaf01:~$ nv set interface lo ip address 10.10.10.1/32
cumulus@leaf01:~$ nv set interface swp1,swp49,swp51
cumulus@leaf01:~$ nv set interface swp1 bridge domain br_default
cumulus@leaf01:~$ nv set interface swp1 bridge domain br_default access 10
cumulus@leaf01:~$ nv set bridge domain br_default vlan 10
cumulus@leaf01:~$ nv set interface vlan10 ip address 10.1.10.1/24
cumulus@leaf01:~$ nv set router bgp autonomous-system 65101
cumulus@leaf01:~$ nv set router bgp router-id 10.10.10.1
cumulus@leaf01:~$ nv set vrf default router bgp neighbor swp51 remote-as external
cumulus@leaf01:~$ nv set vrf default router bgp address-family ipv4-unicast network 10.10.10.1/32
cumulus@leaf01:~$ nv set vrf default router bgp address-family ipv4-unicast network 10.1.10.0/24
cumulus@leaf01:~$ nv set interface lo router pim
cumulus@leaf01:~$ nv set interface swp51 router pim
cumulus@leaf01:~$ nv set interface vlan10 router pim
cumulus@leaf01:~$ nv set interface vlan10 ip igmp
cumulus@leaf01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101
cumulus@leaf01:~$ nv config apply
cumulus@leaf02:~$ nv set router pim enable on
cumulus@leaf02:~$ nv set interface lo ip address 10.10.10.2/32
cumulus@leaf02:~$ nv set interface swp2,swp49,swp51
cumulus@leaf02:~$ nv set interface swp2 bridge domain br_default
cumulus@leaf02:~$ nv set interface swp2 bridge domain br_default access 20
cumulus@leaf02:~$ nv set bridge domain br_default vlan 20
cumulus@leaf02:~$ nv set interface vlan20 ip address 10.2.10.1/24
cumulus@leaf02:~$ nv set router bgp autonomous-system 65102
cumulus@leaf02:~$ nv set router bgp router-id 10.10.10.2
cumulus@leaf02:~$ nv set vrf default router bgp neighbor swp51 remote-as external
cumulus@leaf02:~$ nv set vrf default router bgp address-family ipv4-unicast network 10.10.10.2/32
cumulus@leaf02:~$ nv set vrf default router bgp address-family ipv4-unicast network 10.2.10.0/24
cumulus@leaf02:~$ nv set interface lo router pim
cumulus@leaf02:~$ nv set interface swp51 router pim
cumulus@leaf02:~$ nv set interface vlan20 router pim
cumulus@leaf02:~$ nv set interface vlan20 ip igmp
cumulus@leaf02:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101
cumulus@leaf02:~$ nv config apply
cumulus@spine01:~$ nv set router pim enable on
cumulus@spine01:~$ nv set interface lo ip address 10.10.10.101/32
cumulus@spine01:~$ nv set router bgp autonomous-system 65199
cumulus@spine01:~$ nv set router bgp router-id 10.10.10.101
cumulus@spine01:~$ nv set vrf default router bgp neighbor swp1 remote-as external
cumulus@spine01:~$ nv set vrf default router bgp neighbor swp2 remote-as external
cumulus@spine01:~$ nv set vrf default router bgp address-family ipv4-unicast network 10.10.10.101/32
cumulus@spine01:~$ nv set interface lo router pim
cumulus@spine01:~$ nv set interface swp1 router pim
cumulus@spine01:~$ nv set interface swp2 router pim
cumulus@spine01:~$ nv set vrf default router pim address-family ipv4 rp 10.10.10.101 
cumulus@spine01:~$ nv config apply
cumulus@leaf01:mgmt:~$ sudo cat /etc/nvue.d/startup.yaml
- set:
    bridge:
      domain:
        br_default:
          vlan:
            '10': {}
    interface:
      eth0:
        ip:
          address:
            dhcp: {}
          vrf: mgmt
        type: eth
      lo:
        ip:
          address:
            10.10.10.1/32: {}
        router:
          pim:
            enable: on
        type: loopback
      swp1:
        bridge:
          domain:
            br_default:
              access: 10
        type: swp
      swp49:
        type: swp
      swp51:
        router:
          pim:
            enable: on
        type: swp
      vlan10:
        ip:
          address:
            10.1.10.1/24: {}
          igmp:
            enable: on
        router:
          pim:
            enable: on
        type: svi
        vlan: 10
    router:
      bgp:
        autonomous-system: 65101
        enable: on
        router-id: 10.10.10.1
      pim:
        enable: on
    service:
      ntp:
        mgmt:
          server:
            0.cumulusnetworks.pool.ntp.org: {}
            1.cumulusnetworks.pool.ntp.org: {}
            2.cumulusnetworks.pool.ntp.org: {}
            3.cumulusnetworks.pool.ntp.org: {}
    system:
      aaa:
        class:
          nvapply:
            action: allow
            command-path:
              /:
                permission: all
          nvshow:
            action: allow
            command-path:
              /:
                permission: ro
          sudo:
            action: allow
            command-path:
              /:
                permission: all
        role:
          nvue-admin:
            class:
              nvapply: {}
          nvue-monitor:
            class:
              nvshow: {}
          system-admin:
            class:
              nvapply: {}
              sudo: {}
        user:
          cumulus:
            full-name: cumulus,,,
            hashed-password: $6$Cir2YG.pLVeUZFGi$txBVny7YpjZDGE2gOIz0G.bbs3CzYQ1P9T9XgCqV7oRkfPUQ2gWoJvnnhMH3NtmVxA2.40P5bgaMydfBsIzYP0
            role: system-admin
      api:
        state: enabled
      config:
        auto-save:
          enable: on
      control-plane:
        acl:
          acl-default-dos:
            inbound: {}
          acl-default-whitelist:
            inbound: {}
      global:
        system-mac: 44:38:39:22:01:7a
      hostname: leaf01
      reboot:
        mode: cold
      ssh-server:
        state: enabled
      wjh:
        channel:
          forwarding:
            trigger:
              l2: {}
              l3: {}
              tunnel: {}
        enable: on
    vrf:
      default:
        router:
          bgp:
            address-family:
              ipv4-unicast:
                enable: on
                network:
                  10.1.10.0/24: {}
                  10.10.10.1/32: {}
            enable: on
            neighbor:
              swp51:
                remote-as: external
                type: unnumbered
          pim:
            address-family:
              ipv4:
                rp:
                  10.10.10.101: {}
            enable: on
cumulus@leaf02:mgmt:~$ sudo cat /etc/nvue.d/startup.yaml
- set:
    bridge:
      domain:
        br_default:
          vlan:
            '20': {}
    interface:
      eth0:
        ip:
          address:
            dhcp: {}
          vrf: mgmt
        type: eth
      lo:
        ip:
          address:
            10.10.10.2/32: {}
        router:
          pim:
            enable: on
        type: loopback
      swp2:
        bridge:
          domain:
            br_default:
              access: 20
        type: swp
      swp49:
        type: swp
      swp51:
        router:
          pim:
            enable: on
        type: swp
      vlan20:
        ip:
          address:
            10.2.10.1/24: {}
          igmp:
            enable: on
        router:
          pim:
            enable: on
        type: svi
        vlan: 20
    router:
      bgp:
        autonomous-system: 65102
        enable: on
        router-id: 10.10.10.2
      pim:
        enable: on
    service:
      ntp:
        mgmt:
          server:
            0.cumulusnetworks.pool.ntp.org: {}
            1.cumulusnetworks.pool.ntp.org: {}
            2.cumulusnetworks.pool.ntp.org: {}
            3.cumulusnetworks.pool.ntp.org: {}
    system:
      aaa:
        class:
          nvapply:
            action: allow
            command-path:
              /:
                permission: all
          nvshow:
            action: allow
            command-path:
              /:
                permission: ro
          sudo:
            action: allow
            command-path:
              /:
                permission: all
        role:
          nvue-admin:
            class:
              nvapply: {}
          nvue-monitor:
            class:
              nvshow: {}
          system-admin:
            class:
              nvapply: {}
              sudo: {}
        user:
          cumulus:
            full-name: cumulus,,,
            hashed-password: $6$02mrE7tXtzp0MzJV$Ou9Vo4jcCC5ztEzb8ChYrDaGiqGwLKPQj2VRPEDYt0/EuTjmVDXM65TpJ06cmPGQZ0bf5NEmaMAH7cXkTQ4j9/
            role: system-admin
      api:
        state: enabled
      config:
        auto-save:
          enable: on
      control-plane:
        acl:
          acl-default-dos:
            inbound: {}
          acl-default-whitelist:
            inbound: {}
      global:
        system-mac: 44:38:39:22:01:78
      hostname: leaf02
      reboot:
        mode: cold
      ssh-server:
        state: enabled
      wjh:
        channel:
          forwarding:
            trigger:
              l2: {}
              l3: {}
              tunnel: {}
        enable: on
    vrf:
      default:
        router:
          bgp:
            address-family:
              ipv4-unicast:
                enable: on
                network:
                  10.2.10.0/24: {}
                  10.10.10.2/32: {}
            enable: on
            neighbor:
              swp51:
                remote-as: external
                type: unnumbered
          pim:
            address-family:
              ipv4:
                rp:
                  10.10.10.101: {}
            enable: on
cumulus@spine01:mgmt:~$ sudo cat /etc/nvue.d/startup.yaml
- set:
    interface:
      eth0:
        ip:
          address:
            dhcp: {}
          vrf: mgmt
        type: eth
      lo:
        ip:
          address:
            10.10.10.101/32: {}
        router:
          pim:
            enable: on
        type: loopback
      swp1:
        router:
          pim:
            enable: on
        type: swp
      swp2:
        router:
          pim:
            enable: on
        type: swp
    router:
      bgp:
        autonomous-system: 65199
        enable: on
        router-id: 10.10.10.101
      pim:
        enable: on
    service:
      ntp:
        mgmt:
          server:
            0.cumulusnetworks.pool.ntp.org: {}
            1.cumulusnetworks.pool.ntp.org: {}
            2.cumulusnetworks.pool.ntp.org: {}
            3.cumulusnetworks.pool.ntp.org: {}
    system:
      aaa:
        class:
          nvapply:
            action: allow
            command-path:
              /:
                permission: all
          nvshow:
            action: allow
            command-path:
              /:
                permission: ro
          sudo:
            action: allow
            command-path:
              /:
                permission: all
        role:
          nvue-admin:
            class:
              nvapply: {}
          nvue-monitor:
            class:
              nvshow: {}
          system-admin:
            class:
              nvapply: {}
              sudo: {}
        user:
          cumulus:
            full-name: cumulus,,,
            hashed-password: $6$ojEWGEv5NjLUIQ2T$3YJ2PBG0ekWj0nUoY5Psn8wzd6lsxW8KxDTMTXGZiZwoT8VMSYF0zqF/3AVjx3NhIJ8x10YJ5aCTeBz7kR7Ns1
            role: system-admin
      api:
        state: enabled
      config:
        auto-save:
          enable: on
      control-plane:
        acl:
          acl-default-dos:
            inbound: {}
          acl-default-whitelist:
            inbound: {}
      global:
        system-mac: 44:38:39:22:01:82
      hostname: spine01
      reboot:
        mode: cold
      ssh-server:
        state: enabled
      wjh:
        channel:
          forwarding:
            trigger:
              l2: {}
              l3: {}
              tunnel: {}
        enable: on
    vrf:
      default:
        router:
          bgp:
            address-family:
              ipv4-unicast:
                enable: on
                network:
                  10.10.10.101/32: {}
            enable: on
            neighbor:
              swp1:
                remote-as: external
                type: unnumbered
              swp2:
                remote-as: external
                type: unnumbered
          pim:
            address-family:
              ipv4:
                rp:
                  10.10.10.101: {}
            enable: on
cumulus@leaf01:mgmt:~$ sudo cat /etc/network/interfaces
...
auto lo
iface lo inet loopback
    address 10.10.10.1/32
auto mgmt
iface mgmt
    address 127.0.0.1/8
    address ::1/128
    vrf-table auto
auto eth0
iface eth0 inet dhcp
    ip-forward off
    ip6-forward off
    vrf mgmt
auto swp1
iface swp1
    bridge-access 10
auto swp49
iface swp49
auto swp51
iface swp51
auto vlan10
iface vlan10
    address 10.1.10.1/24
    hwaddress 44:38:39:22:01:b1
    vlan-raw-device br_default
    vlan-id 10
auto br_default
iface br_default
    bridge-ports swp1
    hwaddress 44:38:39:22:01:b1
    bridge-vlan-aware yes
    bridge-vids 10
    bridge-pvid 1
cumulus@leaf02:mgmt:~$ sudo cat /etc/network/interfaces
...
auto lo
iface lo inet loopback
    address 10.10.10.2/32
auto mgmt
iface mgmt
    address 127.0.0.1/8
    address ::1/128
    vrf-table auto
auto eth0
iface eth0 inet dhcp
    ip-forward off
    ip6-forward off
    vrf mgmt
auto swp2
iface swp2
    bridge-access 20
auto swp49
iface swp49
auto swp51
iface swp51
auto vlan20
iface vlan20
    address 10.2.10.1/24
    hwaddress 44:38:39:22:01:af
    vlan-raw-device br_default
    vlan-id 20
auto br_default
iface br_default
    bridge-ports swp2
    hwaddress 44:38:39:22:01:af
    bridge-vlan-aware yes
    bridge-vids 20
    bridge-pvid 1
cumulus@spine01:mgmt:~$ sudo cat /etc/network/interfaces
...
auto lo
iface lo inet loopback
    address 10.10.10.101/32
auto mgmt
iface mgmt
    address 127.0.0.1/8
    address ::1/128
    vrf-table auto
auto eth0
iface eth0 inet dhcp
    ip-forward off
    ip6-forward off
    vrf mgmt
auto swp1
iface swp1
auto swp2
iface swp2
cumulus@server01:~$ sudo cat /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
# The OOB network interface
auto eth0
iface eth0 inet dhcp
# The data plane network interfaces
auto eth1
iface eth1 inet manual
  address 10.1.10.101
  netmask 255.255.255.0
  mtu 9000
  post-up ip route add 10.0.0.0/8 via 10.1.10.1
cumulus@server02:~$ sudo cat /etc/network/interfaces
auto lo
iface lo inet loopback
# The OOB network interface
auto eth0
iface eth0 inet dhcp
# The data plane network interfaces
auto eth2
iface eth2 inet manual
  address 10.2.10.102
  netmask 255.255.255.0
  mtu 9000
  post-up ip route add 10.0.0.0/8 via 10.2.10.1
cumulus@leaf01:mgmt:~$ sudo cat /etc/frr/frr.conf
...

vrf default ip pim rp 10.10.10.101 224.0.0.0/4 exit-vrf vrf mgmt exit-vrf interface lo ip pim interface swp51 ip pim interface vlan10 ip igmp ip igmp version 3 ip igmp query-interval 125 ip igmp last-member-query-interval 100 ip igmp last-member-query-count 2 ip igmp query-max-response-time 1000 ip pim router bgp 65101 vrf default bgp router-id 10.10.10.1 timers bgp 3 9 bgp deterministic-med ! Neighbors neighbor swp51 interface remote-as external neighbor swp51 timers 3 9 neighbor swp51 timers connect 10 neighbor swp51 advertisement-interval 0 neighbor swp51 capability extended-nexthop ! Address families address-family ipv4 unicast network 10.1.10.0/24 network 10.10.10.1/32 maximum-paths ibgp 64 maximum-paths 64 distance bgp 20 200 200 neighbor swp51 activate exit-address-family ! end of router bgp 65101 vrf default

cumulus@leaf02:mgmt:~$ sudo cat /etc/frr/frr.conf
...
vrf default
ip pim rp 10.10.10.101 224.0.0.0/4
exit-vrf
vrf mgmt
exit-vrf
interface lo
ip pim
interface swp51
ip pim
interface vlan20
ip igmp
ip igmp version 3
ip igmp query-interval 125
ip igmp last-member-query-interval 100
ip igmp last-member-query-count 2
ip igmp query-max-response-time 1000
ip pim
router bgp 65102 vrf default
bgp router-id 10.10.10.2
timers bgp 3 9
bgp deterministic-med
! Neighbors
neighbor swp51 interface remote-as external
neighbor swp51 timers 3 9
neighbor swp51 timers connect 10
neighbor swp51 advertisement-interval 0
neighbor swp51 capability extended-nexthop
! Address families
address-family ipv4 unicast
network 10.10.10.2/32
network 10.2.10.0/24
maximum-paths ibgp 64
maximum-paths 64
distance bgp 20 200 200
neighbor swp51 activate
exit-address-family
! end of router bgp 65102 vrf default
cumulus@spine01:mgmt:~$ sudo cat /etc/frr/frr.conf
...
rf default
ip pim rp 10.10.10.101 224.0.0.0/4
exit-vrf
vrf mgmt
exit-vrf
interface lo
ip pim
interface swp1
ip pim
interface swp2
ip pim
router bgp 65199 vrf default
bgp router-id 10.10.10.101
timers bgp 3 9
bgp deterministic-med
! Neighbors
neighbor swp1 interface remote-as external
neighbor swp1 timers 3 9
neighbor swp1 timers connect 10
neighbor swp1 advertisement-interval 0
neighbor swp1 capability extended-nexthop
neighbor swp2 interface remote-as external
neighbor swp2 timers 3 9
neighbor swp2 timers connect 10
neighbor swp2 advertisement-interval 0
neighbor swp2 capability extended-nexthop
! Address families
address-family ipv4 unicast
network 10.10.10.101/32
maximum-paths ibgp 64
maximum-paths 64
distance bgp 20 200 200
neighbor swp1 activate
neighbor swp2 activate
exit-address-family
! end of router bgp 65199 vrf default

此模拟正在运行 Cumulus Linux 5.11。Cumulus Linux 5.12 模拟即将推出。

模拟从示例 PIM 配置开始。为了简化示例,拓扑中只有一个 spine 和两个 leaf。演示已使用 NVUE 命令预先配置。

要验证配置,请运行上面故障排除部分中列出的 PIM show 命令。

注意事项

  • Cumulus Linux 不支持非原生转发(注册解封装)。当 PIM *,G 树正在从 RP 构建到 FHR 以触发原生转发时,预计会出现初始数据包丢失。
  • 当通过 *,G 树转发时,Cumulus Linux 不会构建 S,G mroute。
  • 在 Spectrum-4 交换机上,小于 512 字节的数据包的组播流可能无法达到全线速。Cumulus Linux 支持 512 字节和更大的组播数据包。