ここで「通常」と書いているとき、私はあなたの平均的な消費者向けWLAN-NATルーターを正気な構成で、またはデフォルト設定でいくつかの単純なLinuxネットワークを考えています。いつものように、これは必要に応じて複雑または複雑にすることができます。質問は非常に基本的なので、これは、より複雑なエンタープライズレベルのNATソリューションに直接進むのではなく、私にとって最も理にかなっているようです。
あなたはすでに回答を受け入れましたが、あなたが尋ねた質問に直接答えることを試みましょう:
NATはどの接続がインバウンドで、どの接続がアウトバウンドであるかをどのように決定しますか?
決定の基礎(ルーターでの決定の場合)は、何らかの形式または形式の一連のルールです。この場合、関係する各インターフェース(つまり、内部LANインターフェースと外部WAN /アップリンクインターフェース)に対して、管理者はルールを実装します。これらのルールはかなり異なります。つまり、LANインターフェースのルールは、WANインターフェースのルールとは大きく異なります。
パケットがどこから来てどこに行くかを知ることは、ルーターが行うことの基本です。
から始めましょう
例
ウィキペディアのNATページには、この問題に関する多くのテキストがありますが、単純なケース(単純な企業LANと単一のDSLアップリンク)は、次のようになります。
- クライアントPCは、インターネットベースのサーバー(例:198.51.100.20)へのHTTP接続を開始しようとします。PC自体には、192.0.2.2のような非ルーティングアドレスがあります。安価なDSLルーターには2つのインターフェースがあり、1つは内部(192.0.2.1)と1つは外部(203.0.113.10、頻繁に変更され、DLSプロバイダーによってローカルリンクプロトコルを通じて提供される)です。そのため、PCはデフォルトゲートウェイ(192.0.2.1)を介してSYNパケットを198.51.100.20:80に送信します。
- ルーターは、NATがまったく関与していない場合と同様に、インターフェイス192.0.2.1でパケットをピックアップします。このインターフェイスでNATを実行するように構成されているため、次のことを実行します。
- これまで使用されていない新しいポート番号を作成します。例:12345。
- IPヘッダーの「送信者」アドレスを203.0.113.10に変更します。
- (PCから提供される)TCPヘッダーの元の送信者ポート番号を覚えて、4321と呼びましょう。
- 12345送信者ポート番号を含むようにTCPヘッダーを変更します。
- NAT変換テーブルにエントリ(12345; 192.0.2.2; 4321)を追加します。
- 陽気な方法でパケットを独自のアップリンク/ゲートウェイに送信します。
- 198.51.100.20は最終的にパケットを受信し、それがSYN(「新しい接続の確立」)であることを認識して、SYN-ACKメッセージを送信者に送り返します。その観点から、これは123.0のTCP宛先ポートを持つIPアドレス203.0.113.10です。
- ルータは、WANインターフェイスでこのパケットを受信します。WANインターフェースは、このようなNATされたアドレスを解決するように構成されています。次にルーター...
- ... NAT変換テーブルをチェックし、エントリを見つけます...
- ...パケットを宛先192.0.2.2に変更します...
- ... TCP宛先ポートを4321に戻します...
- ...そして(LANインターフェース上で)陽気な方法で送信します。
- PCはパケットを受信し、NAT手順について何も表示しません。パケットルックスだけ NATルータがすべてではありませんでしたかのように198.51.100.20が、それを送っていた場合などです。
「接続」のトピックはまったく表示されません。(最も単純な形式の)NATルーターは、メッセージの内容を気にする必要はありません。これは、送信者と受信者のIPアドレスとポートについてのみ考慮します。(許可:これは、セキュリティおよびパフォーマンス関連のあらゆる種類の問題をスキップしている可能性がありますが、これは、この質問で手元にあるような非常に基本的な原則に関するものです。)
では、ルーターはどのようにして知るのでしょうか?
ルーターは「接続」についてまったく知る必要がありません。実際、TCPの場合と同様の手順は、コネクションレス型UDPプロトコル(UDPホールパンチング)にも存在しますが、実際には、トランスポート層にポート番号のようなものがあるプロトコルに実装できます。
ルータがNATに関してトランスポートレベルのプロトコル(TCP、UDPなど)を知る必要があるのは、主にポート自体がIPの一部ではないためです。ポートは、(この種の)NATを簡単に可能にする「ハック」を作成するものです。
だから、あなたの質問に:
NATはどの接続がインバウンドで、どの接続がアウトバウンドであるかをどのように決定しますか?
アウトバウンド接続は、LANインターフェースに現れるSYNパケット(UDPの場合は最初のUDPパンチ)で始まる定義ごとの接続です。NATの場合、それらを「接続」と呼ぶことは少し多くなります。これらは、NAT変換テーブルの一時的なエントリ(および個々のNATルーターが採用する可能性のあるセキュリティ/パフォーマンスの追加)として単純に終了します。
これまでの回答で使用したシナリオには、インバウンド接続はありません。もちろん、これを行うNATのバリエーションがあります。たとえば、ルーターのWANインターフェース上のポートを、LANインターフェース上の特定のIP:PORTで静的に識別できるため、NATされたLAN内でサーバーを実行できます。これは、安価なコンシューマーDSL / WLANルーターでもサポートされています。また、「実際の」ルーターを使用すると、好きな形式や方法でルーターを構成できます。
以降のインバウンド/アウトバウンドIPパケットは、例で示したものと変わりません。最初のSYNハンドシェイクが完了し、ルーターの変換テーブルにエントリがあると、双方向のすべてのパケットが(例で説明したのと同じ変換で)通過します。
このように確立されたTCP接続のコンテキストで、サーバーがクライアントにデータを送信したい場合(完全に可能です-TCPは双方向です)、NATルーターに関する限り、これらは単なるIPパケットです。これらのパケットの内容については、それほど気になりません(つまり、特定のペイロードが含まれているか、TCPの「管理」パケットであるかなど)。
ルーターを置くときに、ルーターが「チューブを閉じる」ことはありません。明らかに、ルーターはいつ変換テーブルからエントリをクリアできるか(おそらく、接続を終了するFINハンドシェイクに気付いたとき、またはタイムアウトやエラー状態によって)の概念を持っていますが、最初から最後までは1つの継続的な事件。