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


54

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


このトピックでは、より一般的な回答を提供します
。serverfault.com

1
担当者が改行の前にコマンドにバックスラッシュを追加できますか?
Ciro Santilli新疆改造中心法轮功六四事件14

回答:


68

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

3
最初のルールは必要ありません。ローカルで生成されたパケットは、PREROUTINGチェーンを経由しません。
ハレド

9
彼は外部のトラフィックもリダイレクトしたいので、競争のために最初のルールを追加しました。彼らは唯一のすべてのIPを受け入れることを言っている場合、ルールは、送信元/送信先を必要としない
アンディ・

おappび申し上げましたが、私はあなたの答えを見ませんでした。
アンディ

こんにちはAndy、まだserver.com | <ip> |:443に接続しています...失敗しました:接続が拒否されました。
クリス

こんにちはクリス、それはlocalhost | 127.0.0.1 | 443への接続ですか、それともドメインですか?後者でサーバーから実行している場合は、内部ルーティングの問題がある可能性があります。wget server.com:8080を試すことで再確認できます(ただし、ポートフォワーディングをしている理由は、外部でブロックされているためだと思いますが)。私自身のVPCにはこの問題がありますが、/ etc / hostsファイルでドメインを127.0.0.1として定義することで回避策を講じることができます。
アンディ

10

パケットを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ですべてを実行するほうがきれいだと思います。
quadruplebucky

実際には、宛先が別のマシン上にある場合、VMまたはリモートマシンに接続している場合、カーネル設定は制限されます。

上記のAndyが提案した2つのルールがある場合はそうではありません
quadruplebucky

申し訳ありませんが、DNATが機能しない別のマシンに転送する場合について話していました。localhostに接続していると思われるものを同じマシンのコンテイナーに転送しようとしたときに、問題の解決策についてこの回答を探していました。たとえば、ローカルクエリ用のコンテナでネームサーバーを実行します。

実際、明らかに3.6以上のカーネルバージョンに依存しています。
quadruplebucky


2

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

$ 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

localhostから送信していることに注意してください。そのため、出力パケットをリダイレクトする必要があります。


1
答えてくれてありがとう。プロセスはポート8080でリッスンしています。したがって、すべてのトラフィックをそのポートにリダイレクトします。
クリス

プロセスがループインターフェイスでもリッスンしていることを確認しますか?物理インターフェイスでのみリッスンしている場合があります。一般的に、あなたのウェブサーバは0.0.0.0に耳を傾けるのではなく、言う、192.168.10.0する必要があります
MrMajestyk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.