ICMP(Internet Control Message Protocol)
IP の「制御・診断用」メッセージ。エラー通知や疎通確認に使う。 ping / traceroute / Path MTU Discovery の動作原理まで。
役割
IP が「ベストエフォート」で動く以上、エラーが起きたときに何かを伝える仕組みが要る。 ICMP はその役割を担う「診断・通知」プロトコル。
- パケットが届かなかった理由を送信元に通知
- 経路で TTL が切れたことを通知
- ルータが「もっと良い経路がある」と通知
- 疎通確認(Echo Request / Reply)
- Path MTU Discovery の情報源
IPv4 のプロトコル番号は 1、IPv6 は 58 (ICMPv6)。
ICMP メッセージの形式
+--------+--------+----------+
| Type | Code | Checksum |
+--------+--------+----------+
| Type 固有のデータ |
+----------------------------+
- Type: メッセージ種別
- Code: 種別の中の細分
- Checksum: 自身のメッセージの整合性
主要な Type 一覧(IPv4)
| Type | 名称 | 意味 |
|---|---|---|
| 0 | Echo Reply | ping の応答 |
| 3 | Destination Unreachable | 到達不能(Code で詳細) |
| 4 | Source Quench | 輻輳通知(廃止) |
| 5 | Redirect | もっと良い経路あり |
| 8 | Echo Request | ping の問合せ |
| 9 | Router Advertisement | 古典的なルータ広告 |
| 10 | Router Solicitation | ルータ要求 |
| 11 | Time Exceeded | TTL 切れ / 再構成タイマー切れ |
| 12 | Parameter Problem | ヘッダ不正 |
| 13 | Timestamp Request | 時刻取得 |
| 14 | Timestamp Reply | 時刻応答 |
| 17 | Address Mask Request | マスク取得(廃止) |
| 18 | Address Mask Reply | 同上 |
Destination Unreachable(Type 3)の Code
| Code | 意味 |
|---|---|
| 0 | Network Unreachable — そのネットワークに経路がない |
| 1 | Host Unreachable — そのホストに到達不能 |
| 2 | Protocol Unreachable — そのプロトコル未対応 |
| 3 | Port Unreachable — そのポートに LISTEN なし |
| 4 | Fragmentation Needed but DF set — PMTUD で重要 |
| 5 | Source Route Failed |
| 9 | Communication Administratively Prohibited(FW) |
| 13 | Communication Administratively Prohibited |
Time Exceeded(Type 11)の Code
- Code 0: TTL Exceeded in Transit — traceroute の元ネタ
- Code 1: Fragment Reassembly Time Exceeded — 断片の揃え待ちタイムアウト
ping の中身
仕組み
- 送信側が ICMP Echo Request (Type 8) を作成
- Identifier / Sequence Number を載せて送信
- 受信側が同じデータを Echo Reply (Type 0) で返す
- 送信側が RTT を計算
パケット例(hex)
ICMP Header
08 ← Type (8 = Echo Request)
00 ← Code
xx xx ← Checksum
xx xx ← Identifier (PID 等)
xx xx ← Sequence Number
[payload] ← 任意のデータ(時刻情報など)
確認コマンド
ping -c 5 example.com # 5 回送信
ping -i 0.2 example.com # 200ms 間隔(root)
ping -s 1472 example.com # MTU 試験用サイズ
ping -M do -s 1472 example.com # DF を立てて分割不可
ping -W 2 example.com # 待機 2 秒
ping -t 1 example.com # TTL を 1 に(traceroute 風)
# IPv6
ping6 ipv6.google.com
traceroute の中身
仕組み
- TTL=1 のパケットを送る → 1 番目のルータが受け取って TTL=0 にしてICMP Time Exceeded を返す
- 送信元はこの ICMP の送信元 IPを見て、1 番目のルータの IP を知る
- TTL=2, 3, 4... と増やしていき各ホップを順に発見
- 最終的に宛先が応答(プロトコル次第で Echo Reply / Port Unreachable / 等)
UDP / TCP / ICMP のどれを使う?
- UNIX 系の
tracerouteはデフォルトでUDP(ポート 33434+) - Windows の
tracertはICMP Echo traceroute -T -p 443で TCP 443 宛(FW で UDP/ICMP 拒否環境でも通せる)traceroute -Iで ICMP
「* * *」の意味
- 中間ルータがICMP Time Exceeded を返さない場合(FW / レート制限)
- 到達自体は OKでも見えない場合がある
- パスの一部だけ見えないのは普通
Path MTU Discovery(PMTUD)
経路上の最小 MTU を学習するための仕組み(RFC 1191)。
動作
- 送信元が大きいパケット + DF (Don't Fragment) フラグで送る
- MTU 不足のリンクで弾かれ、ルータが ICMP Type 3 Code 4 (Fragmentation Needed) を返す
- その ICMP に「次のホップ MTU」が記載されている
- 送信元はこれに合わせてパケットサイズを縮小して再送
- 同じ宛先への将来の送信もこの値を使用
PMTUD ブラックホール問題
- FW が「ICMP は危険だから全部ブロック」していると、ICMP Type 3 が返らない
- 送信元は「届かない」のか「サイズ問題」なのか分からず無限再送
- 結果: 巨大ファイルや特定先で応答しない / 一部ブロックされる
- 対策: ICMP を最低限通す / TCP MSS Clamping / PLPMTUD(RFC 4821 の上位層実装)
Redirect(Type 5)
ルータが「自分よりもっと近いルータがある」と送信元に教える。
- Code 0: Redirect for Network
- Code 1: Redirect for Host
- Code 2 / 3: TOS 関連
- セキュリティ上、無効化されることが多い(攻撃手段にもなり得る)
ICMPv6
IPv6 では ICMPv6(Protocol 58)が大幅に拡張されている。 ARP / IGMP / Router Discovery を統合。
主要 Type
| Type | 名称 |
|---|---|
| 1 | Destination Unreachable |
| 2 | Packet Too Big(PMTUD) |
| 3 | Time Exceeded |
| 4 | Parameter Problem |
| 128 | Echo Request |
| 129 | Echo Reply |
| 130 | Multicast Listener Query |
| 131 | Multicast Listener Report |
| 133 | Router Solicitation (RS) |
| 134 | Router Advertisement (RA) |
| 135 | Neighbor Solicitation (NS) |
| 136 | Neighbor Advertisement (NA) |
| 137 | Redirect |
NDP / MLD
- NDP(Neighbor Discovery Protocol): ARP 相当 + ルータ発見 + リダイレクト
- MLD(Multicast Listener Discovery): IGMP 相当のマルチキャスト管理
IPv6 ではICMPv6 を絶対にブロックしてはいけない(NDP / PMTUD が壊れる)。
セキュリティ
ICMP を悪用した攻撃
- Smurf Attack: ブロードキャスト宛の Echo Request で多数の応答を被害者に集中(古典)
- Ping of Death: 巨大な ICMP パケットでバッファオーバーフロー(古い OS)
- ICMP Tunneling: Echo の payload にデータを忍ばせて FW を回避
- ICMP Flood: 大量の Echo Request で帯域消費
- Redirect 攻撃: 偽の ICMP Redirect で経路をすり替え
FW の方針
- 「ICMP 全拒否」は過剰。PMTUD が壊れて副作用
- 最低限通すべき:
- Type 3 Code 4(Fragmentation Needed)
- Type 11(Time Exceeded)
- Type 0 / 8(Echo Reply / Request、レート制限付き)
- IPv6 ではICMPv6 はかなり広めに通す必要がある(RFC 4890)
ICMP のレート制限
多くの OS / ルータは ICMP の生成・転送にレート制限をかける(DDoS 対策)。 traceroute で「* * *」が出る原因の 1 つ。
具体例: ping を Wireshark で見る
Frame 1: 98 bytes on wire
Ethernet II
Src: aa:bb:cc:dd:ee:ff
Dst: 11:22:33:44:55:66
Internet Protocol Version 4
Src: 192.168.1.10
Dst: 8.8.8.8
Protocol: ICMP (1)
TTL: 64
Internet Control Message Protocol
Type: 8 (Echo Request)
Code: 0
Checksum: 0x4d34
Identifier: 0x1234
Sequence: 1
Data: ...timestamp...
確認コマンド
# PMTUD テスト
ping -M do -s 1500 example.com
# ICMP だけキャプチャ
sudo tcpdump -i any -n icmp
sudo tcpdump -i any -n icmp6
# ICMP のカウンタ
ss -s
nstat | grep -i icmp # Linux
netstat -s -p icmp # Linux
netstat -s | grep -A 30 -i icmp # macOS / BSD
Linux で ICMP を扱う設定
# ICMP Redirect を受けない
sysctl -w net.ipv4.conf.all.accept_redirects=0
# ping に応答しない(非推奨)
sysctl -w net.ipv4.icmp_echo_ignore_all=1
# ブロードキャスト ping を無視(推奨デフォルト)
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# ICMP のレート制限
sysctl -w net.ipv4.icmp_ratelimit=1000
よくあるトラブル
| 症状 | 原因 |
|---|---|
| ping は通るが HTTP は通らない | L7 / FW / アプリ層の問題(ICMP は L3 まで) |
| ping が通らないが HTTP は OK | サーバが ICMP を拒否しているだけ。実害なし |
| HTTPS の特定サイトで巨大ファイルが固まる | PMTUD ブラックホール |
| traceroute が途中で止まる | ICMP レート制限 / FW で TTL Exceeded ブロック |
| IPv6 の通信が不安定 | ICMPv6 を無闇にブロックしている |
大原則
「ICMP = ping」だけではない。インターネットの正常動作に不可欠な制御プロトコル。 ブロックしすぎると現代の通信は壊れる。RFC 4890 / 8504 を読むのが吉。