iptables ポート REDIRECT はローカルでは機能しますが、外部からは機能しません

iptables ポート REDIRECT はローカルでは機能しますが、外部からは機能しません

ポート 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チェーンを使用してください。

mangleさらに、リダイレクトが必要な場合は、代わりにまたはテーブルを使用することをお勧めしますnat

関連情報