NATがコンピュータのTCPおよびUDPポートプールでポートを予約しないのはなぜですか?

NATがコンピュータのTCPおよびUDPポートプールでポートを予約しないのはなぜですか?

私は2つの実験をしました。 2つのネットワークは次のとおりです。

        [private network]     [public network]
    A -------------------- R ----------------- B
192.168.0.5     192.168.0.1|192.0.2.1       192.0.2.8

デフォルトゲートウェイはIPv4 転送が有効になっており、次の iptables ルールがあります。

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 50000

目的はTCPからの着信トラフィックですマスキングに192.0.2.1を使用します。ポート50000

ポート60000にTCPサービスを公開しました。第二使用nc -4l 192.0.2.8 60000

その後、接続を開きました。:nc -4 192.0.2.8 60000

次のようにパケット転送を開始します。

192.168.0.5:53269 -> 192.0.2.8:60000

それを翻訳する

192.0.2.1:50000 -> 192.0.2.8:60000

今まではそんなに良くなった。

その後、次のクライアントを開こうとします。nc -4 192.0.2.8 60000 -p 50000。メッセージを送りましたが、何も起こりませんでした。パケットを見ることができませんtcpdump.tcpdump.

変装ルールが存在するため、または少なくともアクティブになっているので、期待していたでしょう。2つのncを同じポートにバインドすると、発生した「nc:アドレスはすでに使用中です」というエラーメッセージが表示され、ncは失敗します。

次に、conntrack マッピングが消えるまでしばらく待ちます。

2番目の実験は私が開こうとしたものです。顧客が最初です。次に始める第二まさに。その後、接続を開くと、対応するパケットは無視されます。SYN到着、しかし応答を受け取らない。 ICMPエラーにも応答しません。原因かどうかはわかりませんが仮面舞踏会ポートが不足しているか、Linuxが完全に混乱しているためです(技術的にはポートをブロックしていますが、すでに確立されている接続が何らかの方法で妨げられています)。

NATの動作が間違っているようです。誤って masquerading (特に iptables ルール中に指定されていない) および services 用のポートを設定でき、--to-portsカーネルは自動的に切断されました。私もそのような記録はどこにもありません。

たとえば、

  • 通常のリクエストをしてみてください第二50kのポートマスクを使用してください。
  • DNSクエリの作成。それだけです。時間再帰的であり、(偶然一時ポート50kを使用)特権ネームサーバークエリポート53から。

ちょうど衝突が起こった。次に、2 つの個別 TCP 接続にポート 50k を使用します。

私はこれが通常ルータにサービスを公開しないからだと思います。もしそうなら、TCPポートプールからポートを「借りる」ことは、カーネルが積極的に偽装しているときにカーネルに害を及ぼしますか?

私の一時ポートを私のポートと組み合わせることができることを知っています--to-ports。しかし、これがデフォルトの動作ではないようです。 NATと一時ポートの両方がデフォルトで32768-61000に設定されています。これは不気味です。

(/proc/sys/net/ipv4/ip_local_port_range を照会して一時的な範囲を見つけ、別の実験で単に多数のUDP要求をNATし、サーバー側でソースポートを印刷してNAT範囲を見つけました.範囲を印刷する方法が見つかりません。

答え1

TCPポートプールからポートを「借りる」ことは、カーネルが活発に偽装されているときにカーネルに害を及ぼしますか?

私は答えが「いいえ、でも構いません」と思います。

私は間違って推測しました。応答パケットの宛先送信アドレスのみを使用して、パケットが次の方向にあることを確認します。またはそれ自体。実際、接続を識別するために、送信元宛先転送アドレスタプル全体を使用しているようです。したがって、NATが同じ接続を使用して複数の接続を作成するのは実際には正常です(has) ポートが存在すると混乱は発生しません。したがって、TCP / UDPポートプールは重要ではありません。

今考えてみると、これはあまりにも当然のことだ。

その後、次のクライアントを開こうとします。nc -4 192.0.2.8 60000 -p 50000。メッセージを送りましたが、何も起こりませんでした。パケットを見ることができませんtcpdump.tcpdump.

これは私が台無しにした実験の一部です。

ソースが原因で障害が発生します。そして送信元アドレスが同じであるためではなく、宛先転送アドレスも同じです。

これはnc -4 192.0.2.8 60001 -p 50000実際に機能します。 NATマスクと同じポートを使用しても同様です。

NATの動作が間違っているようです。誤って masquerading (特に iptables ルール中に指定されていない) および services 用のポートを設定でき、--to-portsカーネルは自動的に切断されました。

シールド接続のせいではありません。- 開始された接続の宛先が異なる可能性が高い。

変装ルールが存在するため、または少なくともアクティブになっているので、期待していたでしょう。2つのncを同じポートにバインドすると、発生した「nc:アドレスはすでに使用中です」というエラーメッセージが表示され、ncは失敗します。

私はまだこの質問に対する明確な答えを探していますが、すべてが「これは実装方法による否定的な結果であり、私たちが喜んで取るのに十分小さい」と指摘しているようです。

関連情報