![将本地主机:端口转发到外部IP:新端口](https://linux22.com/image/47253/%E5%B0%86%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA%EF%BC%9A%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%88%B0%E5%A4%96%E9%83%A8IP%EF%BC%9A%E6%96%B0%E7%AB%AF%E5%8F%A3.png)
我们已经在 Linux 服务器上运行了一个应用程序。从该应用程序中,当我们尝试访问 localhost(127.0.0.1):localport 时,它应该被转发到外部 IP。用户只会尝试访问某个端口上的本地主机,该端口将被自动转发。我阅读了 iptables nat 表,但如果正确的话,PREROUTING 和 POSTROUTING 将不适用,因为我从 localhost 本身访问 localhost 上的端口,而它根本不接触网络接口。想知道输出表可能有用,但当我尝试一些组合时,它不起作用。我使用的是正确的东西还是根本不可能做到这一点?
有人能指出我正确的方向吗?
答案1
我想自己做这件事。
应设置 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。
-s
您可以通过使用、-d
和来添加适当的源和目标 IP 以及接口,-i
从而使您的规则更加严格-o
。看man iptables
。
感谢约翰·WH·史密斯和沃特尔。建议非常有帮助。
答案2
完成此操作的最简单方法是安装netcat
和inetd
(Debian 在 参考资料中有此内容openbsd-inetd
)。
添加一行/etc/inetd.conf
:
127.0.0.1:1234 stream tcp nowait root /bin/nc nc ex.ter.nal.ip 1234
将 替换1234
为真实端口号和ex.ter.nal.ip
真实外部 IP 地址。如果每分钟需要建立超过 128 个连接,您可能需要.1000
在选项中附加或更大的数字;nowait
这是为了防止失控的连接不必要地加载您的系统。
我也有-q 4 -w 10
一些nc
对我的情况有帮助的选择,但你可能不需要它。
inetd
修改文件后重新加载inetd.conf
。
这样做使用nc
started byinetd
作为中继过程,效果非常好。