Iptables

確保 Swarm 中節點的 Docker 流量僅通過 VPN 連接

  • February 10, 2022

我在 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

讓我們一一了解您的要求:

  1. 分配給該節點的任何服務都專門使用 VPN 連接

您不會使用 IPtables 來執行此操作。在伺服器上執行這些命令:

ip route add default via ${LOCAL_VPN_IP} 

我認為 OpenVPN 通常使用 10.8.0.0/16,所以預設網關可能是 10.8.0.1 或類似的東西。IProute2(ip 命令)內置在核心中,就像 IPtables 一樣。

  1. 無洩漏(即 DNS 或其他流量)

您應該首先將所有流量通過 VPN 重定向到您的 OpenVPN 的伺服器配置中:

push "redirect-gateway autolocal"

這使得客戶端將所有流量都通過 VPN,甚至 DNS 等。如果 OpenVPN 伺服器出現故障,網際網路將停止在客戶端上執行。

  1. 如果 VPN 斷開連接,所有流量都會被丟棄

見步驟 2

  1. 允許服務發現和連接到 Swarm 中的其他容器

我相信 OpenVPN 預設會這樣做。我能夠從一個客戶端 ping/arp 到 OpenVPN 伺服器上的其他客戶端。您絕對應該能夠訪問其他客戶端上的服務。

我希望這能回答你的問題!

引用自:https://serverfault.com/questions/1092778