转发端口并保留源IP

转发端口并保留源IP

我有一个具有静态 IP 地址的系统,其中运行着多个 LXC 容器。
我可以通过接口与容器通信,就像它是一台物理机器一样。
其中一个容器是 Postfix 服务器。我将端口 25 从主机转发到容器,但在此过程中源 IP 被接口 IP 替换,导致 Postfix 无法通过 rDNS 检查。

设置
eth0主机通过接口、IP 访问互联网。主机端的188.xxx.xxx.xxx
容器 IP 地址192.168.1.12( ) 和容器端的( )。 容器通过主机作为默认网关和 iptable 规则访问互联网。br2192.168.1.2eth0

还有其他具有类似设置的容器,容器之间不直接通信,而是通过指定端口的 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 地址。

相关内容