web-dev-qa-db-ja.com

ローカルホストからのDNAT(127.0.0.1)

Linux3.xでTCP DNATを127.0.0.1、ポート4242から11.22.33.44、ポート5353に設定したい(現在は3.2.52ですが、必要に応じてアップグレードできます) )。

単純なDNATルールの設定が機能していないようです。telnet 127.0.0.1 4242Trying 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ルールは機能しないことに注意してください。 。

3
pts

これは私にとってはうまくいき、トラフィックをlocalhost:8081から172.17.0.1:80にルーティングします。ここで、172.17.0.1docker0という名前のブリッジインターフェイスの背後にある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ルールです。

さらなるインスピレーション:

5
pwaller

これを機能させるには、次の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ルールを追加する必要があります。そして今、それは機能するはずです。

4
stephenjy

あなたが必要とするのはこのようなものですか? ローカルホストでiptablesポートリダイレクトが機能しない

iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-ports 8080

エイドリアン

1
Adrien M.