将本地主机:端口转发到外部IP:新端口

kee*_*thi 10 networking iptables

我们有一个应用程序在我们的 linux 服务器上运行。从该应用程序中,当我们尝试访问 localhost(127.0.0.1):localport 时,它应该被转发到外部 IP。用户只会尝试访问某个端口上的本地主机,该端口将被自动转发。我阅读了 iptables nat 表,但是 PREROUTING 和 POSTROUTING 将不适用,因为我是从 localhost 本身访问 localhost 上的一个端口,而该端口根本不接触网络接口。想知道 OUTPUT 表可能有用,但是当我尝试一些组合时,它不起作用。我使用正确的东西还是根本不可能做到这一点?

有人可以指出我正确的方向吗?

kee*_*thi 17

我想自己做这个。

应该设置 2 个规则和一个标志来实现这一点。

此处使用的示例是telnet localhost XXXX,应将数据包转发到Ext.er.nal.IP:YYYY

sysctl -w net.ipv4.conf.all.route_localnet=1

不幸的是,此标志仅存在于最新的 Linux 内核中,而在旧内核中不可用(旧内核中也没有任何备用标志)。我不太确定哪个确切的内核是可用的标志。我相信它在内核版本 3.XX 上可用。

该标志用于将回送地址视为正确的源地址或目标地址。

ip sysctl 命令的来源

iptables -t nat -A OUTPUT -p tcp --dport XXXX -j DNAT --to-destination Ext.er.nal.IP:YYYY

上面的命令将改变localhost:XXXX目标IP为的数据包Ext.er.nal.IP:YYYY

iptables -t nat -A POSTROUTING -j MASQUERADE

该命令会将源 IP 更改为您机器的公共 IP。

您可以使用、和来添加适当的源和目标 IP 以及接口-s,从而使您的规则更加严格。见。-d-i-oman iptables

感谢 John WH Smith 和 Wurtel。建议非常有帮助。


wur*_*tel 7

完成此操作的最简单方法是安装netcatinetd(Debian 在 中提供openbsd-inetd)。

添加一行/etc/inetd.conf

127.0.0.1:1234 stream tcp nowait root /bin/nc nc ex.ter.nal.ip 1234
Run Code Online (Sandbox Code Playgroud)

将 替换为1234真实的端口号和ex.ter.nal.ip真实的外部 IP 地址。如果每分钟需要建立超过 128 个连接,您可能需要.1000nowait选项中附加或更大的数字;这是为了防止失控的连接不必要地加载您的系统。

我也有-q 4 -w 10一些nc对我的情况有帮助的选项,但你可能不需要它。

inetd修改inetd.conf文件后重新加载。

这样做使用ncstarted byinetd作为中继过程,效果很好。