設定跨中間跳的組播路由

設定跨中間跳的組播路由

我有一個帶有兩個 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.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.3on時openvpn-server,它們會通過 VPN 隧道,並且我可以看到 ICMP 封包到達openvpn-client(使用tcpdump -i tun0 net 224.0.0.0/4on openvpn-client)。

另外,當我運行ping -t3 239.1.2.3on時backend,它們會通過該主機退出eth0並進入openvpn-serveron eth0。我可以看到他們openvpn-server使用tcpdump -i eth0 net 224.0.0.0/4.

問題:

我希望能夠繼續運行ping -t3 239.1.2.3並將backendping 轉發到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 守護程式。這只需兩步驟即可完成:

    1. smcroute -d-- 啟動守護程式
    2. smcroute -j tun0 239.1.2.3-- 加入群組

    請注意,不可能在一個命令中同時執行這兩個命令 ( smcroute -d -j tun0 ...)。

這樣,一切都會如預期進行。

筆記:如果您在設定 OpenVPN 之前啟動pimd或守護進程,則事情將無法正常運作。最好使用 OpenVPN 的鉤子來啟動它們。smcroutetun0route-up

相關內容