
我是網路新手,所以我是第一次嘗試。我建立了一個連接到 VPN 伺服器的 openvpn docker。在 docker 容器內執行wget -q -O - https://api.myip.com
可確認 docker 的網路已正確連接到 VPN 且 IP 屬於 VPN 伺服器。現在我想嘗試透過 docker 容器路由主機流量,並在主機流量使用 docker 的 VPN 連接的容器外部實現相同的結果。我不太清楚如何從 docker 主機 <-> 容器關係中做到這一點,所以我想也許我可以利用 docker 中的連接埠映射功能,並在 docker 中建立一個 Web 代理來處理任何 http/https要求。
因此,我在同一個 docker 中建立了魷魚和 openvpn 伺服器並公開了連接埠 3128(因為這是魷魚正在偵聽的連接埠)。主機上的 wget 指令變為:
wget -q -O - https://api.myip.com -e use_proxy=yes -e http_proxy=localhost:12345
但測試顯示流量沒有透過 docker 的 VPN 連線。相反,結果顯示通訊是透過主機的網際網路連線進行的。
我使用以下 Docker run 命令運行容器:
docker run --rm --cap-add NET_ADMIN --device /dev/net/tun --name vpn -it --sysctl net.ipv6.conf.all.disable_ipv6=0 -p 12345:3128 vpn-image
上面的做法有錯嗎?透過多個 docker vpn 連接路由主機流量的最佳方法是什麼?
以下資源表明這是可能的,但提供了特定於其用例的解決方案。如果有一個像 wget 或 curl 這樣的 Linux 網路工具可以幫助我調試/測試我的解決方案的進度,那就太好了。
答案1
這是一個老問題,但似乎最近至少獲得了一些流量,所以我會回答它。
根據您嘗試執行的操作,有 2 種方法可以讓您的網路通過 VPN;根據您嘗試路由的內容,有 3 種方法可以實現此目的。
代理(轉發代理)
這要求您想要使用 VPN 的主機系統或容器將其流量明確導向至 VPN 容器中執行的代理程式。您的 VPN 容器需要執行代理程式以及活動 VPN。 Pretty 有效管理雙向網路轉送。
該技術要求您公開在 VPN 容器內手動配置的容器代理伺服器的端口,然後將主機系統配置為用作localhost:port
代理。這非常複雜並且有很多選項,所以你應該專門谷歌一下。
直接網路堆疊控制(主機)
通常,VPN 容器有一個單獨的網路堆疊在單獨的命名空間中運行,但您可以告訴 docker 不要分離網路命名空間並授予其完整的網路堆疊存取權限,因為它在主機上本機運行。如果您嘗試使用容器化 VPN,就像它本地安裝在主機上一樣,那麼您應該這樣做。然而,對主機網路命名空間的控制是一個單獨的權限,而不僅僅是共享它,因此您還需要添加一些功能。 3xact 功能取決於您的 VPN 軟體,但它們通常是CAP_NET
、CAP_NET_RAW
和CAP_ADMIN
。如果您不確定並信任您的應用程序,您可以使用特權模式來授予所有功能(加上一些不必要的其他額外功能)。因此,為此,您將這兩個選項新增至執行命令:--net=host --cap=CAP_NET,CAP_NET_RAW,CAP_NET_ADMIN
。
直接網路堆疊控制(另一個容器的)
此選項與主機的直接網路堆疊控制概念相同,但允許另一個容器而不是主機使用您的 VPN,就像它在該容器內運作一樣。要使用它,您只需在非 VPN 容器的運行命令中添加一行,告訴它與您的 VPN 容器共用網路堆疊:--net=container:vpn-container-name