【入門編】 TCPコネクション確立時におけるNATゲートウェイのSYNパケット処理 – クラウド&コンテナネットワーク実践ガイド

こんにちは!クラウドの世界へようこそ。SREとして日々たくさんのシステムを見守っている私ですが、インフラやネットワークの世界に足を踏み入れたばかりの頃は、見慣れない専門用語の壁に何度もぶつかりました。

「パケット?」「NAT?」「SYN?」……なんだか呪文のようですよね。でも大丈夫です!一歩ずつ、身近な例えを交えながら一緒に紐解いていきましょう。

今回は、AWSやGCPなどのパブリッククラウドで必ずお世話になる「NATゲートウェイ(NAT Gateway)」、そしてその裏側でTCPコネクションが結ばれる瞬間のドラマについて、熱く優しく解説していきます。

—

1. そもそもNATゲートウェイってどんな存在?(身近な例えで理解しよう)

プライベートサブネットという言葉を聞いたことはありますか?外の世界(インターネット)から直接お部屋の中を覗かれない、とっても安全なセキュリティの効いた空間のことです。

ここで一つ疑問が浮かびます。「外の世界と直接お話しできないお部屋から、どうやってインターネット上のウェブサイトを見たり、外部のAPIを叩いたりするんだろう?」ということ。

ここで登場するのが、NATゲートウェイです。

郵便局の本局に例えてみよう

プライベートサブネットにあるあなたのお部屋(インスタンス)を、マンションの自室だと想像してください。
セキュリティの都合上、このマンションの住民は、外の世界へ直接手紙を出しに行くことができません。

そこで、マンションの1階に「コンシェルジュ(NATゲートウェイ)」が常駐している郵便局カウンターを設置します。住民が外の世界へ手紙を出したいときは、一度コンシェルジュに手紙を預けます。
コンシェルジュは、住民から預かった手紙の差出人住所を、自分の名前(NATゲートウェイのグローバルIPアドレス)に書き換えて、外の世界へ送り出してくれるのです。

これが、NAT(Network Address Translation)の基本的な仕組みです!

—

2. インターネットの第一歩:TCP SYNパケットが飛ぶ瞬間

さて、いよいよ本題です。プライベートインスタンスから、インターネットの向こう側にあるサーバーへ「お話しましょう!」と声をかける瞬間、何が起きているのでしょうか?

通信の主役であるTCPは、いきなり本題のデータを送りません。まずは挨拶を交わすことから始めます。これを「3ウェイハンドシェイク」と呼び、その最初の一声が「SYN(シン)パケット」です。

SYNパケットがたどる運命

1. プライベートインスタンスが、「外部のサーバーと通信したい!」と SYN パケットを作ります。
2. このパケットには、自分の内線番号(プライベートIPアドレスとポート番号)が書かれています。
3. パケットは外へ向かって飛び出しますが、そのままではインターネットの荒海に出られないので、途中でNATゲートウェイに捕まります。

ここで、NATゲートウェイの頭脳がフル回転する重要な瞬間が訪れます。それが「コネクションテーブルの生成」です。

—

3. NATゲートウェイのメモ帳:コネクションテーブルの秘密

NATゲートウェイは、ただ単に宛先を書き換えて流しているわけではありません。実は、とっても優秀な記憶力の持ち主です。

外部のサーバーからお返事(SYN-ACK パケット)が返ってきたとき、「これ、一体どのマンションの誰宛ての手紙だっけ?」と迷子になってしまっては一大事ですよね。

だからこそ、NATゲートウェイは手紙を受け取った瞬間、自分の手元にある「コネクションテーブル(メモ帳)」にこんな記録を書き込みます。

| 内部の送信元(お部屋) | 外部の宛先(行き先) | 変換された外向きの姿(NATゲートウェイのIPとポート) |
| :— | :— | :— |
| 10.0.1.15:45210 | 203.0.113.50:443 | 203.0.113.100:10001 |

このように、「どのプライベートIPのどのポートから、どの外部サーバーへ向かった通信か」を、自分が外の世界で見せるための新しい番号(ポート)とセットで厳重に記録するのです。

この初期動作のおかげで、外部サーバーからの返事がNATゲートウェイに戻ってきたとき、「あ、これはさっきの10.0.1.15さん宛てだな!」とすぐに気づき、元の内線番号に戻して正しくお部屋に届けることができるというわけです。

—

4. 実務で役立つ!インフラ設定とトラブルシューティングの視点

ここからは、実際にクラウド(例えばAWSのVPC環境など)を構築・運用する現場で役立つ、少し実践的なお話をしましょう。

ネットワークの挙動を理解していると、トラブルが起きたときに「どこが詰まっているのか」をスピーディに見つけ出すことができます。

トラブルのよくある原因:ポート枯渇

NATゲートウェイは、1つのIPアドレスあたり同時に扱える通信の数(ポートの数)に物理的な限界があります。もし、プライベートインスタンスから大量の外部通信(数万〜数十万レベルの同時アクセス)を突然発生させると、NATゲートウェイのメモ帳(コネクションテーブル)がいっぱいになってしまいます。

これを「ポート枯渇(Port Exhaustion)」と呼びます。

対策例:Terraformによる複数NATゲートウェイの分散配置

AWSなどのインフラをコード(IaC)で管理する際は、単一のNATゲートウェイに負荷が集中しないよう、可用性とパフォーマンスを高めるために複数のAZ(アベイラビリティゾーン)にそれぞれNATゲートウェイを配置するのがプロの定石です。

以下は、Terraformを用いてパブリックサブネットにNATゲートウェイをスマートに配置する設定例です。

# ==========================================
# NATゲートウェイの作成例 (Terraform)
# ==========================================

# 1. Elastic IP(固定グローバルIP)をNATゲートウェイ用に確保します
resource "aws_eip" "nat_gw_eip" {
  domain = "vpc"
  
  tags = {
    Name = "production-nat-eip"
  }
}

# 2. パブリックサブネットにNATゲートウェイを配置します
resource "aws_nat_gateway" "main" {
  allocation_id = aws_eip.nat_gw_eip.id
  subnet_id     = aws_subnet.public_a.id # パブリックサブネットのIDを指定

  tags = {
    Name        = "production-nat-gateway"
    Environment = "Production"
  }

  # 依存関係を明示的に記述することで、リソース作成の順序エラーを防ぎます
  depends_on = [aws_internet_gateway.igw]
}

# 3. プライベートサブネットからの通信をNATゲートウェイに向けるルートテーブルの設定
resource "aws_route" "private_to_nat" {
  route_table_id         = aws_route_table.private.id
  destination_cidr_block = "0.0.0.0/0"
  nat_gateway_id         = aws_nat_gateway.main.id
}

このように適切なインフラ設計をしておけば、TCPのSYNパケットがどれだけ押し寄せてきても、NATゲートウェイがしっかりと交通整理を行ってくれます。

—

5. おわりに

いかがでしたでしょうか?
「TCPのSYNパケットがNATゲートウェイを通過し、コネクションテーブルに記録される」という一連の挙動は、一見すると難解な技術用語の羅列に思えますが、「郵便配達員が宛先を書き換え、専用の台帳に記録して往復の安全を守っている姿」をイメージすれば、ぐっと身近に感じられたのではないでしょうか。

インフラやネットワークのトラブルシューティングに出会ったときは、ぜひこの「パケットの旅」と「NATゲートウェイのメモ帳」を思い出してみてください。きっと原因を見つけ出す強力なヒントになるはずです。

それでは、また次回の技術解説でお会いしましょう!快適なクラウドライフを!

コメント

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