【入門編】 IGWおよびNATゲートウェイにおけるパスMTUディスカバリー(PMTUD)とICMPメッセージの転送制御 – クラウド&コンテナネットワーク実践ガイド

はい、承知いたしました。メガクラウドとKubernetesネットワークのエキスパートとして、インフラやネットワークに初めて触れるエンジニアや初学者の方々にも、パケットがネットワークを駆け巡るリアルな挙動や、現場での知見に基づいた深い理解を、親しみやすく丁寧な解説で提供するブログ記事を執筆します。郵便配達の例えなどを活用し、難しい概念を分かりやすく紐解いていきましょう。

—

🚀 パケットの「サイズオーバー!」を賢く伝える!IGWとNATゲートウェイでのPMTUDとICMPメッセージの旅

皆さん、こんにちは!クラウド&コンテナネットワークの深淵へようこそ。今回は、普段何気なく使っているインターネット接続の裏側で、実はとっても重要な役割を果たしている「パスMTUディスカバリー(PMTUD)」と「ICMPメッセージ」のお話です。特に、AWSなどのパブリッククラウドでよく使われる「パブリックサブネット」と「プライベートサブネット」、そしてそれらを繋ぐ「NATゲートウェイ」の組み合わせにおいて、このPMTUDとICMPメッセージがどう連携して、スムーズな通信を実現しているのかを、郵便配達の例え話を交えながら、じっくり紐解いていきましょう。

「MTU?ICMP?なんだか難しそう…」と思った方も大丈夫!この記事を読み終わる頃には、「なるほど、こういう仕組みでパケットが旅をしているのか!」と、ネットワークの奥深さにワクワクしているはずです。一緒に一歩ずつ理解を深めていきましょう!

📦 郵便配達に例える、ネットワーク通信の基本

まずは、ネットワーク通信の基本を、身近な「郵便配達」に例えてみましょう。

  • あなたのPC(またはサーバー): これは「差出人」ですね。
  • 宛先のサーバー: これは「受取人」です。
  • データ(パケット): これは「手紙」や「小包」です。
  • ネットワーク(インターネット): これは「郵便局」や「配達ルート」です。
  • ルーター(ネットワーク機器): これは「郵便局の仕分け係」や「配達員」です。

さて、あなたが友達に手紙(データ)を送るとします。手紙は封筒に入れられ、宛名と差出人の住所が書かれます。この封筒が「パケット」です。パケットの中には、送りたいデータだけでなく、どこから来てどこへ行くのか、といった情報(IPアドレスなど)が詰まっています。

🚧 パケットの「箱のサイズ」問題:MTUとは?

ここで、ちょっとした問題が発生します。郵便局には、一度に運べる「箱の最大サイズ」が決まっていることがあります。これはネットワークの世界では「MTU (Maximum Transmission Unit)」と呼ばれます。つまり、パケットがネットワーク上を旅する際に、一度に送れる最大データ量のことなんですね。

もし、あなたが送りたい手紙(データ)が、その「箱の最大サイズ」を超えてしまったらどうなるでしょうか? 郵便局の仕分け係は、そのままでは運べませんよね。

💡 「Fragmentation Needed」の叫び:ICMPメッセージの役割

ここで登場するのが、今回のお話の主役の一つ、「ICMP (Internet Control Message Protocol)」という通信ルールです。ICMPは、ネットワークの調子を調べたり、エラーを通知したりするための、いわば「ネットワークのお医者さん」や「郵便局からの連絡係」のような存在です。

もし、パケットがMTUを超えてしまった場合、そのパケットを途中で受け取ったルーター(仕分け係)は、こう叫びます。

「おい、その小包、箱が大きすぎるぞ!このルートじゃ運べない!」

この「箱が大きすぎるぞ!」というメッセージが、ICMPメッセージとして送信されるんです。具体的には、「Type 3 (Destination Unreachable)」というエラーコードの中に、「Code 4 (Fragmentation Needed and DF set)」というメッセージが含まれています。

このメッセージを受け取った差出人(あなたのPCやサーバー)は、「あ、パケットが大きすぎたんだな。よし、もっと小さい箱(パケット)に分けて送ろう!」とか、「このルートじゃ無理だから、別のルートを探そう!」と判断します。これが「パスMTUディスカバリー (PMTUD)」の基本的な考え方です。PMTUDは、通信相手と、その間のネットワーク全体で、最も小さいMTUに合わせてパケットサイズを自動的に調整してくれる賢い仕組みなんです。

🏢 クラウドのネットワーク:パブリックサブネット、プライベートサブネット、そしてNATゲートウェイ

さて、ここからがクラウドならではのお話です。AWSなどのクラウド環境では、ネットワークを「サブネット」という区画に分けて管理するのが一般的です。

  • パブリックサブネット: インターネットと直接通信できる、いわば「表通り」に面した場所です。ここに置かれることが多いのが「インターネットゲートウェイ (IGW)」です。IGWは、クラウド VPC (Virtual Private Cloud) とインターネットを繋ぐ、玄関のような役割をします。
  • プライベートサブネット: インターネットからは直接アクセスできない、いわば「裏通り」にある、安全な場所です。ここに、データベースサーバーやWebサーバーのバックエンドなどが置かれます。

ここで問題です。プライベートサブネットにあるサーバー(例えば、データベースサーバー)が、インターネット上のサービス(例えば、OSのアップデートサーバー)にアクセスしたい場合はどうすれば良いでしょうか?直接はインターネットに出られないので、困ってしまいますよね。

そこで活躍するのが「NATゲートウェイ (Network Address Translation Gateway)」です!

NATゲートウェイは、プライベートサブネットにあるサーバーがインターネットへ通信する際に、そのサーバーのプライベートIPアドレスを、NATゲートウェイ自身のパブリックIPアドレスに「翻訳」してくれる装置です。これにより、プライベートな空間にいながら、あたかもパブリックIPアドレスを持っているかのようにインターネットと通信できるようになるんです。

🚦 PMTUDとICMPメッセージの「転送制御」:プライベートインスタンスへ正しく届けるには?

ここまでの話を踏まえて、いよいよ本題です。プライベートサブネットにあるインスタンス(サーバー)が、インターネット上のサービスにアクセスしようとしたとしましょう。その際、パケットがMTUを超えてしまった場合、「Fragmentation Needed」を含むICMPメッセージを、プライベートインスタンスに正しく折り返すためのネットワーク設計が重要になります。

通常、パブリックサブネットに置かれたインスタンスであれば、IGWがICMPメッセージを受け取り、そのままインターネットへ返してくれます。しかし、プライベートサブネットのインスタンスは、直接インターネットにアクセスできないため、そのままではICMPメッセージを受け取れません。

ここで、NATゲートウェイの出番です!

1. プライベートインスタンスが、MTUを超える大きなパケットを送信します。
2. パケットは、NATゲートウェイを経由してインターネットへ向かいます。
3. 途中のルーターが、パケットがMTUを超えていることを検知し、「Fragmentation Needed」を含むICMPメッセージを返します。
4. このICMPメッセージは、NATゲートウェイに届きます。
5. NATゲートウェイは、このICMPメッセージを、元のプライベートインスタンスのIPアドレス宛に「翻訳」し、プライベートサブネットへ転送します。
6. プライベートインスタンスは、このICMPメッセージを受け取り、「パケットが大きすぎた!」と認識し、パケットサイズを小さくして再送信します。

この一連の流れが、プライベートサブネットのインスタンスでもPMTUDが正しく機能するために不可欠なんです。

🛡️ セキュリティグループとNACLsの役割:ICMPメッセージを「通す」設定

さて、この「ICMPメッセージが正しく届く」ためには、クラウドのセキュリティ設定が鍵となります。

  • セキュリティグループ (Security Groups): これは、インスタンス(サーバー)単位で、入ってくる通信と出ていく通信を許可・拒否する「仮想的なファイアウォール」です。
  • ネットワークACL (Network Access Control Lists – NACLs): これは、サブネット単位で、入ってくる通信と出ていく通信を許可・拒否する「より広範囲のファイアウォール」です。

PMTUDが正しく動作するためには、このセキュリティグループやNACLsで、ICMPメッセージ(特に「Destination Unreachable」や「Packet Too Big」などのタイプ)の双方向の通信を許可しておく必要があります。

もし、これらの設定が厳しすぎると、ICMPメッセージが途中でブロックされてしまい、PMTUDがうまく機能せず、一部のアプリケーションで通信が遅くなったり、接続できなくなったりする原因となることがあるのです。

⚙️ 設定例:セキュリティグループでICMPを許可する

例えば、プライベートサブネットにあるEC2インスタンス(ID: i-xxxxxxxxxxxxxxxxx)のセキュリティグループ(ID: sg-xxxxxxxxxxxxxxxxx)で、ICMP(Type 3, Code 4)の受信を許可する場合、以下のような設定になります。

  • タイプ: ICMPv4
  • プロトコル: ICMP
  • ポート範囲: 3 (Destination Unreachable)
  • ソース: 0.0.0.0/0 (または、より限定した範囲)

これは、AWSマネジメントコンソールから設定できます。

1. EC2ダッシュボードから「セキュリティグループ」を選択します。
2. 対象のセキュリティグループ(sg-xxxxxxxxxxxxxxxxx)を選択します。
3. 「インバウンドルール」タブで「インバウンドルールを編集」をクリックします。
4. 「ルールを追加」をクリックします。
5. タイプ に ICMPv4 を選択します。
6. プロトコル に ICMP が自動的に選択されます。
7. ポート範囲 に 3 を入力します。(もし、特定のICMPメッセージのみを許可したい場合は、3/4 のように指定することもありますが、3 で「Destination Unreachable」全体をカバーできます。Code 4 のみ厳密に指定したい場合は、カスタムICMPタイプで設定することもあります。)
8. ソース は、通信元となるIPアドレス範囲を指定します。インターネット全体からの通信を許可する場合は 0.0.0.0/0 ですが、より安全にするために、NATゲートウェイのIPアドレス範囲や、他の信頼できるソースに限定することが推奨されます。
9. 「ルールを保存」をクリックします。

📝 コード例(AWS CLIでの設定イメージ)

aws ec2 authorize-security-group-ingress \
    --group-id sg-xxxxxxxxxxxxxxxxx \
    --protocol icmp \
    --port 3 \
    --cidr 0.0.0.0/0 # 必要に応じて、より限定的なIPレンジに変更してください

🚨 NATゲートウェイのNACLs設定の注意点

NATゲートウェイ自体に紐づくNACLsも、ICMPメッセージが通過できるように設定する必要があります。特に、プライベートサブネットからインターネットへのアウトバウンド通信と、インターネットからNATゲートウェイへのインバウンド通信の両方で、ICMP Type 3 Code 4 のようなメッセージが許可されているか確認しましょう。

📝 NATゲートウェイのNACLs設定例

  • アウトバウンドルール (プライベートサブネットからインターネットへ)
  • ルール番号: 100 (優先度が高いほど先に評価されます)
  • タイプ: Custom ICMP rule
  • プロトコル: ICMP
  • ICMPタイプ: 3
  • ICMPコード: 4
  • 送信元: プライベートサブネットのCIDRブロック (例: 10.0.1.0/24)
  • 宛先: 0.0.0.0/0
  • アクション: ALLOW
  • インバウンドルール (インターネットからNATゲートウェイへ)
  • ルール番号: 100
  • タイプ: Custom ICMP rule
  • プロトコル: ICMP
  • ICMPタイプ: 3
  • ICMPコード: 4
  • 送信元: 0.0.0.0/0
  • 宛先: NATゲートウェイのElastic IPアドレス (またはNATゲートウェイのサブネットCIDR)
  • アクション: ALLOW

📝 コード例(AWS CLIでのNACLs設定イメージ – NACLsのルール追加)

NACLsの設定は、セキュリティグループよりも少し複雑です。ここでは、NACLsのインバウンドルールに、ICMP Type 3 Code 4 を許可する設定を追加するイメージを示します。

aws ec2 create-network-acl-entry \
    --network-acl-id acl-xxxxxxxxxxxxxxxxx \
    --rule-number 100 \
    --protocol icmp \
    --icmp-type 3 \
    --icmp-code 4 \
    --cidr-block 0.0.0.0/0 \
    --rule-action allow

(注意) 上記CLIコマンドは、NACLsのインバウンドルールを追加する例です。アウトバウンドルールを追加する場合は、--ingress や --egress の指定、送信元/宛先のCIDRブロックの指定が異なります。実際の設定は、AWSマネジメントコンソールで確認しながら行うのが確実です。

📚 まとめ:賢いネットワーク設計のために

今回は、クラウドネットワークにおける「パスMTUディスカバリー (PMTUD)」と「ICMPメッセージ」の重要性、そしてNATゲートウェイとの連携について、郵便配達の例えを交えながら解説しました。

  • MTU: パケットの最大サイズ。
  • ICMP: ネットワークのエラー通知や状態報告を行うプロトコル。
  • PMTUD: 通信相手とネットワーク全体で最適なMTUを見つける仕組み。
  • NATゲートウェイ: プライベートサブネットからインターネットへの通信を可能にする。
  • セキュリティグループ/NACLs: ICMPメッセージの通過を許可する必要がある。

これらの要素が連携することで、プライベートインスタンスからインターネットへの通信も、パケットサイズの問題を賢く乗り越えることができるのです。

「なんか難しそう…」と感じた方も、一つ一つの要素を「郵便配達の役割分担」や「箱のサイズ」に置き換えて考えると、イメージが掴みやすくなったのではないでしょうか?

もし、皆さんの環境で「なぜかあのサイトに繋がらない」「通信が時々遅くなる」といった現象に遭遇したら、今回お話ししたPMTUDやICMPメッセージ、そしてセキュリティ設定を見直してみる価値は十分にあります。ネットワークの奥深い世界を、これからも一緒に探求していきましょう!

それでは、また次回の記事でお会いしましょう!Happy networking!

コメント

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