创建从环回到远程服务器的 NAT

创建从环回到远程服务器的 NAT

我的目标是将连接从本地主机重定向到远程服务器,并且能够动态更改远程地址,而无需更改任何客户端配置。我现在可以在外部接口上使用 nat 来执行此操作,如下所示:

LOCAL_IP=10.1.1.10
LOCAL_PORT=8888
REMOTE_IP=10.1.1.11
REMOTE_PORT=9999

iptables -t nat -A OUTPUT -p tcp -d $LOCAL_IP --dport $LOCAL_PORT -j DNAT --to-destination $REMOTE_IP:$REMOTE_PORT
iptables -t nat -A POSTROUTING -p tcp -d $REMOTE_IP --dport $REMOTE_PORT -j SNAT --to-source $LOCAL_IP

这工作正常,但仍然将客户端的配置与主机 IP 地址耦合。如果能够将 NAT 流量发送至127.0.0.1:8888、 ,那就太好了10.1.1.11:9999。这似乎应该可以使用 DNAT/SNAT|MASQUERADE 组合来实现,但我还没有想出一个有效的配置。我尝试的任何配置似乎都会默默地丢弃数据包(可能被火星规则捕获?我确实启用了 ip_forward)。

答案1

问题是 Linux 将内部的任何内容都视为127.0.0.0/8本地的,甚至会应答(尝试 ping 127.99.88.77)。

这意味着数据包最初是在数据包“离开”时在 OUTPUT 上传输的lo。当它“进来”时,它会进入 INPUT 链(我跟踪它以确保)。这就是你的情况崩溃的地方。

除了 PRE/POST 路由链之外,在 Linux 上,发往系统的数据包将仅遍历 INPUT 链。源自系统的数据包将仅遍历 OUTPUT 链。既不是源自本地系统也不是发往本地系统的数据包将仅遍历 FORWARD 链。

因此,当您希望 Linux 选择 FORWARD 链时,Linux 正在选择 INPUT 链。

我尝试了几种不同的选择,但也无法使其正常工作,但我确实知道为什么它不起作用。稍后当我有更多时间时我会尝试看看这个。


PS 起初我以为你只是遇到了路由器问题(内心深处我仍然觉得涉及路由)。将 IP 转换为lo外部127.0.0.1将导致路由冲突,从而可能默默地丢弃数据包。为了禁用此功能,您需要设置rp_filter=0。您仍然需要执行此操作才能使其正常工作,但这不是问题的根源。根本问题是,当您需要输出时,Linux 正在使用输入。

相关内容