我正在寻找一种方法,如何将 2 个或更多内部 IP(在我的情况下是 xen 域)nat 到一个外部 IP。
我尝试使用
iptables -t nat -A PREROUTING -d 123.123.123.123 -j DNAT --至 1.2.3.4 --至 1.2.3.7
iptables -t nat -A POSTROUTING -s 1.2.3.4 -j SNAT --至 123.123.123.123
iptables -t nat -A POSTROUTING -s 1.2.3.7 -j SNAT --至 123.123.123.123
出现错误:
iptables v1.4.14:DNAT:不支持多个 --to-destination
尝试“iptables -h”或“iptables --help”获取更多信息。
我在手册页中找到了这一点:
更高版本的内核(>= 2.6.11-rc1)不再具有 NAT 到多个范围的能力。
所以我的问题是:为什么现在不再可能了?有解决方法吗?也许我应该使用我还不知道的其他方法?
编辑:
这个想法是将系统用作路由器,因此我有一个地址,但后面有多个用户。问题是我不知道哪个连接指的是用户(例如1.2.3.4
)。但我知道,它们都为传入流量打开了不同的端口。
所以我的解决方案(对于 DNAT)是将所有传入连接都 NAT 到所有用户并过滤所有未使用的端口,这样连接就会转到一个用户。对于传出流量,我会使用
iptables -A FORWARD -i eth0 -d 1.2.3.4 -m state --state ESTABLISHED,RELATED -j ACCEPT
答案1
当您使用 2 个内部主机时,您无法仅使用 1 个外部 IP 地址进行 1 对 1 NAT。原因是防火墙永远不会有外部源连接的真正目的地,除非其中一个内部主机发生故障。在这种情况下,您需要 2 个 iptables 规则来提供循环功能:
$ipt -t nat -A PREROUTING -s $srcip -d $wanip -j DNAT --to 192.168.1.2
$ipt -t nat -A PREROUTING -s $srcip -d $wanip -j DNAT --to 192.168.1.3
此外,您之所以出现“DNAT:不支持多个 --to-destination”错误,是因为您运行的版本 (v1.4.14) 中已删除指定多个 DNAT 目标的功能。此功能已被删除,以支持循环功能。
如果您想允许多个主机连接到互联网,您必须使用 NAT 表的 POSTROUTING 链,如下所示:
$ipt -t nat -A POSTROUTING -o $wanif -s $lan_network -j MASQUERADE
MASQUERADE 与动态 IP 配置一起使用。对于静态 IP,请使用 SNAT 代替 MASQUERADE:
$ipt -t nat -A POSTROUTING -o $wanif -s $lan_network -j SNAT --to $wanip
但是,这不会使内部主机上的开放端口可供外界使用。对于像您这样的基本场景,DNAT 用于外部->内部,SNAT 用于内部->外部。
答案2
您可以尝试使用 TEE 目标,可通过 xtables-addons 获取 -http://xtables-addons.sourceforge.net/modules.php
将本地 ECHO 服务器的所有流量复制(重复)到第二个盒子(非最终目标)
# iptables -A PREROUTING -t mangle -p tcp --dport 7 -j TEE --gateway 1.2.3.4 --tee
# iptables -A POSTROUTING -t mangle -p tcp --sport 7 -j TEE --gateway 1.2.3.4 --tee