web-dev-qa-db-ja.com

iptablesポートリダイレクトがlocalhostで機能しない

すべてのトラフィックをポート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ルールを拡張するにはどうすればよいですか?

55
Chris

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
70
Andy

パケットを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

そのカーネル設定がないと機能しません。

10
user420606

これはどう?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j REDIRECT --to-port 8080

3
Athanasios

接続が拒否されましたエラーが発生していると言いました。これは、接続しようとしているポートで待機しているローカルプロセスがないことを意味します。リスニングプロセスを確認するには、次のコマンドを使用します。

$ 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

ローカルホストから送信していることに注意してください。したがって、出力パケットをリダイレクトする必要があります。

2
Khaled