我们有 3 台电脑,其中两台连接到互联网(两台都有 2 个网卡)
PC1:
eth0 - 1.0.0.1 (external IP)
eth1 - 172.16.0.1 (internal IP)
PC2:
eth0 - 1.0.0.2 (external IP)
eth1 - 172.16.0.2 (internal IP)
PC3:
eth0 - 172.16.0.3 (internal IP)
现在我们要将端口 80 从 PC1 和 PC2 转发到 PC3。
但存在一个问题:iptables 端口转发从 PC1 或 PC2 运行良好,但仅限于 PC3 以 PC1 或 PC2 作为网关的情况。
IPtables 规则(针对 PC1):
iptables -t nat -A PREROUTING -p tcp -d 1.0.0.1 --dport 80 -j DNAT --to-destination 172.16.0.3:80
iptables -A FORWARD -p tcp -d 172.16.0.3 --dport 80 -j ACCEPT
所以,问题是:无论 PC3 上的网关设置如何,我们是否可以从 PC1 和 PC2 进行端口映射?
先感谢您。
答案1
您仅重写了目的地。
您需要将源地址更改为 PC1 或 PC2,这样回复数据包也可以进行 NAT。并且您需要更改目标地址,以便数据包将发往 PC3。重写源和目标称为“双 NAT”。
您需要在 PREROUTING 链中执行 DNAT,在 POSTROUTING 链中执行 SNAT。如下所示(针对 PC1):
iptables -t nat -A PREROUTING -p tcp -m tcp -d 1.0.0.1 --dport 80 -j DNAT \
--to-destination 172.16.0.3:80
iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.16.0.3 --dport 80 \
-j SNAT --to-source 172.16.0.1
答案2
赋予 PC3 另一个 IP 地址,并在 PC1 和 PC2 中使用 DNAT 规则将 PC3 的 IP 地址改为不同的 IP。
在PC3上使用“ip rule”按源IP地址进行路由,如下所示:http://lartc.org/howto/lartc.rpdb.multiple-links.html