確保 Swarm 中節點的 Docker 流量僅通過 VPN 連接
我在 Docker Swarm 集群中有兩個節點。其中一個節點與介面上的 VPN 提供商有一個 OpenVPN 客戶端連接
tun0
。我的目標是,
- 分配給該節點的任何服務都專門使用 VPN 連接
- 無洩漏(即 DNS 或其他流量)
- 如果 VPN 斷開連接,所有流量都會被丟棄
- 允許服務發現和連接到 Swarm 中的其他容器
對於 DNS,我添加了一個
dns
條目,/etc/docker/daemon.json
該條目使用只能通過 VPN 訪問的 VPN 提供商的 DNS 伺服器。以下是我想出的 iptable 規則:
iptables -I DOCKER-USER 1 -o tun0 -j ACCEPT iptables -I DOCKER-USER 2 -i tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -I DOCKER-USER 3 -j DROP
生成的
DOCKER-USER
鏈如下所示:Chain DOCKER-USER (1 references) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * tun0 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- tun0 * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
nslookup
從執行和打開和關閉 VPN 連接等基本測試來看curl
,這些規則似乎有效,但我對 iptables 的經驗很少。這是這樣做的正確方法嗎?
IPtables 是線性的,它從上到下讀取規則,直到到達 ACCEPT、REJECT 或 DROP 目標,然後停止讀取規則。在您的情況下,您希望擁有
iptables -I DOCKER-USER -j DROP
鏈中的最後一條規則,否則每個數據包都將被丟棄。此外,最後不需要 RETURN 規則,因為 IPtables 一旦到達其上方的 DROP 規則,就會停止讀取規則。那些帶有 tun0 的 IPtables 規則看起來不錯,但請確保您也有這些規則:iptables -t filter -I INPUT 1 -i tun0 -j DOCKER-USER iptables -t filter -I OUTPUT 2 -o tun0 -j DOCKER-USER
為了獲得良好的實踐,請確保您接受所有環回流量,這些流量永遠不會到達網際網路,也不會離開機器:
iptables -t filter -I INPUT 3 -i tun0 -j ACCEPT
讓我們一一了解您的要求:
- 分配給該節點的任何服務都專門使用 VPN 連接
您不會使用 IPtables 來執行此操作。在伺服器上執行這些命令:
ip route add default via ${LOCAL_VPN_IP}
我認為 OpenVPN 通常使用 10.8.0.0/16,所以預設網關可能是 10.8.0.1 或類似的東西。IProute2(ip 命令)內置在核心中,就像 IPtables 一樣。
- 無洩漏(即 DNS 或其他流量)
您應該首先將所有流量通過 VPN 重定向到您的 OpenVPN 的伺服器配置中:
push "redirect-gateway autolocal"
這使得客戶端將所有流量都通過 VPN,甚至 DNS 等。如果 OpenVPN 伺服器出現故障,網際網路將停止在客戶端上執行。
- 如果 VPN 斷開連接,所有流量都會被丟棄
見步驟 2
- 允許服務發現和連接到 Swarm 中的其他容器
我相信 OpenVPN 預設會這樣做。我能夠從一個客戶端 ping/arp 到 OpenVPN 伺服器上的其他客戶端。您絕對應該能夠訪問其他客戶端上的服務。
我希望這能回答你的問題!