设置跨中间跳的多播路由

设置跨中间跳的多播路由

我有一个带有两个 Docker 容器(具有以下功能)的主机NET_ADMIN

  • backend带有接口eth0172.16.7.3
  • openvpn-server使用接口eth0172.16.7.2)和tun010.8.0.1),运行 OpenVPN 服务器(tun 模式)

另一台机器上有一个 OpenVPN 客户端openvpn-client,接口为tun0( 10.8.0.2)。VPN 正在运行。

附加路线设置:

  • backend有路线10.8.0.0/24 via 172.16.7.2224.0.0.0/4 via eth0
  • openvpn-server有路线10.8.0.0/24 dev tun0224.0.0.0/4 dev tun0

backend可以成功 ping 通openvpn-client(通过 路由openvpn-server):ping 10.8.0.2运行良好。

观察结果:

当我ping -t3 239.1.2.3在 上运行时openvpn-server,这些数据包会通过 VPN 隧道,我可以看到 ICMP 数据包到达openvpn-client(在tcpdump -i tun0 net 224.0.0.0/4openvpn-client)。

此外,当我ping -t3 239.1.2.3在 上运行 时,它们会backend通过该主机退出eth0并进入。我可以使用看到它们。openvpn-servereth0openvpn-servertcpdump -i eth0 net 224.0.0.0/4

问题:

我希望能够ping -t3 239.1.2.3在 上运行backend并将 ping 转发到openvpn-client,就像10.8.0.2已经 ping 过一样。(最终目标是将 UDP 数据包从 多播backend到所有 VPN 客户端。)

我的尝试:

smcroute -d -n -j eth0 239.1.2.3 -a eth0 172.16.7.3 239.1.2.3 tun0

我以为这会设置多播路由,但实际上它什么也没做。我无法在 上看到传出的 ICMP 数据包openvpn-server。--tun0出了什么问题?


我还尝试在三台主机中的任意两对上进行设置pimd,也尝试在所有三台主机上进行设置。结果,我可以进行iperf基准测试(如建议的那样这里) 和 之间backendopenvpn-server以及 和 之间openvpn-serveropenvpn-client但不在backend和之间openvpn-client。看起来中间的跳跃转发/路由不知何故不起作用。(我已将 TTL 设置为 5,因此这应该不是问题。)

如果需要的话,我很乐意提供更多细节(例如ip route list输出),但不想不必要地混淆问题。

答案1

问题是我没有确保openvpn-client加入多播组,因此中间的路由器(openvpn-server)不知道它应该向那里发送多播流量。

以下设置即可:

  • 在 上backend,设置路由224.0.0.0/4 via 172.16.7.2——这确保多播 IP 范围的流量被发送到openvpn-server(您可能需要指定一个更窄的范围)
  • 安装并pimd启动openvpn-server
  • 确保openvpn-client宣布它想要加入多播组。为此,scmroute需要一个 IGMP 守护进程,例如。这只需两个步骤:

    1. smcroute -d-- 启动守护进程
    2. smcroute -j tun0 239.1.2.3-- 加入群组

    请注意,无法在一个命令中运行两者(smcroute -d -j tun0 ...)。

这样,一切都按预期进行。

笔记:如果在 OpenVPN 配置之前启动pimd或守护程序,则无法正常工作。最好使用 OpenVPN 的钩子启动它们。smcroutetun0route-up

相关内容