我有一个带有两个 Docker 容器(具有以下功能)的主机NET_ADMIN
:
backend
带有接口eth0
(172.16.7.3
)openvpn-server
使用接口eth0
(172.16.7.2
)和tun0
(10.8.0.1
),运行 OpenVPN 服务器(tun 模式)
另一台机器上有一个 OpenVPN 客户端openvpn-client
,接口为tun0
( 10.8.0.2
)。VPN 正在运行。
附加路线设置:
backend
有路线10.8.0.0/24 via 172.16.7.2
和224.0.0.0/4 via eth0
。openvpn-server
有路线10.8.0.0/24 dev tun0
和224.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/4
上openvpn-client
)。
此外,当我ping -t3 239.1.2.3
在 上运行 时,它们会backend
通过该主机退出eth0
并进入。我可以使用看到它们。openvpn-server
eth0
openvpn-server
tcpdump -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
基准测试(如建议的那样这里) 和 之间backend
,openvpn-server
以及 和 之间openvpn-server
,openvpn-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 守护进程,例如。这只需两个步骤:smcroute -d
-- 启动守护进程smcroute -j tun0 239.1.2.3
-- 加入群组
请注意,无法在一个命令中运行两者(
smcroute -d -j tun0 ...
)。
这样,一切都按预期进行。
笔记:如果在 OpenVPN 配置之前启动pimd
或守护程序,则无法正常工作。最好使用 OpenVPN 的钩子启动它们。smcroute
tun0
route-up