我有一台只能偵聽連接埠 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
外鏈。
此外,如果您想要重定向,建議使用mangle
ornat
表代替。