ICMPとは
ICMPは、IP通信のエラー通知や到達確認などに使う制御用プロトコルです。正式名称はInternet Control Message Protocol(インターネット・コントロール・メッセージ・プロトコル)で、アイシーエムピーと読みます。
IPv4ではICMP、IPv6ではICMPv6を使います。TCPやUDPのポートへ届けるアプリデータではなく、IPパケットの中へ制御メッセージとして収容され、ルーターや宛先ホストが元の通信について通知します。
pingのEcho 要求・応答はICMPの一機能にすぎず、到達不能、時間超過、パケットが大きすぎる通知など、IP通信を成立・診断させる重要な役割があります。

エラー用と情報用のメッセージを、TypeとCodeで分類する
エラーメッセージには、原因となったIPパケットの先頭部分が入る
送信元が「どの通信への通知か」を判断できるよう、ICMPエラーは原因となったIPパケットのヘッダーと後続データの一部を含めます。TCP・UDPの先頭が入れば、プロトコル、送信元・宛先アドレス、ポートなどから対応するソケットを見つけられます。
NATやトンネルがあると、観測点ごとに内外のヘッダーが異なります。短い抜粋だけでは暗号化された上位通信や深いカプセル化を識別できない場合もあります。受信したICMPの外側送信元と、埋め込まれた元パケットを別々に読みます。
pingはEchoの往復を測るが、アプリサービスの成功までは示さない
pingはEcho 要求を送り、Echo 応答の識別子・番号を対応させ、応答時間と損失を表示します。IP層で相手が応答した手掛かりになりますが、Webサーバー、DNS、認証、アプリ処理が動くことは保証しません。
Echoだけを遮断する機器、レート制限するサーバー、応答を低優先にするルーターがあります。反対にpingが成功しても、TCPポートが閉じていることはあります。ping成功・失敗を結論にせず、調べたいアプリと同じ宛先・ポート・名前解決も確認します。
tracerouteはTTL・Hop Limitを段階的に変え、時間超過の位置を並べる
tracerouteやtracertは、最初のパケットのTTLまたはHop Limitを小さくし、途中ルーターが返すTime Exceededを記録します。値を一つずつ増やし、より遠いホップからの応答を並べます。最終宛先の確認方法はUDP、ICMP Echo、TCPなどツールで異なります。
各ホップ表示は往路で通知を生成した位置ですが、ICMP応答の復路は別経路かもしれません。無応答ホップの先が表示される場合、そこで転送が止まったのではなく、当該ルーターだけが通知しなかった可能性があります。
Packet Too Bigを遮断すると、IPv6の大きな通信だけが止まることがある
IPv6ルーターは途中で断片化せず、出力リンクのMTUより大きいパケットへICMPv6 Packet Too Bigを返します。送信元は通知されたMTUへ合わせてパケットを小さくします。Path MTU Discoveryの中核です。
通知を一律遮断すると、小さなパケットやハンドシェイクは通るのに、大きな応答だけ止まるPMTU black holeになります。IPv4のFragmentation Neededも同様に重要です。ファイアウォールではメッセージ種別、方向、状態、レートを考えて許可します。
エラーへのエラーを際限なく返さず、生成量を制限する
ICMPエラーへ別のICMPエラーを返す、ブロードキャスト宛通信へ大量応答するなどは、ループや増幅を生みます。仕様はエラーを生成しない条件を定め、実装はレート制限します。断片の先頭以外へエラーを返さないなどの規則もあります。
攻撃者は送信元を偽装して大きな応答を被害者へ集めたり、エラー抜粋から通信情報を探ったりできます。ICMPを全部許可・全部拒否の二択にせず、IP版ごとに運用へ必要なType・Codeを通し、異常量を監視します。
仕様の確認資料:RFC 792「Internet Control Message Protocol」、RFC 4443「ICMPv6 Specification」、RFC 1812「Requirements for IPv4 Routers」