iptables 連接埠重定向在本地工作,但不能從外部工作

iptables 連接埠重定向在本地工作,但不能從外部工作

我有一台只能偵聽連接埠 23006 的伺服器。

我有 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外鏈。

此外,如果您想要重定向,建議使用mangleornat表代替。

相關內容