ICMPとは — ping/tracerouteの仕組みからPMTU問題・セキュリティ対策まで完全ガイド

ICMPとは — ネットワーク制御のための「言語」を深掘り

ICMP(Internet Control Message Protocol:インターネット制御メッセージプロトコル)は、IPネットワークにおける診断・制御・エラー報告を行うためのプロトコルです。TCPやUDPのようなユーザデータの輸送を行うトランスポート層プロトコルではなく、IP(ネットワーク層)に付随して動作し、ネットワークの「状態」を伝えるためのメッセージを交換します。代表的なユーティリティであるpingやtracerouteは、ICMPを利用して接続性や経路を確認します。

歴史と標準化(関連RFC)

  • ICMPv4 の基本仕様は RFC 792(1981年)で定義されています。
  • 実装上のホストやルータの振る舞いについては RFC 1122(ホスト要件)や RFC 1812(ルータ要件)などで規定されています。
  • ICMPv6(IPv6用ICMP)は RFC 4443 で定義され、IPv6向けの制御・エラー機能を提供します。IPv6の近隣検出(Neighbor Discovery)は RFC 4861 によってICMPv6上で仕様化されています。
  • 過去に存在した挙動(例:Source Quench)は非推奨化されており、RFC 6633 等で扱われています。

ICMPの役割と位置づけ

ICMPは主に次の目的で使われます。

  • エラー通知:パケットが到達できない、断片化が必要だが禁止されているなどの問題を送信元に知らせる。
  • 診断機能:到達性・往復遅延の計測(ping)、経路の特定(traceroute)など。
  • 制御情報の交換:リダイレクト、ルータのアドバタイズ等(IPv4/IPv6で役割や実装が異なる部分あり)。

ICMPメッセージの基本フォーマット

ICMPメッセージはIPペイロードとして運ばれ、共通のヘッダを持ちます。基本的なフィールドは次のとおりです。

  • Type(8ビット):メッセージの種類(例:Echo Requestなら8、Echo Replyなら0)。
  • Code(8ビット):Typeのサブ分類を示す。
  • Checksum(16ビット):ICMPメッセージの検査和。
  • その後にType/Codeごとに異なるデータ(例:Echoは識別子とシーケンス番号、エラーは元のIPヘッダ+データの一部を含む)

重要な実装ルール:多くのエラー系ICMPメッセージは、問題の発生したパケットのIPヘッダと最初の64ビット(通常はIPヘッダ+最初の8バイトの上位層ヘッダ)を含めて返送するため、送信元はどの通信に対するエラーかを識別できます。また、RFCにより「ブロードキャストやマルチキャスト宛てのパケットに対してはICMPエラーを返さない」「ICMPエラーに対してさらにICMPエラーを返さない」などのルールがあります。

代表的なICMP(IPv4)のメッセージ種別

ここでは診断や運用で頻出するメッセージを中心に説明します(Type番号はICMPv4)。

  • Type 0:Echo Reply — pingの応答。
  • Type 8:Echo Request — pingの要求。
  • Type 3:Destination Unreachable(到達不能) — さらにCodeで細分。(例:Code 0 ネットワーク到達不能、1 ホスト到達不能、2 プロトコル不明、3 ポート到達不能、4 フラグメント必要(DFセット)など) 特にCode 4(フラグメント必要)はPath MTU Discovery(PMTU)で重要。ICMPがブロックされるとPMTUが働かず通信断になる可能性がある。
  • Type 4:Source Quench(送信抑制) — 昔は輻輳制御のために使われたが非推奨化されている。
  • Type 5:Redirect(リダイレクト) — ルータがより良い送信先を指示する。セキュリティ上の問題となることがある。
  • Type 11:Time Exceeded(寿命超過) — TTL(あるいはホップリミット)が0になった場合に送信され、tracerouteで経路中のルータを特定するために利用される。
  • Type 12:Parameter Problem(パラメータ問題) — 非常に異常なIPヘッダ等に対して送られる。
  • Type 9/10:Router Advertisement / Router Solicitation — ルータ発見に関係するが、現在はDHCPなどの組み合わせで使われるケースも多い。
  • Type 13/14:Timestamp / Timestamp Reply — 時刻測定用(ほとんど使われない)。
  • Type 17/18:Address Mask Request/Reply — サブネットマスク取得(過去の用途で現在はほとんど使われない)。

ping と traceroute の仕組み

pingはICMP Echo Request(Type 8)を送ってEcho Reply(Type 0)を待ち、往復時間(RTT)やパケットロスを測定します。実装はシンプルでネットワークの疎通確認に広く使われます。

tracerouteはTTL(Time To Live)値を段階的に増やしながら送信して、中間ルータからの「Time Exceeded(Type 11)」メッセージを収集して経路を逆探知します。Unix系のtracerouteは通常UDPを使って高番ポートへ送る実装が多く、WindowsのtracertはデフォルトでICMP Echoを使う点で挙動が異なります。近年はTCPを用いるtcptracerouteや、双方向に情報を出すmtrのようなツールも一般的です。

ICMPとセキュリティ上の懸念

ICMPはネットワーク診断に不可欠ですが、悪用されるリスクもあります。代表的な問題と対策は以下のとおりです。

  • ICMPを使ったDDoS(大規模なping floodなど) — レート制限やACLで緩和。
  • Smurf攻撃 — ブロードキャスト宛てのEcho Requestを多数の応答で増幅する攻撃。ほとんどのルータやホストはブロードキャストへのEchoを遮断することで対策。
  • ICMPトンネリング — 正常なICMPに偽装してデータを送る不正なチャネルの作成。IDS/IPSで異常な長さや頻度を検出する必要あり。
  • ICMP Redirectの悪用 — 攻撃者が不正な経路情報を送ることで中間者攻撃を誘発する可能性がある。ルータ/ホスト側でリダイレクトを制限・監査することが推奨される。
  • PMTUブラックホール — ICMP(特にFragmentation needed)のブロックにより分割不可で大きなパケットが破棄され、通信が途切れる問題。ICMPを全面遮断するのではなく、必要な種類(PMTUに関係するものやTime Exceeded)を許可する方が良い。

運用上のベストプラクティス

  • すべてのICMPを無条件にブロックしない:特にPMTU関連(Destination Unreachable Code 4 等)や Time Exceeded はネットワーク診断・経路維持のために重要。
  • レート制限を適用する:ICMPの無秩序なフラッドを緩和するために、ルータやファイアウォールでレートリミットを設定する。
  • 必要なType/Codeのみを許可:ファイアウォールポリシーで「許可するICMPの種類」を明示的に決める(例:Echo Request/Replyを管理ネットワークに限定、PMTUやTime Exceededを全ネットワークで許可など)。
  • IPv6ではICMPv6が重要:IPv6では近隣検出やアドレス自動設定など多くの機能がICMPv6に依存するため、ICMPv6を安易にブロックするとIPv6が機能しなくなる。
  • 監視とログ:ICMP関連の異常な流量や頻度をIDS/ログで検知する体制を整える。

実装上の注意点とトラブルシューティングのヒント

  • pingが通らない→ICMPブロック以外にも、ホスト側ファイアウォールやルータのACL、ホストのICMP無視設定が原因になり得る。
  • tracerouteで途中までしか経路が取れない→途中ルータがTTL減少でのICMPをブロックしている可能性。別プロトコル(TCPベースのtraceroute)で試す。
  • 特定宛先で大きなパケットが通らない→PMTU問題の疑い。Path MTU DiscoveryはICMPの受信に依存するため、ICMPの関連メッセージ許可を検討する。
  • 大量のICMPエラーが発生→ループや誤設定、BGP等の経路不一致を疑う。パケットキャプチャで元パケットとエラー内容を確認する。

まとめ

ICMPはネットワークの健全性を保つための重要な制御プロトコルです。pingやtracerouteなどの有用な診断ツールの基盤であると同時に、PMTUや経路制御など通信の信頼性維持にも不可欠です。一方で、セキュリティの観点から悪用される可能性もあるため、無差別に遮断するのではなく、必要なICMP種類を適切に許可し、レート制限やログ監視を行うことがベストプラクティスです。IPv6環境では特にICMPv6が機能的に重要であるため、設定ミスはネットワーク全体の障害に繋がる点に注意してください。

参考文献