PIM-SM
本页介绍 MikroTik RouterOS 中的 IP 组播和 Protocol Independent Multicast - Sparse Mode(PIM-SM),解释它如何实现跨网络的高效数据共享。内容涵盖用于在独立接口之间进行组播路由的基本 PIM-SM 配置,包括接口设置、PIM 实例创建和 IGMP 集成。
PIM-SM
IP 组播是一种允许数据在互联网上高效地与众多接收者共享的技术。发送者将数据发送到特定的组播 IP 地址,接收者表明其希望接收发送到该地址的数据。然后由网络负责将数据从发送者传递给接收者。
如果某个组播组的发送者和接收者位于同一本地网段,则该过程不需要路由器。通信可以直接进行,并且可以使用 IGMP snooping 交换机来增强。但是,如果发送者和接收者位于不同网段,则必须使用组播路由协议来建立它们之间的数据传输路径。
Protocol Independent Multicast - Sparse Mode(PIM-SM 或 PIM)使 RouterOS 能够支持跨网络区域的组播流。PIM 代表 Protocol Independent Multicast,意味着它不依赖任何特定的单播路由。SM 代表 Sparse-Mode(稀疏模式),意味着通过特定的控制消息确保数据只被送达有接收者需要它的网段。除了管理网段之间数据传输的路由协议外,路由器还需要一种方式来发现其直连网段上的本地接收者。对于 IPv4,这通过 Internet Group Management Protocol(IGMP)实现,对于 IPv6 则通过 Multicast Listener Discovery(MLD)实现。

信息
RouterOS v7 的主 system 包中已提供 PIM-SM 配置。较旧的 RouterOS 版本需要安装额外的 multicast 包才能使用 PIM-SM。有关更多详细信息,请参见 Packages。
SMIPS 设备(hAP lite、hAP lite TC 和 hAP mini)不支持此功能。
单设备上的基本组播路由
设想这样一个场景:你有一台带有两个接口的路由器,即 ether1 和 ether2,它们分别设置在不同的网络中。通常,路由器会创建直连路由,两个网络上的主机将能够使用单播流量通信。但是,如果你希望在这些网络之间启用组播通信,则需要单独配置组播路由,否则它将无法工作。在此场景中,我们将创建一个简单的配置。这涉及创建一个 PIM 实例并配置所需的接口。

首先确保在路由器的接口上设置好 IP 地址。
/ip/address
add address=192.168.10.1/24 interface=ether1 network=192.168.10.0
add address=192.168.20.1/24 interface=ether2 network=192.168.20.0
配置一个 PIM 实例。对于此示例,默认设置应该可以正常工作。
/routing/pimsm/instance
add name=pimsm-instance-1
为将接收组播流量的接口添加 PIM interface template。
/routing/pimsm/interface-template
add interfaces=ether1 instance=pimsm-instance-1
在 ether2 上配置一个 IGMP 查询器,以便 PIM 实例可以了解本地组成员关系。
/routing/pimsm/igmp-interface-template
add instance=pimsm-instance-1 interfaces=ether2
现在路由器开始监听 IGMP 成员关系报告(客户端加入消息),并将组播流量路由到有兴趣接收它的客户端。
要测试该配置,你可以使用 RouterOS traffic-generator 配置一个组播发送者,并使用 GMP 配置一个 IGMP 客户端。
# Multicast Sender
/ip/address
add address=192.168.10.10/24 interface=ether1 network=192.168.10.0
/tool/traffic-generator/packet-template
add interface=ether1 ip-dst=229.1.1.2 mac-dst=01:00:5E:01:01:02/FF:FF:FF:FF:FF:FF name=multicast
/tool/traffic-generator/quick tx-template=multicast mbps=10
# Multicast Client
/ip/address
add address=192.168.20.10/24 interface=ether1 network=192.168.20.0
/routing/gmp
add disabled=no groups=229.1.1.2 interfaces=ether1
要验证组播流量是否被正确路由,请监控客户端接口上接收到的数据包计数器,或使用 Torch 或 Packet Sniffer 等工具。
也可以监控路由器上的活动组播组:
/routing/pimsm/uib-g/print
Columns: INSTANCE, GROUP
# INSTANCE GROUP
0 pimsm-instance-1 229.1.1.2
/routing/pimsm/uib-sg/print
Flags: K - KEEPALIVE; S - SPT-BIT
Columns: INSTANCE, GROUP, SOURCE
# INSTANCE GROUP SOURCE
0 KS pimsm-instance-1 229.1.1.2 192.168.10.10
使用静态 RP 的组播路由
在接下来的示例中,我们将使用多台 PIM 路由器,如下图所示。PIM-SM 使用共享树,为实现这一点,我们需要指定一个特定节点作为组播根分发点。在 PIM 中,该路由器被称为 Rendezvous Point,简称 RP。在 PIM 中选择 RP 有多种方法,例如 Bootstrap Router(BSR)方法。但是在本次示例中,我们将使用一种称为静态 RP 配置的直接方法。这意味着管理员可以为特定组播组手动指定一个或多个 RP。

首先,我们需要配置 IP 地址并设置单播路由。在此示例中,我们将使用 OSPF 在路由器之间交换路由信息。有关 OSPF 的更多详细信息,请参见相应文档。
# R1 Rendezvous Point:
/ip/address
add address=10.0.0.1 interface=lo network=10.0.0.1
add address=10.0.1.1/24 interface=ether2 network=10.0.1.0
add address=10.0.2.1/24 interface=ether3 network=10.0.2.0
/routing/ospf/instance
add disabled=no name=ospf-instance-1 router-id=10.0.0.1
/routing/ospf/area
add disabled=no instance=ospf-instance-1 name=ospf-area-1
/routing/ospf/interface-template
add area=ospf-area-1 disabled=no interfaces=lo,ether2,ether3
# R2:
/ip/address
add address=10.0.0.2 interface=lo network=10.0.0.2
add address=10.0.1.2/24 interface=ether1 network=10.0.1.0
add address=192.168.20.1/24 interface=ether12 network=192.168.20.0
/routing/ospf/instance
add disabled=no name=ospf-instance-1 router-id=10.0.0.2
/routing/ospf/area
add disabled=no instance=ospf-instance-1 name=ospf-area-1
/routing/ospf/interface-template
add area=ospf-area-1 disabled=no interfaces=lo,ether1,ether12
# R3:
/ip/address
add address=10.0.0.3 interface=lo network=10.0.0.3
add address=10.0.2.3/24 interface=ether1 network=10.0.2.0
add address=192.168.30.1/24 interface=ether12 network=192.168.30.0
/routing/ospf/instance
add disabled=no name=ospf-instance-1 router-id=10.0.0.3
/routing/ospf/area
add disabled=no instance=ospf-instance-1 name=ospf-area-1
/routing/ospf/interface-template
add area=ospf-area-1 disabled=no interfaces=lo,ether1,ether12
与前一个单路由器示例一样,我们需要在所有路由器上配置 PIM 实例并添加必要的接口。
# R1 Rendezvous Point:
/routing/pimsm/instance
add disabled=no name=pimsm-instance-1
/routing/pimsm/interface-template
add instance=pimsm-instance-1 interfaces=lo,ether2,ether3
# R2:
/routing/pimsm/instance
add disabled=no name=pimsm-instance-1
/routing/pimsm/interface-template
add instance=pimsm-instance-1 interfaces=lo,ether1,ether12
/routing/pimsm/igmp-interface-template
add instance=pimsm-instance-1 interfaces=ether12
# R3:
/routing/pimsm/instance
add disabled=no name=pimsm-instance-1
/routing/pimsm/interface-template
add instance=pimsm-instance-1 interfaces=lo,ether1,ether12
/routing/pimsm/igmp-interface-template
add instance=pimsm-instance-1 interfaces=ether12
现在,让我们查看一下 PIM 邻居及其当前状态。在 R1 上有两个邻居,而在 R2 和 R3 上各只有一个邻居。
# R1 Rendezvous Point:
/routing/pimsm/neighbor/print
Flags: R - DESIGNATED-ROUTER; J - JOIN-TRACKING
Columns: INSTANCE, ADDRESS, PRIORITY
# INSTANCE ADDRESS PRIORITY
0 RJ pimsm-instance-1 10.0.1.2%ether2 1
1 RJ pimsm-instance-1 10.0.2.3%ether3 1
# R2:
/routing/pimsm/neighbor/print
Flags: R - DESIGNATED-ROUTER; J - JOIN-TRACKING
Columns: INSTANCE, ADDRESS, PRIORITY
# INSTANCE ADDRESS PRIORITY
0 J pimsm-instance-1 10.0.1.1%ether1 1
# R3:
/routing/pimsm/neighbor/print
Flags: J - JOIN-TRACKING
Columns: INSTANCE, ADDRESS, PRIORITY
# INSTANCE ADDRESS PRIORITY
0 J pimsm-instance-1 10.0.2.1%ether1 1
最后,我们将选择一台路由器作为我们的 Rendezvous Point(RP)。我们将所有 PIM 路由器都配置为使用 R1 的环回 IP 地址。确保每台路由器都有到达 R1 环回地址的正确路由信息非常重要。
# R1 Rendezvous Point:
/routing/pimsm/static-rp
add address=10.0.0.1 instance=pimsm-instance-1
# R2:
/routing/pimsm/static-rp
add address=10.0.0.1 instance=pimsm-instance-1
# R3:
/routing/pimsm/static-rp
add address=10.0.0.1 instance=pimsm-instance-1