最も高い TCP ポート番号は 65535 です。 NAT を実行するルータが内部ネットワークのホストに代わってインターネットに接続するたびに一時ポートを使用する場合、これはルータのポートが不足している可能性があることを意味しますか?ルータにポートが足りない場合はどうなりますか?
答え1
NAT を実行するルータが内部ネットワークのホストに代わってインターネットに接続するたびに一時ポートを使用する場合、これはルータのポートが不足している可能性があることを意味しますか?
理論的にはそうではありません。
NAT は (通常) タプル {ソース IP、宛先 IP、送信元ポート、宛先ポート} マッピングで動作します。ルータの場合、IPアドレスの1つはそれ自体であり、タプルの残りの3つのコンポーネントは通常、接続ごとに異なります。 (応答ではなく)発信パケットにNATを適用するとします。送信元 IP、宛先 IP、および宛先ポートが既知で固定されます。ソースポートは異なる場合があります。これは、同じホスト上の同じサービスに対して約65,000の同時接続を提供します。通常、複数のサービスが複数のサーバーにアクセスできるため、数字が実際にすばやく合計される可能性があります。
数百の同時接続のみを処理できる接続状態テーブルのスペースが不足する可能性があります。何千もの同時接続を処理できるとしても、今考えた数よりはるかに少ないです。
スペースが不足すると、次に何が起こるかは実装によって異なります。ルーターソフトウェアは追加の接続を拒否したり、最近使用された接続を削除したりできます。それにもかかわらず、その接続試行についてエラーメッセージを返すことも、返さないこともあります。
一つあるCloudFlareに関する素晴らしい記事接続トレースの Linux 実装に関するいくつかの情報について説明します。
答え2
はい、NAT ルータにポートが不足している可能性があります。
この時点で何が起こるかは特定のNATルータの実装によって決まりますが、一般的に私は次の一般的な戦略を期待しています。最近使用されたアクティブな接続(つまり、最も長い間トラフィックなしでアイドル状態であった接続)とそのポートを再利用します。
ただし、関連するRFCによると、TCP接続は4つの識別子の組み合わせで識別されます。
- 送信元IPアドレス
- 宛先IPアドレス
- ソースポート
- 宛先ポート
それらのうちの1つだけの違いは(そして〜しなければならないbe) 2つの接続を区別するのに十分です。
ホストは通常、発信接続ごとに1つのポートを送信元ポートとして使用しますが、NATルータは他の3つの識別子がすべて同じでない限りポート番号を再利用できます。
したがって、外部IPアドレスNNNNを使用するNATルータは、1つの発信接続をNNNN:60000 - > 1.2.3.4:80にマッピングし、別の同時接続をNNNN:60000 - > 4.5.6.7:80にマッピングできます。なぜなら、宛先が異なるIPアドレスであれば十分です。パケットを 2 つの別々の接続に属するものとして識別します。
したがって、NAT 実装が多数の接続を処理するように適切に設計されている場合、実際にポート番号の枯渇が発生する可能性はありません。
答え3
はい、コンピュータがネットワーク接続を開けすぎているかのようにポートが不足している可能性があります。
違いは、NATルーターにはエラーを報告する良い方法がないため、新しい接続のパケットを自動的に破棄できることです。
答え4
はい、理論的には、ルータにポートが不足している可能性があります。
標準がこの状況でルーターが実行する必要がある操作を指定しているかどうかわかりません。しかし、ほとんどの(TCP)接続は比較的短い寿命であるため、合理的な最初のステップはパケットを維持し(非常に)短時間で再試行することです。ポートが利用できない場合は、次の2つのオプションが表示されます。
- 自動的にパケットを破棄 - 結果として接続を確立できませんが、クライアントは何が間違っているのか、どこで問題が発生したのかを知らずにパケットを処理する必要があります。
- エラーパケットを返す - 同じ結果ですが、少なくともクライアントは問題が発生した場所を知っています。
「理論的に」と言ったのは、実際のNATは通常(IP +)ポートが十分な場合にのみ使用されるためです。