iptables 端口重定向在本地有效,但在外部无效

iptables 端口重定向在本地有效,但在外部无效

我有一台只能监听端口 23006 的服务器。我想从外部通过端口 443 访问它。

我有 systemctl 设置:

$ sudo sysctl --system
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...
kernel.pid_max = 4194304
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.route_localnet = 1

如果我运行另一个测试服务器来监听端口 443,它就可以正常工作,我可以从外部访问它。但这只是一个测试服务器,而不是我实际的服务器程序。

如果我运行socat:

sudo nohup socat TCP-LISTEN:443,pktinfo,fork TCP:127.0.0.1:23006

它可以工作,我可以从外部访问它。但我的服务器看不到客户端的实际 IP 地址。

如果我在端口 23006 上运行 curl,我的实际服务器会响应:

$ curl 127.0.0.1:23006
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.24.0</center>
</body>
</html>

如果我运行这个 iptables 命令:

sudo iptables -t nat -A OUTPUT -o lo -p tcp --dport 443 -j REDIRECT --to-port 23006

然后我也可以通过端口 443 访问我的服务器,但只能从本地访问:

$ curl 127.0.0.1:443
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.24.0</center>
</body>
</html>

问题是:我无法从外部通过端口 443 访问我的服务器。请帮忙。提前致谢。

答案1

sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 23006

答案2

如果你想重定向传入流量,用PREROUTING外链。

此外,如果您想要重定向,建议使用manglenat表。

相关内容