隧道是通的,单播 ping 能穿过去,接收端却仍然黑屏。在 PIM-SM 部署中,这个症状几乎总意味着四条控制路径中有一条断了,而数据路径从来不是问题。请按顺序走完下面的清单,在第一个失败的步骤停下,因为后面每一步都依赖前一步。我把这五项检查放在一个草稿文件里,遇到组播投诉就粘贴到终端,这样诊断不会变成猜测。

从接收端开始,而不是从隧道开始

从未申请加入组的接收端不会在任何路由器上产生状态,所以在检查其他任何东西之前,先确认面向接收端的网段上确实存在加入。在 Cisco 风格的平台上,最后一跳路由器上的 show ip igmp groups 会把已加入的组打印在听到它们的那块接口旁边。如果输出里没有这个组,隧道就是干扰项:请求死在接入交换机、主机套接字,或者没有 querier 的 VLAN 里。

我见过的大多数缺失加入都由两个平淡的原因造成:主机与路由器之间的 IGMP 版本不一致,以及 querier 选举落到了不做路由的交换机上。第三个更微妙:组确实加入了,但在错误的 VLAN 上,因为主机有两块网卡而应用绑到了错的那块。IPv6 接收端在 MLD 上有同样的问题,那里 show ipv6 mld groups 回答的是同一个问题。这些都不是靠碰隧道能修好的,这正是顺序重要的原因。

一旦看到加入,先确认 PIM 在面向接收端的接口和通往汇聚点的接口上都已启用。有 IGMP 成员关系、但上游接口没开 PIM 的路由器,只会把组留在本地表里,什么也不会发出去。

BSR 集合能到达另一端吗?

Bootstrap Router 消息在单个 PIM 域内逐跳传递,而这正是跨隧道会断掉的方向。候选 RP 用单播把通告发给选举出的 BSR,所以 RP 到 BSR 这一段在正常隧道里通常原样保留。另一个方向的 Bootstrap 消息洪泛则取决于每个中间接口都启用了 PIM,并且边界上没有东西拦住消息。 RFC 5059 定义了这种分发,以及允许截断它的管理范围边界。

ip pim bsr-border 语句、过滤协议 103 的 ACL,或者无法承载组播的基于策略的 IPsec 隧道,都会切断洪泛,而单播保持完好。正是这种组合让故障看起来像 RP 的问题,实际上却是可达性问题,所以我先读 BSR 状态,再读 RP 配置。

在远端路由器上,show ip pim bsr-router 会给出选出的 BSR 和学到的 RP 集合;如果输出为空,远端就在自己的域里,再怎么配 RP 也无法让两边对上。比较隧道两侧 show ip pim rp mapping 里的组范围和 RP 地址。只存在于本地的映射会产生一棵在错误位置终止的共享树,接收端就会一直等下去。

让隧道两侧的 RP 映射一致

静态 RP、BSR 和 anycast-RP 是回答同一个问题的三种方式,把它们跨隧道混用,是构建一个永不收敛的域的可靠办法。如果头端用 BSR,分支却用指向别的地址的静态 ip pim rp-address,分支就会朝一个根本不知道接收端存在的 RP 建共享树。映射必须在组范围和地址上都一致,因为更具体的范围会压过更宽的范围。

anycast-RP 的存在正是为了让两个站点共用一个 RP 地址,这里值得一提,因为它改变了「同一个 RP」的含义。宣告同一个地址的两个 RP 在设计中是一致的;为同一范围宣告不同地址的两个 RP 则不是,无论每个站点单看多么健康。

对于 232.0.0.0/8 内的源特定组播,根本不会去问 RP,所以空的 RP 映射并不自动是故障。在追一个从未被需要的 RP 之前,先确定应用用的是哪种服务模型。

读取朝向源的 RPF 查找

PIM 通过反转单播路径来建树,所以真正重要的检查是回到源的路由,共享树则是回到 RP 的路由。到达路由器不认为是上游的接口的加入会被丢弃,原因记为 RPF 失败而不是隧道失败。在默认路由走隧道、更具体路由走 WAN 的分支路由器上,RPF 接口很容易就是 WAN,尽管源只能经隧道到达。这是加入被悄悄丢弃最常见的一个原因。

show ip rpf 192.0.2.10 会打印选中的接口、下一跳以及做出该决定的路由,通常足以看出不一致。像 ip mroute 192.0.2.0 255.255.255.0 tunnel0 这样的静态组播路由会覆盖该前缀的单播查找,当组播拓扑确实不同于单播拓扑时,这是合理的修法。要把它当作需要记录的配置,而不是事故中临时打上、事后就忘的补丁。

用命令确认加入,而不是用 ping

ping 只能证明单播可用,这一点你早就知道。端到端确认是一组按顺序展示加入、映射、邻居和树的命令,每条命令回答的是不同的问题。

show ip igmp groups 239.1.1.1
show ip pim rp mapping
show ip pim neighbor
show ip rpf 192.0.2.10
show ip mroute 239.1.1.1

一条填有真实入接口和非空出接口列表的 (S,G) 表项,意味着控制平面完成了它的工作。入接口显示为 Null 的表项,或者标着 RPF failed 且不断增长的计数器,指向的是上一节而不是隧道。

如果五条命令看起来都对,接收端却仍然什么都看不到,剩下的嫌疑就是隧道自身的策略:一条允许单播路由协议、却不允许 PIM、IGMP 或组流量的加密 ACL 或防火墙规则。在基于策略的 IPsec 隧道上,组播根本不会被承载,所以答案是 GRE 或 VTI 设计,而不是再加一条过滤器例外。在改动任何东西之前,先写下五项检查中哪一项失败了,然后只改那一层。

相关文章