【初心者わかりやすく】ICMPを詳しく解説

 

ICMP(Internet Control Message Protocol)は、ネットワークの診断や、通信できなかったことの通知に使うプロトコルです。いちばん身近なのは ping(Echo request と Echo reply)です。

ICMP には、TCP や UDP のようなポート番号はありません。代わりに、メッセージの種類を表す「タイプ」と、その詳細を表す「コード」があります。この記事では、Cisco ルータとパケットキャプチャを使って、よく見るタイプとコードを確認します。

この記事でわかること
  1. ICMP のタイプとコードの考え方
  2. Echo、Time-to-live exceeded、Destination unreachable、Redirect がどんなときに送られるか
  3. パケットキャプチャで ICMP のどこを見ればよいか

ICMPのタイプとコード

ICMP は IP パケットの中に直接入って運ばれます(IP ヘッダのプロトコル番号は 1)。ICMP メッセージの先頭にはタイプとコードがあり、受け取った側はこの2つでメッセージの意味を判断します。この記事で扱うものは次のとおりです。

タイプコード名前送られるとき
80Echo requestping を送ったとき
00Echo replyping に応答するとき
110Time-to-live exceeded(in transit)転送中に TTL が 0 になり、パケットを捨てたとき
31Destination unreachable(Host unreachable)宛先のホストへ届けられないとき
33Destination unreachable(Port unreachable)宛先で、そのポートを開いていないとき
313Destination unreachable(Communication administratively prohibited)ACL などで拒否されたとき
51Redirect(Redirect for host)送信元に、もっとよいネクストホップを教えるとき
画面イメージについて

この記事の画面は、実際の画面ではなく、検証時のパケットキャプチャから見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

ICMP エコーリクエストとリプライ (ping)

まず、代表的な ping を確認します。R1(192.168.12.1)から R2(192.168.12.2)へ ping を送ります。

R1R2192.168.12.0/24.1.2ICMP Echo request(タイプ 8/コード 0)ICMP Echo reply(タイプ 0/コード 0)
図1 ping の Echo request と Echo reply

R1

R1# ping 192.168.12.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/8/12 ms
パケットキャプチャ(Wireshark) Echo request と Echo reply画面イメージ
▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.2▾ Internet Control Message Protocol1    Type: 8 (Echo (ping) request)    Code: 0    Checksum: 0x40f6 [correct]    [Checksum Status: Good]    Identifier (BE): 0 (0x0000)    Identifier (LE): 0 (0x0000)    Sequence number (BE): 1 (0x0001)    Sequence number (LE): 256 (0x0100)    [Response frame: 7]  ▸ Data (72 bytes)
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▾ Internet Control Message Protocol2    Type: 0 (Echo (ping) reply)    Code: 0    Checksum: 0x48f6 [correct]    [Checksum Status: Good]    Identifier (BE): 0 (0x0000)    Identifier (LE): 0 (0x0000)    Sequence number (BE): 1 (0x0001)    Sequence number (LE): 256 (0x0100)    [Request frame: 6]    [Response time: 13.875 ms]  ▸ Data (72 bytes)
図2 Echo request(上)と Echo reply(下)(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Type: 8 (Echo (ping) request)
Code: 0
R1 からの Echo request は、タイプ 8、コード 0
2Type: 0 (Echo (ping) reply)
Code: 0
R2 からの Echo reply は、タイプ 0、コード 0

Echo request と Echo reply は、Identifier と Sequence number が同じ値になっています。送信側はこの値で、どの request に対する reply かを対応づけます。

ICMP Time-to-live Exceeded

IP ヘッダの TTL は、ルータを1台通るたびに 1 ずつ減ります。ルーティングループなどで TTL が 0 になると、そのルータはパケットを捨て、送信元へ Time-to-live exceeded(タイプ 11、コード 0)を送ります。

ここでは、R1 と R2 にお互いを向くデフォルトルートを設定し、存在しない宛先(3.3.3.3)へ ping を送ります(Time-to-live exceeded を発生させるため、R1 と R2 では ICMP Redirect を無効にしています)。

R1R2192.168.12.0/24.1.2デフォルトルート → R2デフォルトルート → R13.3.3.3 宛ての ping が行き来し、TTL が 1 ずつ減るTime-to-live exceeded(タイプ 11/コード 0)TTL が 0 になった R2 がパケットを捨てて R1 へ通知
図3 ルーティングループで TTL が 0 になる
パケットキャプチャ(Wireshark) Time-to-live exceeded画面イメージ
SourceDestinationProtocolInfo
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=7
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=6
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=5
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=4
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=3
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=2
192.168.12.13.3.3.3ICMPEcho (ping) request id=0x000b, seq=0/0, ttl=1
192.168.12.2192.168.12.1ICMPTime-to-live exceeded (Time to live exceeded in …
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▾ Internet Control Message Protocol1    Type: 11 (Time-to-live exceeded)    Code: 0 (Time to live exceeded in transit)    Checksum: 0xa99d [correct]    [Checksum Status: Good]    Unused: 000000002  ▾ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 3.3.3.3      Total Length: 100      Identification: 0x002b (43)      Time to live: 1      Protocol: ICMP (1)      Source: 192.168.12.1      Destination: 3.3.3.3  ▸ Internet Control Message Protocol
図4 TTL が減っていく ping と Time-to-live exceeded(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Type: 11 (Time-to-live exceeded)
Code: 0 (Time to live exceeded in transit)
転送中に TTL が 0 になったことの通知
2Internet Protocol Version 4, Src: 192.168.12.1, Dst: 3.3.3.3
Time to live: 1
捨てられた元のパケットの IP ヘッダ。どのパケットが捨てられたかがわかる

3.3.3.3 宛ての ping が R1 と R2 の間を行き来し、そのたびに TTL が 1 ずつ減っていきます。最後に R2 で TTL が 0 になり、R2 は R1 へ Time-to-live exceeded を送ってパケットを捨てたことを知らせます。

このように ICMP のエラーメッセージには、原因になった元のパケットの IP ヘッダと、その後ろの先頭部分が入っています。送信元はこれを見て、どの通信でエラーが起きたかを判断します。

ICMP Destination Unreachable

ルータや宛先のホストがパケットを届けられないとき、送信元へ Destination unreachable(タイプ 3)を送ります。届けられなかった理由はコードで表します。ここでは、よく見るコードを3つ確認します。

Port Unreachable(コード 3)

ホストで開いていない UDP ポートにパケットが届くと、ホストはそのポートには届けられないことを Port unreachable(コード 3)で知らせます。なお、TCP の開いていないポートへの接続には、ICMP ではなく TCP の RST で応答するのが一般的です。

ここでは、R1 から R2 へ traceroute を実行します。Cisco ルータの traceroute は UDP のパケットを使います。R2 はその UDP ポートを開いていないので、Port unreachable を返します。

R1R2192.168.12.0/24.1.2traceroute(UDP、宛先ポート 33435 など)R2 ではそのポートを開いていないDestination unreachable(タイプ 3/コード 3)Port unreachable
図5 traceroute の UDP パケットへの Port unreachable
パケットキャプチャ(Wireshark) Port unreachable画面イメージ
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▾ Internet Control Message Protocol1    Type: 3 (Destination unreachable)    Code: 3 (Port unreachable)    Checksum: 0x966a [correct]    [Checksum Status: Good]    Unused: 00000000  ▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.22  ▸ User Datagram Protocol, Src Port: 49170, Dst Port: 33435
図6 Port unreachable の中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Type: 3 (Destination unreachable)
Code: 3 (Port unreachable)
宛先でそのポートを開いていないことの通知
2User Datagram Protocol, Src Port: 49170, Dst Port: 33435届けられなかった元の UDP パケット(traceroute のパケット)の宛先ポート
traceroute のしくみ

traceroute は、TTL を 1、2、3 と増やしながらパケットを送ります。途中のルータは TTL が 0 になると Time-to-live exceeded を返すので、送信元はその送信元アドレスから経路上のルータを順に知ることができます。宛先に届くと、使われていないポート宛ての UDP パケットに対して Port unreachable が返るので、宛先に着いたことがわかります。

Host Unreachable(コード 1)

ルータが宛先のホストへパケットを届けられないとき、Host unreachable(コード 1)を返します。最後の区間で ARP の応答がなく、宛先の MAC アドレスがわからない場合などに送られます。Cisco ルータは、宛先への経路がない場合にもこのコードを返します。

ここでは、R1 にだけ R2 へ向くデフォルトルートを設定し、存在しない宛先(3.3.3.3)へ ping を送ります。R2 には 3.3.3.3 への経路がないので、R2 が Host unreachable を返します。

R1R2192.168.12.0/24.1.2ping 3.3.3.3(R1 はデフォルトルートで R2 へ送る)R2 には 3.3.3.3 への経路がないDestination unreachable(タイプ 3/コード 1)Host unreachable
図7 経路がない宛先への Host unreachable
パケットキャプチャ(Wireshark) Host unreachable画面イメージ
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▾ Internet Control Message Protocol1    Type: 3 (Destination unreachable)    Code: 1 (Host unreachable)    Checksum: 0x3404 [correct]    [Checksum Status: Good]    Unused: 000000002  ▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 3.3.3.3  ▾ Internet Control Message Protocol      Type: 8 (Echo (ping) request)      Code: 0      Checksum: 0xc0e9 [unverified] [in ICMP error packet]      [Checksum Status: Unverified]      Identifier (BE): 15 (0x000f)      Identifier (LE): 3840 (0x0f00)      Sequence number (BE): 2 (0x0002)      Sequence number (LE): 512 (0x0200)
図8 Host unreachable の中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Type: 3 (Destination unreachable)
Code: 1 (Host unreachable)
宛先のホストへ届けられないことの通知
2Internet Protocol Version 4, Src: 192.168.12.1, Dst: 3.3.3.3届けられなかった元のパケットは、3.3.3.3 宛ての Echo request

Communication Administratively Prohibited(コード 13)

ACL(アクセスリスト)などでパケットを拒否したとき、ルータはその旨を送信元へ知らせます。R2 では、次の設定で ICMP を拒否しています。

R2

R2(config)# access-list 100 deny icmp any any
R2(config)# access-list 100 permit ip any any
R2(config)# interface FastEthernet0/0.12
R2(config-subif)# ip access-group 100 in

R1 から R2 へ ping を送ると、R2 は Communication administratively prohibited(コード 13)を返します。

R1R2192.168.12.0/24.1.2ping 192.168.12.2R2 の ACL 100 で ICMP を拒否Destination unreachable(タイプ 3/コード 13)Communication administratively filtered
図9 ACL で拒否されたときの通知
パケットキャプチャ(Wireshark) Communication administratively filtered画面イメージ
▸ Internet Protocol Version 4, Src: 192.168.12.2, Dst: 192.168.12.1▾ Internet Control Message Protocol1    Type: 3 (Destination unreachable)    Code: 13 (Communication administratively filtered)    Checksum: 0x9f91 [correct]    [Checksum Status: Good]    Unused: 00000000  ▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.2  ▾ Internet Control Message Protocol      Type: 8 (Echo (ping) request)      Code: 0      Checksum: 0x554b [unverified] [in ICMP error packet]      [Checksum Status: Unverified]      Identifier (BE): 20 (0x0014)      Identifier (LE): 5120 (0x1400)      Sequence number (BE): 2 (0x0002)      Sequence number (LE): 512 (0x0200)
図10 ACL で拒否されたときの通知(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Type: 3 (Destination unreachable)
Code: 13 (Communication administratively filtered)
管理上の理由(ACL など)で拒否したことの通知。Wireshark では「filtered」と表示される
補足

Cisco ルータの ping では、Destination unreachable を受け取ると、結果が ! や . ではなく U と表示されます。また、Destination unreachable を返すと、外部から ACL の存在を推測されることがあります。インターネットに面したインタフェースなどでは、no ip unreachables で送信を止めることもあります。

ICMP リダイレクト

ルータは、受け取ったパケットを同じインタフェースから送り返すことになり、しかも送信元と同じセグメントにもっとよいネクストホップがあるとき、Redirect(タイプ 5)を送信元へ送ります。Redirect には、よりよいネクストホップのアドレス(Gateway address)が入っています。送信元は、次からそのネクストホップへ直接送るようになります。

ここでは、R3 が R1 をゲートウェイにして、R2 の先にある 2.2.2.2 へ ping を送ります。R1 は、同じセグメントの R2(192.168.12.2)へ直接送った方がよいと判断し、R3 へ Redirect(コード 1:Redirect for host)を送ります。

R1R2R3.1.2.3192.168.12.0/242.2.2.2①②① R3 が 2.2.2.2 へ ping(ゲートウェイの R1 へ送る)② R1 が R3 へ Redirectタイプ 5/コード 1Gateway address:192.168.12.2
図11 ICMP Redirect でよりよいネクストホップを教える
パケットキャプチャ(Wireshark) Redirect画面イメージ
▸ Internet Protocol Version 4, Src: 192.168.12.1, Dst: 192.168.12.3▾ Internet Control Message Protocol1    Type: 5 (Redirect)    Code: 1 (Redirect for host)    Checksum: 0xe33b [correct]    [Checksum Status: Good]2    Gateway address: 192.168.12.2  ▸ Internet Protocol Version 4, Src: 192.168.12.3, Dst: 2.2.2.2  ▾ Internet Control Message Protocol      Type: 8 (Echo (ping) request)      Code: 0      Checksum: 0x4315 [unverified] [in ICMP error packet]      [Checksum Status: Unverified]      Identifier (BE): 3 (0x0003)      Identifier (LE): 768 (0x0300)      Sequence number (BE): 0 (0x0000)      Sequence number (LE): 0 (0x0000)
図12 ICMP Redirect の中身(実際の画面ではなく、表示内容のポイントを示したイメージです)
No.表示意味
1Type: 5 (Redirect)
Code: 1 (Redirect for host)
宛先ホスト(2.2.2.2)についてのリダイレクト
2Gateway address: 192.168.12.2よりよいネクストホップ。次からは R2 へ直接送るよう伝えている

まとめ

メッセージタイプ/コードこの記事での発生条件
Echo request/Echo reply8/0、0/0R1 から R2 へ ping
Time-to-live exceeded11/0R1 と R2 の間のルーティングループで TTL が 0 になった
Port unreachable3/3traceroute の UDP パケットが、開いていないポートに届いた
Host unreachable3/1R2 に宛先(3.3.3.3)への経路がなかった
Communication administratively prohibited3/13R2 の ACL で ICMP を拒否した
Redirect5/1R3 の送ったパケットに、同じセグメントによりよいネクストホップ(R2)があった

ほかにも多くのタイプとコードがあります。一覧は IANA の Internet Control Message Protocol (ICMP) Parameters で確認できます。

コメント