すべてのトラフィックをポート443から内部ポート8080にリダイレクトしたいと思います。iptablesにこの構成を使用しています。
iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
--dport 443 -j REDIRECT --to-ports 8080
これはすべての外部クライアントで機能します。しかし、同じマシンからポート443にアクセスしようとすると、接続拒否エラーが発生します。
wget https://localhost
ローカルトラフィックもリダイレクトするようにiptablesルールを拡張するにはどうすればよいですか?
PREROUTINGはループバックインターフェイスでは使用されません。OUTPUTルールも追加する必要があります。
iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080
パケットをlocalhostから別のマシンにルールをリダイレクトするには:
iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT --to-destination 10.x.y.z:port
動作しますが、カーネルでこのオプションを有効にする必要もあります。
sysctl -w net.ipv4.conf.all.route_localnet=1
そのカーネル設定がないと機能しません。
これはどう?
iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080
接続が拒否されましたエラーが発生していると言いました。これは、接続しようとしているポートで待機しているローカルプロセスがないことを意味します。リスニングプロセスを確認するには、次のコマンドを使用します。
$ Sudo netstat -lnp | grep 8080
ルールを適用すると、ポート8080でリッスンするプロセスが接続されます。
代わりに次のルールが必要です:
$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
--dport 443 -j REDIRECT --to-ports 8080
ローカルホストから送信していることに注意してください。したがって、出力パケットをリダイレクトする必要があります。