【入門編】 NATゲートウェイを経由するTCPセッションの最大コネクション数とSNATポート枯渇問題 – クラウドインフラと仮想化ネットワーク実践ガイド

「なぜか繋がらない?」を解決!AWS NATゲートウェイのSNATポート枯渇問題を優しく紐解く

AWSでシステムを構築していると、一度は遭遇する「謎の接続エラー」。特に、プライベートサブネットからインターネットへ通信しようとすると、突如として Connection Timed Out が頻発する現象……。

「設定は間違っていないはずなのに、なぜ?」。その犯人の多くは、NATゲートウェイの「SNATポート枯渇」という現象です。

今回は、ネットワークの専門家が、この厄介な現象を「郵便配達」に例えて、直感的に、そして深く解説します。これを読み終える頃には、あなたのシステムはもう突然の「繋がらない」に怯えることはありませんよ!

—

1. NATゲートウェイは「街の郵便局」である

まず、NATゲートウェイの役割を理解しましょう。プライベートサブネットにあるインスタンスたちは、自分専用の「外向きの住所(パブリックIPアドレス)」を持っていません。だから、外の世界(インターネット)と手紙(パケット)をやり取りするときは、必ず街の郵便局である「NATゲートウェイ」に手紙を預ける必要があります。

NATゲートウェイは、あなたの手紙を預かると、「自分自身の住所」で宛先を書き換え(これがSNAT)、外へ発送します。

ここで発生する「ポート」という名の制限

郵便局には「同時に処理できる受け付け窓口」の数に限りがあります。これが、よく耳にする「55,000ポート」という数字の正体です。

  • 送信元IPアドレス(NATゲートウェイのIP)
  • 送信元ポート(窓口番号)
  • 宛先IPアドレス
  • 宛先ポート

この4つの組み合わせで、NATゲートウェイは「どのインスタンスからの手紙か」を識別しています。宛先IPと宛先ポートが同じ場合、NATゲートウェイが使える窓口は最大55,000個しかない、というのがこの問題の核心です。

—

2. なぜ「ポート枯渇」は起きるのか?

想像してみてください。あなたの会社のインスタンスが、短時間に同じ外部APIサーバー(宛先IPが固定)に対して、何万回もリクエストを送るとしたら?

郵便局の窓口(ポート)は、一度使われると「後片付け(セッションの終了確認)」が終わるまで次の手紙に使えません。リクエストのスピードが早すぎると、窓口の整理が終わる前に「次の窓口、空いてない?」と行列ができてしまい、最後には「窓口が全部埋まってます!」と通信が拒絶されるのです。これが Connection Timed Out の正体です。

—

3. トラブルを未然に防ぐ「3つの打ち手」

では、どうすればこの行列を解消できるのでしょうか?

対策1:コネクションを「使い回す(Keep-Alive)」

一番の基本は、毎回新しい手紙を書く(新しいTCP接続を確立する)のではなく、一度繋いだ窓口を維持し続けることです。HTTPクライアントの設定で Keep-Alive を有効にしましょう。

Pythonの requests ライブラリを使うなら、Session オブジェクトを使い回すのが鉄則です。

import requests

# セッションを使い回すことで、何度も接続を確立するコストを削減する
session = requests.Session()

# このセッションを使えば、一度開いたコネクションが維持され、
# NATゲートウェイのポート消費を劇的に抑えられます
response = session.get('https://api.example.com/data')

対策2:NATゲートウェイを分散させる

「一つの郵便局が混むなら、郵便局を増やせばいいじゃない!」という考え方です。
サブネットごとにNATゲートウェイを配置することで、負荷を分散させることができます。特に高負荷なマイクロサービス環境では、この設計が非常に有効です。

対策3:AWSの最新機能「NATゲートウェイの複数IP対応」を活用する

2021年にリリースされた機能ですが、NATゲートウェイに複数のパブリックIPアドレスを割り当てることが可能になりました。

これまでは1つのIPにつき55,000ポートが上限でしたが、最大8個のIPアドレスを割り当てられるようになり、理論上は1つのNATゲートウェイで約440,000ポートまで拡張可能です。

# AWS CLIでNATゲートウェイにセカンダリIPを割り当てる例
aws ec2 associate-nat-gateway-address \
    --nat-gateway-id nat-0123456789abcdef0 \
    --allocation-ids eipalloc-0abcdef1234567890

—

4. 最後に:インフラエンジニアの心得

「ポートが枯渇しているか」を調べるには、AWS CloudWatchのメトリクスにある ErrorPortAllocation を監視するのが一番の近道です。この値が「0」以外を記録し始めたら、それはシステムからの「限界だよ!」という悲鳴です。

ネットワークのトラブルは、一見すると魔法のように不可解に見えますが、こうして「郵便配達」のように現実の仕組みに置き換えてみると、どこで渋滞が起きているかが見えてくるはずです。

皆さんのシステムが、今日もスムーズに世界と繋がりますように!また次回の深掘り記事でお会いしましょう。

コメント

タイトルとURLをコピーしました