我有一個帶有兩個 Docker 容器(具有功能)的主機NET_ADMIN
:
backend
有介面eth0
(172.16.7.3
)openvpn-server
具有介面eth0
(172.16.7.2
) 和tun0
(10.8.0.1
),運行 OpenVPN 伺服器(tun 模式)
openvpn-client
在另一台具有介面tun0
( ) 的電腦上有一個 OpenVPN 用戶端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
on時openvpn-server
,它們會通過 VPN 隧道,並且我可以看到 ICMP 封包到達openvpn-client
(使用tcpdump -i tun0 net 224.0.0.0/4
on openvpn-client
)。
另外,當我運行ping -t3 239.1.2.3
on時backend
,它們會通過該主機退出eth0
並進入openvpn-server
on 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
我以為這會設定多播路由,但實際上它什麼也沒做。我無法在 上看到傳出的 ICMPopenvpn-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