Debian

iptables:容器 NAT 和外部 IP

  • November 8, 2020

我有一個 Debian 10 伺服器(公共 IP 85.xxx.xxx.xxx 在)在網橋enp6s0上執行一堆LXC 容器。我制定了以下 iptables 規則,以便容器可以與外界通信:cbr0

iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i cbr0 -j ACCEPT
iptables -A FORWARD -i cbr0 -o enp6s0 -j ACCEPT
iptables -A FORWARD -i enp6s0 -o cbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE

我創建了一個包含**nginx 的容器(10.0.0.1),**並將傳入的 http 流量重定向到該容器:

iptables -t nat -A PREROUTING -i enp6s0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80
iptables -A FORWARD -i enp6s0 -o cbr0 -p tcp --dport 80 -j ACCEPT

一切都按預期工作,我可以瀏覽容器等上的網站

現在我創建了第二個容器(10.0.0.2),它需要從 nginx 容器中獲取一些數據。如果我使用內部 10.0.0.1 IP 進行通信,我的第二個容器能夠獲取頁面。但是,如果我嘗試使用伺服器的外部 IP

root@second-container:~# nc example.com 80
example.com [85.xxx.xxx.xxx] 80 (http) : Connection refused

我目前的解決方法是為/etc/hostsnginx 託管的所有域手動添加條目,以便它們解析為 10.0.0.1 而不是其公共 IP。

我還需要哪些規則才能允許使用外部伺服器 IP 進行通信?

謝謝你。


這是該問題的附加圖表: 在此處輸入圖像描述

這是髮夾路由的常見問題。正確的解決方案是使用本地地址設置本地 DNS,這樣您就不會在 NAT 上浪費路由資源,這是資源密集型的。本地 DNS 應指向本地地址,以便流量保持本地並且可以橋接而不是路由。

這是一個稱為髮夾式 NAT的常見問題。我通常更喜歡的解決方案是添加 SNAT(源地址轉換)。因此,已經同時進行 DNAT 的設備將對同一個數據包進行 SNAT。

成本是微乎其微的。而且,最重要的是,您可以讓您的 DNS 純粹、簡單、可預測。

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