我有一个具有静态 IP 地址的系统,其中运行着多个 LXC 容器。
我可以通过接口与容器通信,就像它是一台物理机器一样。
其中一个容器是 Postfix 服务器。我将端口 25 从主机转发到容器,但在此过程中源 IP 被接口 IP 替换,导致 Postfix 无法通过 rDNS 检查。
设置eth0
主机通过接口、IP 访问互联网。主机端的188.xxx.xxx.xxx
容器 IP 地址192.168.1.12
( ) 和容器端的( )。 容器通过主机作为默认网关和 iptable 规则访问互联网。br2
192.168.1.2
eth0
还有其他具有类似设置的容器,容器之间不直接通信,而是通过指定端口的 iptable 规则进行通信。
我发布所有 iptable 规则,以防它们互相干扰
# Generated by iptables-save v1.4.21
*nat
:PREROUTING ACCEPT [760:48985]
:INPUT ACCEPT [707:45761]
:OUTPUT ACCEPT [114:7445]
:POSTROUTING ACCEPT [50:2740]
# Route HTTP & HTTPS to web container
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.1.1:443
# Route internal mysql request to mysql container
-A PREROUTING -i br1 -p tcp -m tcp --dport 3306 -j DNAT --to-destination 192.168.1.3:3306
-A PREROUTING -i br2 -p tcp -m tcp --dport 3306 -j DNAT --to-destination 192.168.1.3:3306
# Route mail from outside to mail container
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.2:25
-A PREROUTING -i eth0 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.2:143
-A PREROUTING -i eth0 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.1.2:587
-A PREROUTING -i eth0 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.1.2:993
-A PREROUTING -i eth0 -p tcp -m tcp --dport 4190 -j DNAT --to-destination 192.168.1.2:4190
# Route mail from web container to mail container
-A PREROUTING -i br1 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.2:25
-A PREROUTING -i br1 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.2:143
-A PREROUTING -i br1 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.1.2:587
-A PREROUTING -i br1 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.1.2:993
-A PREROUTING -i br1 -p tcp -m tcp --dport 4190 -j DNAT --to-destination 192.168.1.2:4190
# Mark packages
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o br1 -j MASQUERADE
-A POSTROUTING -o br2 -j MASQUERADE
-A POSTROUTING -o br3 -j MASQUERADE
COMMIT
# Completed
# Generated by iptables-save v1.4.21
*filter
:INPUT ACCEPT [35371:3912708]
:FORWARD ACCEPT [48:2620]
:OUTPUT ACCEPT [29159:6870938]
# All containers are allowed to place calls from inside to outside
-A FORWARD -i eth0 -o br1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o br2 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o br3 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed
必要时可使用 IP 路由
192.168.1.1 * 255.255.255.255 UH 0 0 0 br1
192.168.1.2 * 255.255.255.255 UH 0 0 0 br2
192.168.1.3 * 255.255.255.255 UH 0 0 0 br3
我应该如何修改此规则以保留源 IP 或者我应该采用不同的方法来解决这个问题?
答案1
删除这些规则:
-A POSTROUTING -o br1 -j MASQUERADE
-A POSTROUTING -o br2 -j MASQUERADE
它们对所有去往br1
和 的流量执行 SNAT br2
。通常,您只希望在连接到 Internet 的接口上设置一条 MASQUERADE 规则。
如果每个容器都在单独的网桥上,我会将容器放在不同的子网中。它们不需要完整的 /24。/30 足以路由一个 IP 地址。