1、RPF 检测失败导致组播不可达的经验案例一、组网:实际组网如下图,三台 MSR 路由器启用 OSPF,保证全网连通。Router A 与Router 分别连接组播源和组播接收 PC,希望 PC 能够正常接收组播数据。二、问题描述:如上图组网后,保证路由状态正常,发现并没有出现想要的结果:接收组播的PC 并不能收到组播源的组播报文。三、过程分析:三台路由器上的简略配置和单播路由表如下:Router A配置sysname H3C#interface Serial3/0link-protocol pppip address 10.0.0.1 255.0.0.0ospf cost 1#interfac
2、e GigabitEthernet0/0port link-mode routeip address 20.0.0.1 255.0.0.0pim dm#interface GigabitEthernet0/1port link-mode routeip address 1.0.0.1 255.0.0.0pim dm#ospf 1area 0.0.0.0network 1.0.0.0 0.0.0.255network 20.0.0.0 0.0.0.255network 10.0.0.0 0.0.0.255#dis ip rouRouting Tables: PublicDestinations
3、: 11 Routes : 12Destination/Mask Proto Pre Cost NextHop Interface1.0.0.0/8 Direct 0 0 1.0.0.1 GE0/11.0.0.1/32 Direct 0 0 127.0.0.1 InLoop02.0.0.0/8 OSPF 10 2 10.0.0.2 S3/010.0.0.0/8 Direct 0 0 10.0.0.1 S3/010.0.0.1/32 Direct 0 0 127.0.0.1 InLoop010.0.0.2/32 Direct 0 0 10.0.0.2 S3/020.0.0.0/8 Direct
4、0 0 20.0.0.1 GE0/020.0.0.1/32 Direct 0 0 127.0.0.1 InLoop030.0.0.0/8 OSPF 10 2 20.0.0.3 GE0/0OSPF 10 2 10.0.0.2 S3/0127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0Router B配置sysname H3C#interface Ethernet0/0port link-mode routeip address 30.0.0.2 255.0.0.0pim dm#inte
5、rface Ethernet0/1port link-mode routeip address 2.0.0.2 255.0.0.0igmp enable#interface Serial3/0fe1 clock masterlink-protocol pppip address 10.0.0.2 255.0.0.0ospfcost 1#ospf 1 import-route directarea 0.0.0.0network 2.0.0.0 0.0.0.255network 10.0.0.0 0.0.0.255network 30.0.0.0 0.0.0.255#dis ip rouRouti
6、ng Tables: PublicDestinations : 11 Routes : 12Destination/Mask Proto Pre Cost NextHop Interface1.0.0.0/8 OSPF 10 2 10.0.0.1 S3/02.0.0.0/8 Direct 0 0 2.0.0.2 Eth0/12.0.0.2/32 Direct 0 0 127.0.0.1 InLoop010.0.0.0/8 Direct 0 0 10.0.0.2 S3/010.0.0.1/32 Direct 0 0 10.0.0.1 S3/010.0.0.2/32 Direct 0 0 127.
7、0.0.1 InLoop020.0.0.0/8 OSPF 10 2 30.0.0.3 Eth0/0OSPF 10 2 10.0.0.1 S3/030.0.0.0/8 Direct 0 0 30.0.0.2 Eth0/030.0.0.2/32 Direct 0 0 127.0.0.1 InLoop0127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0Router C配置sysname H3C#interface Ethernet0/0port link-mode routeip addr
8、ess 30.0.0.3 255.0.0.0pim dm#interface Ethernet0/1port link-mode routeip address 20.0.0.3 255.0.0.0pim dm#interface NULL0#ospf 1area 0.0.0.0network 30.0.0.0 0.0.0.255network 20.0.0.0 0.0.0.255#dis ip rouRouting Tables: PublicDestinations : 8 Routes : 8Destination/Mask Proto Pre Cost NextHop Interfac
9、e1.0.0.0/8 OSPF 10 2 20.0.0.1 Eth0/12.0.0.0/8 OSPF 10 2 30.0.0.2 Eth0/020.0.0.0/8 Direct 0 0 20.0.0.3 Eth0/120.0.0.3/32 Direct 0 0 127.0.0.1 InLoop030.0.0.0/8 Direct 0 0 30.0.0.3 Eth0/030.0.0.3/32 Direct 0 0 127.0.0.1 InLoop0127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0127.0.0.1/32 Direct 0 0 127.0.0.1 I
10、nLoop0为了解决上述的问题,首先要确定单播路由器是正确的。首先从组播接收 PC上 Ping 组播源的单播地址,测试结果如下:证明设备间的连通性没有问题,观察设备上的路由表也会发现路由学习正常。检查组播源和组播接收 PC 的配置,发现配置没有错误,组播数据已经从组播源正常发出。最后检查各个设备上的组播路由表:Router A 上的组播路由表如下:dis multicast routing-tableMulticast routing tableTotal 1 entry00001. (1.0.0.10, 230.0.0.1)Uptime: 03:37:14Upstream Interface
11、:GigabitEthernet0/1List of 1 downstream interface1: GigabitEthernet0/0Router C 上的组播路由表如下:dis multicast routing-tableMulticast routing tableTotal 1 entry00001. (1.0.0.10, 230.0.0.1)Uptime: 00:10:57Upstream Interface:Ethernet0/1List of 1 downstream interface1: Ethernet0/0而 Router B 上组播路由表为空,如果 Router
12、B 上没有组播路由表,则组播接收 PC 是不可能接收到组播报文的。为了看个究竟,我们打开设备的 debug ip packet 开关,得到如下信息:*Aug 7 14:54:34:917 2007 H3C IPFWD/7/debug_case:Receiving, interface = Ethernet0/0, version = 4, headlen = 20, tos = 0,pktlen = 284, pktid = 35482, offset = 0, ttl = 6, protocol = 17,checksum = 16940, s = 1.0.0.10, d =230.0.0.
13、1prompt:Receiving IP packet from Ethernet0/0*Aug 7 14:54:35:167 2007 H3C IPFWD/7/debug_case:Receiving, interface = Ethernet0/0, version = 4, headlen = 20, tos = 0,pktlen = 284, pktid = 35483, offset = 0, ttl = 6, protocol = 17,checksum = 16939, s = 1.0.0.10, d = 230.0.0.1prompt: Receiving IP packet
14、from Ethernet0/0*Aug 7 14:54:35:417 2007 H3C IPFWD/7/debug_case:Receiving, interface = Ethernet0/0, version = 4, headlen = 20, tos = 0,pktlen = 284, pktid = 35484, offset = 0, ttl = 6, protocol = 17,checksum = 16938, s = 1.0.0.10, d = 230.0.0.1prompt: Receiving IP packet from Ethernet0/0证明在 Router B
15、 上确实接收到了组播数据,但是路由器并没有转发,而是将数据包丢弃了。什么情况会导致这种现象呢?不难联想到如果组播(PIM DM)的RPF 检查失败会导致组播报文丢弃。一个组播路由器就有可能从两个或多个不同的接口上收到相同的多播报文,如何丢掉多余的组播报文呢?组播路由器通过进行 RPF 检查来解决这个问题。假设组播路由器从接口 i 收到了一个源地址为 S,目的地址为 G 的组播报文。组播路由器首先利用源地址 S 来查询单播路由转发表,看看如果自己收到了一个目的地址为 S 的单播报文,那么该报文应该从哪个端口送出。如果查询得到的结果为端口 i,那么就认为组播报文(S,G)通过了 RPF 检查;否则
16、就认为没有通过 RPF 检查,一般情况下没有通过 RPF 检查的报文应该加以丢弃。为了证实这样的猜测,仔细观察上述的单播和组播路由表我们不难发现,单播和组播的数据实际转发路径如下图所示:因为要求单播和组播转发使用相同的转发路径,但由于在 Router A 的 S3/0口和 Router B 的 S3/0口并没有使能 PIM DM,这时候组播报文并不能通过 RPF 检测,被 Router B 丢弃。四、解决方法:为了解决问题,必须使组播报文通过 RPF 检查。可以在 Router A 和 Router B的 S3/0接口上启用 PIM DM;当然也可以修改单播路由,使得单播路径和组播路径一致,具体作法为删除 Router A 和 Router B 的 S3/0接口上 OSPF cost 1配置,这样重新计算得到的路由器表会使得单播报文按照 Source-Router A-Router C-Router B-Receiver 的路径转发。解决 PIM DM 的组播问题可以从检查组播工具,检查单播路由和检查 RPF 三个方面考虑,最后一点通常是隐藏比较深且较难发现的,但往往也是问题的根本原因。