要使您的网络转发,需要两个重要的协议 组播数据包:IGMP和PIM。在本文中,我将向您展示如何设置这些 协议 在您的网络上以及如何对其进行故障排除。

配置PIM和IGMP

PIM(协议无关组播) 有两个主要版本,分别称为“密集模式”和“稀疏模式”。还有一个“稀疏密集模式”,具有两种版本的功能,实际上仅用于帮助引导多播网络。由于这是一篇简短的博客文章,而不是一本书,因此,我们将着眼于我们认为是实现多播网络的最佳方式的可靠性和安全性。因此,我们将仅讨论“稀疏模式”。

PIM仅在 三层网络设备 像路由器和 防火墙。它永远不会在服务器和工作站等终端设备或交换机等第二层设备上运行。它的功能是创建之间的无环组播转发树 网段.

配置PIM-SM

让我们直接跳入Cisco设备的配置,然后讨论发生的情况:

RouterA#configure terminal 
Enter configuration commands, one per line. End with CNTL/Z. 
RouterA(config)#ip multicast-routing 
RouterA(config)#ip pim rp-address 192.168.100.5 
RouterA(config)#interface Ethernet0/0 
RouterA(config-if)#ip address 192.168.1.1 255.255.255.0 
RouterA(config-if)#ip pim sparse-mode 
RouterA(config-if)#interface Ethernet0/1 
RouterA(config-if)#ip address 192.168.2.1 255.255.255.0
RouterA(config-if)#ip pim sparse-mode 
RouterA(config-if)#end 
RouterA#

在此示例中,我们完成了三件事:首先,“ ip multicast-routing命令”启用多播路由,由于大多数网络都不使用它,因此默认情况下将其禁用。在Cisco Nexus设备上,您需要先使用“功能pim”命令启用PIM功能,然后再使用其他任何命令。

其次,以上示例定义了 集合点(RP)。 RP是路由器,位于网络中的某个位置,它知道如何到达多播源设备。在该示例中,为所有可能的多播数据流定义了一个RP。这并不总是可行的。如果必须管理许多多播源和组,或者某些多播组源自外部网络,则为不同的组使用不同的RP可能很方便。进行配置的语法取决于您使用的设备类型。在较旧的Cisco IOS路由器上,语法指定了如下编号的ACL。

RouterA(config)#ip pim rp-address 192.168.100.5 55
RouterA(config)#ip pim rp-address 192.168.101.12 56
RouterA(config)#access-list 55 permit 224.0.100.0 0.0.0.255
RouterA(config)#access-list 56 permit 224.0.200.1

在这里,我们定义了两个不同的RP 访问列表。第一个将用于224.0.100.0-255范围内的所有内容,第二个将仅用于224.0.200.1。

在Nexus设备上,语法改为使用前缀列表。这是等效的Nexus配置:

RouterA(config)#ip pim rp-address 192.168.100.5 prefix-list RP-1-groups
RouterA(config)#ip pim rp-address 192.168.101.12 prefix-list RP-2-groups
RouterA(config)#ip prefix-list RP-1-groups permit 224.0.100.0/24
RouterA(config)#ip prefix-list RP-1-groups permit 224.0.200.1/32

在Nexus配置中,您还可以在像这样的简单示例中直接在RP配置上指定组。请注意,前缀列表方法通常是可取的,因为它在指定较长的组列表时提供了更大的灵活性。

RouterA(config)#ip pim rp-address 192.168.100.5 group-list 224.0.100.0/24
RouterA(config)#ip pim rp-address 192.168.101.12 group-list 224.0.200.1/32

在上面的示例中,我们仅显示了网络中某个随机位置的一台路由器。该路由器不是RP,我们仅配置了两个接口来参与多播。该路由器将仅转发多播 在这两个接口之间。

配置IGMP

在引言中,我说第二个重要协议是 IGMP(Internet组成员协议)。希望接收多播数据流的设备使用此方法。每个多播数据流由数据包中的目标IP地址定义,称为组IP。接收器设备使用IGMP来请求他们想要接收的组。

当路由器从接收方接收到IGMP“加入”消息时,通常不知道发送方将在哪里。这就是RP会做的。但是IGMP有一种方法也可以解决此问题。

向后箭头

照片:Unsplash

有两种常用的IGMP版本。版本1的原始版本被版本2取代,该版本解决了版本1的一些重要缺陷。因此,实际上不再建议使用版本1。版本3包含一个称为 SSM(特定源组播)。使用SSM,接收方设备可以请求多播组,并要求它仅希望从特定的源设备接收该组。

如果你’重新使用SSM,重要的是路由器知道它需要使用请求的源,而不是向RP查询组播源。

在路由器接口上启用PIM后,默认情况下将默认启用IGMP版本2。如果需要IGMP版本3,则需要对其进行显式配置。

RouterA(config)#interface Ethernet0/0 
RouterA(config-if)#ip igmp version 3

请注意,除非您通常不希望进行配置’重新使用SSM。但是,版本3也向后兼容版本2,因此您不会因此而失去功能。


配置RP

接下来,我们配置RP,它将是另一个路由器。通常,RP将是位于网络中心或源附近的路由器。 RP由 IP地址。由于它必须是可到达的,因此最佳实践是使其回环 接口 而不是 物理接口.

Router-RP#configure terminal 
Enter configuration commands, one per line. End with CNTL/Z.
Router-RP(config)#ip multicast-routing 
Router-RP(config)#interface Loopback0 
Router-RP(config-if)#ip address 192.168.100.5 255.255.255.255 
Router-RP(config-if)#ip pim sparse-mode 
Router-RP(config-if)#exit 
Router-RP(config)#interface Ethernet0/0 
Router-RP(config-if)#ip address 192.168.2.10 255.255.255.0 
Router-RP(config-if)#ip pim sparse-mode 
Router-RP(config-if)#exit 
Router-RP(config)#interface Ethernet0/1 
Router-RP(config-if)#ip address 192.168.10.1 255.255.255.0 
Router-RP(config-if)#ip pim sparse-mode 
Router-RP(config-if)#exit 
Router-RP(config)#ip pim rp-address 192.168.100.5 55 
Router-RP(config)#access-list 55 permit 224.0.100.0 0.0.0.255 
Router-RP(config)#end

此示例与上一个示例相似。我们启用了多播路由,并使用“ip pim sparse-mode.”额外的一点是,我们还创建了一个环回接口,该接口将用作RP地址。请注意,由于这将是我们的RP,因此还必须启用PIM。

另请注意,该示例包括一个“ip pim rp-address”命令指向自身,因此该路由器知道它是已定义组的RP。
必须在多播转发所涉及的每个接口上启用PIM。这包括具有多播流量来源或使用者的任何接口,以及路由器之间需要将多播流量相互转发的所有链接。

静态和动态RP

您会在互联网上找到许多PIM配置文档,这些文档与动态RP发现有关。有两种协议可以做到这一点:BSR(引导路由器) 和自动RP。在这两种情况下,都使用多播来发现和中继有关RP的信息,这会立即造成麻烦,因为没有RP组播转发就无法进行。因此,网络需要自行“引导”(因此使用第一个协议的名称)以找到RP。

动态RP解决了如何动态查找,更改或重新分配RP的管理问题。但是,这样做会造成严重的 安全问题—网络上的任何设备都可能伪装成RP,从而破坏多播转发或注入虚假的多播数据包。另外,用于转发旨在通告和发现RP的多播数据包的转发机制可能会被滥用于其他目的。这些复杂的问题可以解决,但是解决方案导致网络配置越来越复杂。

动态RP解决的另一个问题是如何动态处理生产网络中RP的故障。在最简单的情况下,将RP定义为单个路由器上的环回接口,这是真正的危险。但这可以通过静态RP使用“ Anycast RP”方法解决,具体方法请参见 RFC 4610。在这种方法中,在两个或多个路由器上配置了相同的环回地址,每个路由器都可以充当RP,并且所有路由器都将该地址通告到路由协议中。

这样,网络中的其他路由器仅使用最近的RP。共享该公用RP地址的路由器必须以某种方式共享有关多播源设备位置的信息,因此该方案还会带来其他麻烦。使用另一个称为 MSDP(组播源发现协议)。对MSDP的讨论不在本文讨论范围之内。

我相信,在大多数网络中,使用静态RP的管理弊端远没有确保动态协议免遭滥用所涉及的问题严重。因此,我强烈建议您使用静态RP(可能与Anycast RP保持弹性),除非有一些令人信服的原因,例如RP和组IP的频繁重新分配。

对PIM和IGMP进行故障排除

组播要求您与对网络中的正常单播问题进行故障排除时的想法有所不同。特别是,尽管PIM使用与单播网络相同的路由表,但是多播向后路由。所有路由均不视为通向目的地的路径,而是通向源的路径。这就是所谓的 反向路径转发.

路由

首先要看的是多播路由,即“ mroute”。

RouterA#show ip mroute 
IP Multicast Routing Table 
Flags: D - Dense, S - Sparse, C - Connected, L - Local, P – Pruned 
R - RP-bit set, F - Register flag, T - SPT-bit set, J - Join SPT 
Timers: Uptime/Expires 
Interface state: Interface, Next-Hop or VCD, State/Mode 

(*, 224.0.100.40), 02:15:11/00:00:00, RP 0.0.0.0, flags: DJCL 
 Incoming 接口: Null, RPF nbr 0.0.0.0 
 Outgoing 接口 list:
   Ethernet0/0, Forward/Sparse-Dense, 02:15:11/00:00:00

(192.168.12.2/32, 224.0.100.40), 00:01:51/00:01:18, flags: CT
 Incoming 接口: Ethernet0/1, RPF nbr 0.0.0.0
 Outgoing 接口 list: 
   Ethernet0/0, Forward/Sparse-Dense, 00:01:51/00:00:00


交货

照片:Unsplash

此输出显示单个多播路由。在定义所有标志含义的标准顶部之后,有两个信息块。对于(*,224.0.100.40),第一个称为“(*,G)”。此块显示在接口Ethernet0 / 0上已收到对该组的请求(通过PIM或IGMP)。如果您只有(*,G)条目,则表明路由器未将多播传送到目的地,但收到了它的请求。

第二个块用于“(S,G)”,其中包括发送此多播组的服务器的源IP。来自该源的数据包在接口Ethernet0 / 1上接收,并通过Ethernet0 / 0转发出去。因此,该条目满足上一个块的请求。

如果您拥有第一个路由器而不是第二个路由器,则将多播数据包传送到此路由器存在问题。首先要寻找的是到源设备的单播路由。每个路由器都要求仅转发在接口上返回的,指向数据包头中指示的源的多播数据包-反向路径转发。如果单播路由表包括不同的接口作为到源的路径,则路由器将丢弃传入的多播数据包。

需要使用此严格的RPF规则,以确保转发多播数据包时不存在环路。您可以使用以下命令检查路由器认为RPF接口应该使用的内容:

RouterA# show ip rpf 192.168.12.2
RPF information for ? (192.168.12.2)
  RPF 接口: Ethernet0/1
  RPF neighbor: ? (192.168.2.10)
  RPF route/mask: 192.168.12.0/24
  RPF type: unicast
  RPF recursion count: 0
  Doing distance-preferred lookups across tables

此输出显示路由器认为该源的RPF树应为什么样。如果显示“失败,没有路由”之类的字样,则说明存在不匹配。单播表中可能缺少路由,或者单播路由表中指定的接口未启用PIM。

如果您在mroute表中看不到第一和第二信息块,则表明路由器未收到对该组的请求。您应该查看接收器设备的路径,或者,如果它在本地连接的网段上,请查看PIM配置或所连接接口上的IGMP问题。

IGMP

接下来要看的是IGMP。

RouterA# show ip igmp groups 
Group Address Interface Uptime Expires Last Reporter
224.0.100.40 Ethernet0/0 00:16:32  00:01:51 192.168.1.12 
RouterA#

此输出表明,通过以太网0/0直接连接的网段上的至少一个设备已请求组224.0.100.40。它还告诉我们,上一个这样的请求是来自地址为192.168.1.12的设备的。请记住,这不一定是唯一的请求者。实际上,它甚至可能不是真正的请求者IP。在许多网络体系结构中,您可能有一个中间的第2层设备,该设备可以获取所有IGMP请求并代表它们进行操作。该设备称为 查询者.

查询者可以是例如管理该分段的组成员身份的第2层交换机。然后,查询者可以确保确切知道哪个物理接口包含真正的请求者,并且可以通过为每个组仅提供一个请求来减少路由器的IGMP流量。同样,当最后一个设备离开该组时,查询器可以发送一条“离开”消息来告诉路由器拆除该多播树。

PIM邻居

PIM在路由器之间逐跳运行。因此,要查看的重要内容之一是PIM邻居表。

RouterA#show ip pim neighbor 
PIM Neighbor Table 
Neighbor Address Interface 	Uptime   Expires  Ver Mode 
192.168.2.10 	  Ethernet0/1	16:34:23 00:01:38 v2 
RouterA#

这表明我们的路由器具有一个通过其Ethernet0 / 1接口连接的活动PIM邻居。如果你’在多播转发遇到问题时,验证源和接收方之间的所有路由器之间是否正在建立PIM邻居关系非常有用。