
プライベート/パブリック IP、ポート転送、NAT について学習していますが、まだ簡単な質問の答えがわかりません。
同じネットワーク上の 2 人のユーザーが、ネットワーク外の 1 つのサーバーと通信しているとします (たとえば、私と妻が yahoo.com に http リクエストを送信する)。サーバーは両方のユーザーを 1 つのパブリック IP として認識し、この場合のように、同じポートで通信することがよくあります。ルーターは 2 つの異なる接続に応じてパケットをどのようにルーティングするのでしょうか。パケット内に IP/ポート以外のルーティング情報はありますか。どこかに「セッション テーブル」が維持されていますか。誰が管理し、具体的に何が含まれていますか。
答え1
コンピュータ内のプロセス間
まず、シングルコンピュータは同時接続を区別します。
TCP、UDP、SCTPなどのほとんどのトランスポートプロトコル使用二ポート、送信元、宛先– つまり、接続の両端に1つずつです。つまり、パケットしないでください港を「通り抜ける」のではなく、からポートXにポートY。
の行き先ポートは通常はよく知られています(HTTPの場合は80、DNSの場合は53など)が、ソースポートは通常、OS 自体によってランダムに選択され、これにより src/dst の組み合わせが一意になることも保証されます。
そのため、ブラウザが「Yahooのポート80」に複数の接続を行う場合、実際にはそれらはすべて異なる送信元ポートOS は次のようなソケット テーブルを保持します。
PROCESS PROTO LOCAL REMOTE STATE
9894/firefox tcp 192.168.6.175:39163 google.server:80 established
9894/firefox tcp 192.168.6.175:52909 yahoo.server:80 established
17463/chrome tcp 192.168.6.175:64981 yahoo.server:80 established
9894/firefox udp 192.168.6.175:4984 8.8.8.8:53 --
したがって、OS はyahoo.server:80
ローカル ポート 52909 から TCP パケットを受信すると、それを Firefox によって確立された特定の接続にマップできます。
これはNATとは何の関係もないことに留意することが重要ですまだ直接接続している場合も同様に発生します。(ただし、NAT はこれを利用します。)
(この表は、 または Windows のさまざまなグラフィカル ツールを使用して表示できますnetstat -n
。多くの場合、「ローカル/リモート」は「ソース/宛先」とラベル付けされますが、これは完全に正確ではありません。)
NATネットワーク内のコンピュータ間
NAT に関する質問への答えは非常に似ていますが、すべてがより大規模に実行されるだけです。
NAT を実行するルータは、内部および外部のアドレスとポートの両方を含む「状態」テーブルを保持します。たとえば、2 つの HTTP 要求が別々の TCP 接続を使用した場合、次のように追跡される可能性があります。
PROTO ORIG-SRC ORIG-DST REPLY-SRC REPLY-DST
6/tcp 192.168.6.42:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:52909
6/tcp 192.168.6.175:39163 yahoo.server:80 yahoo.server:80 your.public.ip.addr:39163
6/tcp 192.168.6.175:52909 yahoo.server:80 yahoo.server:80 your.public.ip.addr:28330
17/udp 192.168.6.175:4984 8.8.8.8:53 8.8.8.8:53 your.public.ip.addr:4984
ルータがREPLY-SRC(Yahoo)からREPLY-DST(パブリックIPアドレス)宛のパケットを受信すると、本物NAT を元に戻すには、ORIG-SRC 列から宛先を取得する必要があります。
(一致する状態がない場合、手動で設定されたポート転送ルールが処理されます。それでも一致するものがない場合、パケットは実際にはルーター自体を対象としていました。)
状態テーブルの内容に注目してください住所そしてポート同じサーバーへの複数の接続をポートの組み合わせで区別できるようになります。私の例では、2 台のコンピューターが誤って同じポートの組み合わせを使用したため、2 番目の接続のポートも変換されました。
(実際、NATの中にはのみポートで送信元アドレスを完全に無視します。これにより、可能な接続数は減りますが、ピアツーピア プログラムが「NAT ホールパンチング」を実行するのがはるかに簡単になります。
このような状態は、UDP や ICMP などのコネクションレス プロトコルでも保持されるため、明示的な「接続終了」パケットがない場合でも、一定期間の非アクティブ状態が続くとエントリは期限切れになります。(状態テーブルは実際にはファイアウォールの一部であるため、NAT が実行されない場合でも、ルータは「アクティブ」な接続と不要なパケットを区別するために状態テーブルを使用する場合があります。)
(ルーターが Linux ベースの場合、conntrack -L
または ではcat /proc/net/nf_conntrack
この表が表示されます。OpenBSD または pfSense の場合は を試してくださいpfctl -s state
。)