Linux3.xでTCP DNATを127.0.0.1、ポート4242から11.22.33.44、ポート5353に設定したい(現在は3.2.52ですが、必要に応じてアップグレードできます) )。
単純なDNATルールの設定が機能していないようです。telnet 127.0.0.1 4242
がTrying 127.0.0.1...
で1分間ハングし、その後タイムアウトします。カーネルが戻ってきたパケット(SYN + ACKなど)を火星人と見なしているために破棄していることが原因である可能性があります。単純な解決策が機能しない理由を説明する必要はありません。複雑な場合でも解決策が必要です(たとえば、mayルールの作成が含まれます)。
127.0.0.0/8
ネットワークの外部にある別のローカルIPアドレスから通常のDNATを設定できましたが、宛先アドレスとして127.0.0.1が必要になりました。ユーザーレベルのポート転送プロセスを設定できることはわかっていますが、iptables
を使用して設定でき、ヘルパープロセスを必要としないソリューションが必要です。
私はこれを1時間グーグルで探していました。何度も聞かれましたが、うまくいく解決策が見つかりませんでした。
また、127.0.0.1へのDNATについては多くの質問がありますが、私はそれを必要としません。反対が必要です。
発信パケットのIPアドレスを127.0.0.1から11.22.33.44に変更する必要があり、iptables -j REDIRECT
はIPアドレスを変更できないため、単一の-j REDIRECT
ルールは機能しないことに注意してください。 。
これは私にとってはうまくいき、トラフィックをlocalhost:8081
から172.17.0.1:80
にルーティングします。ここで、172.17.0.1
はdocker0
という名前のブリッジインターフェイスの背後にあるvethです。
sysctl -w net.ipv4.conf.docker0.route_localnet=1
iptables -t nat -A OUTPUT -o lo -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.1:80
iptables -t nat -A POSTROUTING -o docker0 -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE
パズルの重要な部分はMASQUERADE
ルールです。
さらなるインスピレーション:
これを機能させるには、次の3つのコマンドを実行する必要があります。
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 4242 -j DNAT --to 11.22.33.44:5353
sysctl -w net.ipv4.conf.eth0.route_localnet=1
iptables -t nat -A POSTROUTING -p tcp -s 127.0.0.1 -d 11.22.33.44 --dport 5353 -j SNAT --to $your-eth0-ip
詳細な説明は次のとおりです。
最初のコマンドは、期待どおりにDNATを実行します。ただし、このルールセットのみを使用してパケットをキャプチャしようとすると、何も得られないことがわかります。
tcpdump -i any -n port 5353
これは、パケットの一方の端が127.0.0.0/8
で、もう一方の端が外部IPアドレスである場合、Linuxカーネルがデフォルトでこの種のパケットをドロップするためです。
2番目のコマンドは、カーネルパラメータを変更して、この種のパケットを通過させます(もちろん、それに応じてeth0
を変更する必要があります)。この後、eth0でパケットをキャプチャすると、送信されたパケットが表示されますが、送信元アドレスは127.0.0.1
、宛先アドレスは11.22.33.44
です。このパケットがターゲットサーバーに到達できるかどうか(中間ルーターはこのパケットをドロップします)、このパケットを返す方法はありません。したがって、送信元アドレスをeth0に変更するには、SNAT
ルールを追加する必要があります。そして今、それは機能するはずです。
あなたが必要とするのはこのようなものですか? ローカルホストでiptablesポートリダイレクトが機能しない
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-ports 8080
エイドリアン