ICMP(Internet Control Message Protocol)は、ネットワークの診断や、通信できなかったことの通知に使うプロトコルです。いちばん身近なのは ping(Echo request と Echo reply)です。
ICMP には、TCP や UDP のようなポート番号はありません。代わりに、メッセージの種類を表す「タイプ」と、その詳細を表す「コード」があります。この記事では、Cisco ルータとパケットキャプチャを使って、よく見るタイプとコードを確認します。
- ICMP のタイプとコードの考え方
- Echo、Time-to-live exceeded、Destination unreachable、Redirect がどんなときに送られるか
- パケットキャプチャで ICMP のどこを見ればよいか
ICMPのタイプとコード
ICMP は IP パケットの中に直接入って運ばれます(IP ヘッダのプロトコル番号は 1)。ICMP メッセージの先頭にはタイプとコードがあり、受け取った側はこの2つでメッセージの意味を判断します。この記事で扱うものは次のとおりです。
| タイプ | コード | 名前 | 送られるとき |
|---|---|---|---|
| 8 | 0 | Echo request | ping を送ったとき |
| 0 | 0 | Echo reply | ping に応答するとき |
| 11 | 0 | Time-to-live exceeded(in transit) | 転送中に TTL が 0 になり、パケットを捨てたとき |
| 3 | 1 | Destination unreachable(Host unreachable) | 宛先のホストへ届けられないとき |
| 3 | 3 | Destination unreachable(Port unreachable) | 宛先で、そのポートを開いていないとき |
| 3 | 13 | Destination unreachable(Communication administratively prohibited) | ACL などで拒否されたとき |
| 5 | 1 | Redirect(Redirect for host) | 送信元に、もっとよいネクストホップを教えるとき |
この記事の画面は、実際の画面ではなく、検証時のパケットキャプチャから見るポイントを抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
ICMP エコーリクエストとリプライ (ping)
まず、代表的な ping を確認します。R1(192.168.12.1)から R2(192.168.12.2)へ ping を送ります。
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
▸ 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)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Type: 8 (Echo (ping) request)Code: 0 | R1 からの Echo request は、タイプ 8、コード 0 |
| 2 | Type: 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 を無効にしています)。
| Source | Destination | Protocol | Info |
|---|---|---|---|
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=7 |
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=6 |
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=5 |
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=4 |
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=3 |
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=2 |
| 192.168.12.1 | 3.3.3.3 | ICMP | Echo (ping) request id=0x000b, seq=0/0, ttl=1 |
| 192.168.12.2 | 192.168.12.1 | ICMP | Time-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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Type: 11 (Time-to-live exceeded)Code: 0 (Time to live exceeded in transit) | 転送中に TTL が 0 になったことの通知 |
| 2 | Internet Protocol Version 4, Src: 192.168.12.1, Dst: 3.3.3.3Time 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 を返します。
▸ 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
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Type: 3 (Destination unreachable)Code: 3 (Port unreachable) | 宛先でそのポートを開いていないことの通知 |
| 2 | User Datagram Protocol, Src Port: 49170, Dst Port: 33435 | 届けられなかった元の UDP パケット(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 を返します。
▸ 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)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Type: 3 (Destination unreachable)Code: 1 (Host unreachable) | 宛先のホストへ届けられないことの通知 |
| 2 | Internet 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)を返します。
▸ 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)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Type: 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)を送ります。
▸ 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)
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Type: 5 (Redirect)Code: 1 (Redirect for host) | 宛先ホスト(2.2.2.2)についてのリダイレクト |
| 2 | Gateway address: 192.168.12.2 | よりよいネクストホップ。次からは R2 へ直接送るよう伝えている |
まとめ
| メッセージ | タイプ/コード | この記事での発生条件 |
|---|---|---|
| Echo request/Echo reply | 8/0、0/0 | R1 から R2 へ ping |
| Time-to-live exceeded | 11/0 | R1 と R2 の間のルーティングループで TTL が 0 になった |
| Port unreachable | 3/3 | traceroute の UDP パケットが、開いていないポートに届いた |
| Host unreachable | 3/1 | R2 に宛先(3.3.3.3)への経路がなかった |
| Communication administratively prohibited | 3/13 | R2 の ACL で ICMP を拒否した |
| Redirect | 5/1 | R3 の送ったパケットに、同じセグメントによりよいネクストホップ(R2)があった |
ほかにも多くのタイプとコードがあります。一覧は IANA の Internet Control Message Protocol (ICMP) Parameters で確認できます。
コメント