我有一台计算机 linuxbox_1.eth0 公共 ip 89.40.xy eth1 公共 ip 85.121.ab 我有另一台 linuxbox_2. ethx 公共 ip 86.34.cd
我想要做的是将端口 8001 从 linuxbox_1 eth0 89.40.xy:8001 转发到 linuxbox_1 eth1 85.121.ab,
然后再次将端口 8001 从 linuxbox_1 eth1 85.121.ab:8001 转发到 linuxbox_2 ethx 86.34.cd:80
我使用“无所不知”的谷歌搜索答案,但这次失败了。我想使用 IPTABLES 或任何其他工具,如 rinetd。我尝试了 rinetd,但它不知何故误认为 eths,抱歉我的英语不好。10q
答案1
您所说的“rinetd 错误地使用 eths”是什么意思?启动 rinetd 时是否出现错误?它是否启动了但没有像您预期的那样监听?您在每台机器上对其进行了什么配置?(您应该将此详细信息添加到您的问题中)。
您描述的两个重定向的正确语法是:
89.40.x.y 8001 85.121.a.b 8001
85.121.a.b 8001 86.34.c.d 80
但如果 89.40.xy 和 85.121.ab 都与同一台服务器上的接口相关联,那么单行
89.40.x.y 8001 86.34.c.d 80
有用吗?
编辑:正如您所说,您希望将到 86.34.cd 的流量沿着与 85.121.ab 关联的路由传输,那么您就遇到了路由问题。您可以使用以下命令强制将特定地址的数据包路由到特定接口:
route add -host 86.34.c.d eth1
如果您运行该命令route
(不带参数),它将显示您当前的路由表,因此您可以在前后执行该命令以查看差异。route del 86.34.c.d
将删除新路由。这假设来自 eth1 的设备流量最终能够将 86.34.cd 的数据包路由到正确的位置。
要使更改永久生效(这样它在重启后仍然有效),您需要将命令添加到启动脚本中的适当位置(最佳方法取决于您运行的 Linux 版本)。不过,在确认它按预期工作之前不要这样做 - 您不想意外更改路由表,这样您就无法从当前位置访问机器,并且在重启后重新应用错误的路由。
答案2
iptables 端口转发会重写 TCP 标头,因此您的应用程序将看到来自转发链中最后一跳的数据包。因此,如果您试图破解该数据包,iptables 端口转发将无济于事。
IP 欺骗可能有帮助,但很复杂。如果您的应用程序无法直接将信息发送回原始发送者,那么它可能无法正常工作。
(我没有使用过 rinetd,所以我无法发表评论。)
答案3
可以使用 iptables 的DNAT
目标(在 nat 中PREROUTING
)来完成。但清单中的几件事是:
net.ipv4.ip_forward=1
- iptables 的
FORWARD
链也允许转发这些数据包 - 请求的源(IP)也正在被翻译(
SNAT
/MASQUERADE
),否则目的地将尝试直接回复(或者除非它被正确路由回来,就像它使用 DNATing 盒作为其网关的情况一样)。