Dev Study
AWSサービスの内部原理 コース

111. NATは少ないパブリックIPを大勢で分け合う仕組みである — IGWの1:1変換とNATゲートウェイの多:1変換

プライベートIP(10.0.x.x)はインターネットでは通用しない——では外と話すとき、誰がアドレスを書き換えているのか。境界で起きる2種類の付け替えを、上から下へ図で追っていきます。

① 前提 — プライベートIPは外の世界では通用しない

VPC内インスタンス自分のIP = 10.0.1.5
プライベートIPv4のみ
返信先が一意に決まらない
経路上のルーター世界中に 10.0.1.5 は無数にある
届けられない ✗境界での付け替えが必要になる
  • プライベートIPは「VPCとサブネットの内側で定義された私的アドレス空間」であり、グローバルに一意ではない
  • 公式: 「Your instance is only aware of the private (internal) IP address space defined within the VPC and subnet」

プライベートIPはローカルでしか一意でない。外と話すには、境界のどこかでグローバルに一意なパブリックIPへ変換する仕掛けが必要になる。これがNAT(ネットワークアドレス変換)であり、IPv4アドレス枯渇という歴史的制約への答えでもある。

② IGWの1:1変換 — パブリックIPはOSに存在しない「付け替え札」

インスタンス10.0.1.5
パブリックIPはOSの中に存在しない
送信元は 203.0.113.7 に見える
IGW(行き)10.0.1.5 → 203.0.113.7
返信先アドレスを書き換え
宛先 = 203.0.113.7 で返信が届く
インターネット
プライベートIP宛てに配達
IGW(戻り)203.0.113.7 → 10.0.1.5
宛先アドレスを書き換え
インスタンス10.0.1.5
  • 「一つのインスタンス ↔ 一つのパブリックIP」の1:1対応
  • 公式: 「the internet gateway logically provides the one-to-one NAT on behalf of your instance」

IGWの変換は1インスタンス:1パブリックIPの対称的な付け替えである。パブリックIPアドレスはインスタンスのOSには存在せず、境界での付け替え札として働く——これがこの回の最初の驚きポイント。

③ NATゲートウェイの多:1変換 — 大勢を1つのIPに束ねる二段変換

インスタンスA10.0.2.11
インスタンスB10.0.2.12
インスタンスC10.0.2.13
【二段目】パブリックNATゲートウェイの場合のみ
NAT Gateway全員 → 10.0.0.99 に束ねる
public/private 共通の変換
送信元はElastic IPに見える
IGW10.0.0.99 → EIP 198.51.100.4
インターネット
  • 戻りのトラフィックはNATゲートウェイが元の送信元IP(10.0.2.11 等)へ逆変換して届ける
  • 公式: 「map the source private IPv4 address of the instances to the private IPv4 address of the NAT gateway... the internet gateway then maps the private IPv4 address of the public NAT gateway to the Elastic IP address」

多数のプライベートIPが1つのNATゲートウェイのプライベートIPに束ねられ、パブリックNATゲートウェイではIGWがさらにElastic IPへ変換する。戻りはNATゲートウェイが元の送信元へ逆変換する。ここで当然の疑問が生まれる——1つのIPに束ねたら、戻ってきた返信を誰に渡すか区別できるのか?

④ ポートが答え — アドレスの延長として会話を捌き分ける(PAT)

インスタンスA10.0.2.11:51000
インスタンスB10.0.2.12:49500
インスタンスC10.0.2.13:52200
返信は外向きポートで内側の相手を特定
NAT変換表EIP:40001 / 40002 / 40003
どのポートが誰のどの会話かを保持=ステートフル
同時接続の上限に近づいたら
取り違えず配達 ✓1つのIPで多数の会話を捌ける
IPv4を最大8個プライマリ1 + セカンダリ7
IPを足して拡張できる
  • 使用ポート範囲は 1024–65535
  • 1つのIPv4アドレスあたり、同一宛先に最大 55,000 同時接続。同一宛先は「宛先IP + 宛先ポート + プロトコル(TCP/UDP/ICMP)」の組で識別される
  • 公式: 「Each IPv4 address can support up to 55,000 simultaneous connections to each unique destination」
  • パブリックNATゲートウェイに関連付けられるElastic IPはデフォルトで2個まで(クォータ引き上げで拡張可)

ポート番号を割り当てて変換表に記録することで、1つのIPでも多数の会話を取り違えずに捌ける。この「変換表を持つ」性質こそNATがステートフルである正体——メッセージング編で見たコネクション追跡と同じデータ構造がここにも住んでいる。上限の 55,000 は「1 IPあたり・同一宛先ごと」なので、IPを足して拡張できる(最大8個まで)。

⑤ 規模とAZ構造 — 自動スケールするが、AZに縛られる

帯域5 Gbps → 100 Gbps に自動スケール
パケット処理100万 → 1,000万 pps に自動スケール
1,000万 pps を超えた分のパケットは破棄される
公式推奨は
悪い例AZ-a の1つのNATを AZ-c からも共有
AZ-a 障害で AZ-c も外に出られなくなる ✗(巻き添え)
AZごとに1つ同一AZのNATゲートウェイを使わせる
片方のAZ障害が他方に波及しない ✓
  • 公式: 「Each NAT gateway is created in a specific Availability Zone and implemented with redundancy in that zone」
  • NATゲートウェイにセキュリティグループは付けられない(NACLは効く)
  • 接続タイプ: パブリック(デフォルト・作成時にEIP関連付け必須・パブリックサブネットに設置)/ プライベート(EIP関連付け不可・VPC間やオンプレ向け)

性能は自動スケールするが、NATゲートウェイはAZ単位の資源である。AZ障害の巻き添えを避けるため、AZごとに1つ置いて同一AZのものを使わせるのが公式推奨。なおNATゲートウェイにセキュリティグループは付けられず、制御はNACLで行う。

⑥ 締め — 「外から始められない」は変換表の副産物である

内から始まる会話インスタンスが先に送信
外から始まる会話見知らぬ外部からいきなり着信
内→外は通る / 外→内(未開始)は通らない
エントリあり10.0.2.11:xxx ↔ EIP:yyy
返信は表を引いて戻せる ✓
エントリなし戻し先のプライベートIPが不明
破棄するしかない ✗
安全の正体開始の向きを絞る非対称設計
  • 公式: 「external services can't initiate a connection with those instances」
  • 公式: 「Connections must always be initiated from within the VPC containing the NAT gateway」

「外から接続を開始できない」のはアクセス制御ルールではなく、変換表に載っていない着信は戻し先が決まらないという構造的帰結である。この非対称設計は、メッセージング編のポーリング(受け手から取りに行く)と同じ方向——「開始の向き」を絞ることで安全を作る発想だ。Lambda編で「VPC接続したLambdaが外に出るにはNATが要る」と触れたのは、まさにこの仕組みが理由である。

公式ドキュメントで詳しく ↗