Debian
iptables:容器 NAT 和外部 IP
我有一個 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/hosts
nginx 託管的所有域手動添加條目,以便它們解析為 10.0.0.1 而不是其公共 IP。我還需要哪些規則才能允許使用外部伺服器 IP 進行通信?
謝謝你。
這是髮夾路由的常見問題。正確的解決方案是使用本地地址設置本地 DNS,這樣您就不會在 NAT 上浪費路由資源,這是資源密集型的。本地 DNS 應指向本地地址,以便流量保持本地並且可以橋接而不是路由。
這是一個稱為髮夾式 NAT的常見問題。我通常更喜歡的解決方案是添加 SNAT(源地址轉換)。因此,已經同時進行 DNAT 的設備將對同一個數據包進行 SNAT。
成本是微乎其微的。而且,最重要的是,您可以讓您的 DNS 純粹、簡單、可預測。