ICMPとは ― タイプとコードの一覧と仕組み
ICMPとは、
ICMPとは、IPの通信で起きたことを送信元に知らせるプロトコル
ICMPは、IPパケットが届かなかったときに、その理由を送信元へ知らせるプロトコルです。相手まで届くかを確かめる問い合わせにも使います。
ICMPは、Internet Control Message Protocolの略です。仕様はRFC 792で、1981年に定められました。ICMPの知らせには、何が起きたかを表す2つの番号が付いています。この番号を、タイプとコードと呼びます。
pingは、ICMPの問い合わせを送るコマンドです。ICMPを全部止めると、pingが使えなくなるだけでなく、経路の途中で大きすぎたパケットの知らせも届かなくなります。この先では、タイプとコードの一覧と、止めたときに困る理由が分かります。
ICMPはどの層か:IPで運ばれる第3層のプロトコル
ICMPのメッセージは、IPパケットのデータ部分に入って運ばれます。運ばれ方だけを見ると、TCPやUDPと同じです。それでも、ICMPはTCP・UDPの第4層ではなく、IPと同じ第3層に分類されます。
理由は、ICMPがIPを支えるための仕組みだからです。RFC 792は、ICMPをIPに欠かせない一部としています。IPを実装するすべての機器に、ICMPの実装も求めています。OSIとTCP/IPモデルの対応表でも、ICMPはIPと同じ段に入っています。
IPヘッダには、データ部分の中身が何かを示す番号があります。この番号をプロトコル番号と呼びます。ICMPのプロトコル番号は1で、TCPは6、UDPは17です。番号は、IANAという番号の管理団体が一覧で定めています。
図のとおり、ICMPにはポート番号の欄がありません。そのため、ファイアウォールやルータのACLでICMPを通すかを決めるときは、ポート番号の代わりにタイプを指定します。
ICMPメッセージの形:タイプとコードで種類を表す
ICMPメッセージの先頭には、タイプ・コード・チェックサムの3つの欄が並びます。タイプは8ビットで、メッセージの大きな種類を表します。コードも8ビットで、同じタイプの中での細かい理由を表します。
チェックサムは16ビットで、メッセージが途中で壊れていないかを確かめる値です。その後ろの中身は、タイプごとに決まっています。たとえばエコー要求には、何回目の要求かを示す通し番号が入ります。
問い合わせとエラー通知の2種類
ICMPのメッセージは、役割で2種類に分かれます。1つは、相手に尋ねて答えをもらう問い合わせです。もう1つは、パケットを処理できなかったことを知らせるエラー通知です。
問い合わせの代表は、pingが使うエコー要求とエコー応答です。エラー通知の代表は、到達不能と時間超過です。この分け方は、ホストの要件を定めたRFC 1122にあります。
エラー通知には、原因になったパケットの頭が入る
エラー通知には、原因になったパケットのIPヘッダが入ります。その後ろにも、元のデータの先頭が少なくとも8バイト入ります。この8バイトに、TCPやUDPのポート番号が含まれます。
送信元のOSは、この部分を見て、どの通信で起きたエラーかを判断します。ルータの要件を定めたRFC 1812は、元のパケットをできるだけ多く入れるよう勧めています。ただし、ICMPのパケット全体が576バイトを超えない範囲です。
エラー通知に、さらにエラー通知を返すことはありません。返し合いが止まらなくなるのを防ぐためです。ブロードキャスト宛てやマルチキャスト宛てのパケットにも、エラー通知は返しません。
主なICMPのタイプとコードの一覧
IPv4のICMPのタイプは、IANAが一覧で管理しています。よく出るのは次の6つです。
| タイプ | 名前 | 送られる |
|---|---|---|
| 0 | エコー応答(Echo Reply) | エコー要求を受けた相手が返す |
| 3 | 到達不能(Destination Unreachable) | 宛先に届けられなかったときに返す |
| 5 | リダイレクト(Redirect) | 同じLANにもっと近い出口があると教える |
| 8 | エコー要求(Echo Request) | pingが相手に送る |
| 11 | 時間超過(Time Exceeded) | TTLが0になったときなどに返す |
| 12 | パラメータ問題(Parameter Problem) | IPヘッダの中身が不正で処理できないときに返す |
以前は、送信元に送る速さを落とすよう求める送信元抑制もありました。タイプ4のこのメッセージは、RFC 6633で使わないことになりました。ほかにもRFC 6918で廃止されたタイプがあり、IANAの一覧では Deprecated と書かれています。
到達不能(タイプ3)のコード
到達不能は、届けられなかった理由をコードで細かく分けます。よく出るのは次のコードで、どの機器が返すかはRFC 1812に書かれています。
| コード | 意味 | 返す機器 |
|---|---|---|
| 0 | ネットワーク到達不能 | 宛先のネットワークへの経路が無いルータ |
| 1 | ホスト到達不能 | 宛先の機器がARPに答えないときの、最後のルータ |
| 2 | プロトコル到達不能 | その種類の中身を扱えない宛先の機器 |
| 3 | ポート到達不能 | UDPのそのポートを使っていない宛先の機器 |
| 4 | 分割が必要だがDFビットあり | MTUの小さい区間の手前のルータ |
| 13 | 管理上の禁止 | フィルタで転送を止めたルータ |
コード3は、Mac・Linuxのtracerouteが、宛先に着いたことを知るのにも使われます。ping・tracerouteの記事で説明した「ICMPポート到達不能」は、このコードです。TCPのポートが閉じているときは、宛先の機器はICMPを使わず、TCPのRSTで断ります。
コード4は、後の節で説明する経路MTU探索で使われます。コード13は、フィルタの設定によっては返さずに黙って捨てることも認められています。
時間超過(タイプ11)
時間超過のコード0は、ルータを通るたびに減るTTLが、途中で0になったことを示します。コード1は、分割されたパケットの断片が時間内にそろわず、元に戻せなかったことを示します。TTLが0になる仕組みは、ルーティングの記事のTTLの節で説明しています。
リダイレクト(タイプ5)
リダイレクトは、ゲートウェイがPCに、次から別のルータへ送るよう教えるメッセージです。例として、PC 192.168.10.25 のLANに、ゲートウェイ 192.168.10.1 とは別のルータ 192.168.10.254 があるとします。192.168.20.0/24 への出口は、この 192.168.10.254 です。
PCが192.168.20.0/24宛てのパケットをゲートウェイに送ると、ゲートウェイは同じLANの192.168.10.254へ転送します。受け取ったLANへそのまま送り返す形になるので、ゲートウェイはPCにリダイレクトを返します。PCは、次からその宛先へは192.168.10.254に直接送ります。
ルータが送るのは、宛先の機器ごとのリダイレクトです。これはコード1で、ネットワーク単位のコード0は送ってはならないとRFC 1812が定めています。
動かして確かめる:どの場面で、どのICMPが返るか
次の図は、8つの場面ごとに、ICMPを返す機器と、タイプ・コードを並べたものです。アドレスは、このサイトで使っている例の値です。
- 起きたこと
- PCが203.0.113.50へ、エコー要求(タイプ8・コード0)を送った。
- 返す機器
- 宛先のWebサーバ(203.0.113.50)
- 返るICMP
- エコー応答タイプ0・コード0
- 分かること
- 相手まで届き、相手から戻る道もあることが分かります。送ってから返るまでの時間も測れます。
- 起きたこと
- 途中のルータの経路表に、宛先のネットワークへの経路が無かった。
- 返す機器
- 経路が見つからなかったルータ
- 返るICMP
- 到達不能タイプ3・コード0(ネットワーク到達不能)
- 分かること
- そのルータから先へ進めなかったことが分かります。経路の切り替わり中に一時的に出ることもあるので、決定的な証拠としては扱いません。
- 起きたこと
- 宛先と同じLANにある最後のルータが、ARPで宛先のMACアドレスを調べたが、答えが無かった。
- 返す機器
- 宛先の手前の最後のルータ
- 返るICMP
- 到達不能タイプ3・コード1(ホスト到達不能)
- 分かること
- ネットワークまでは届いたが、宛先の機器が見つからないことが分かります。電源が切れている場合などに起きます。
- 起きたこと
- UDPのパケットが宛先に届いたが、その宛先ポートで待ち受けているプログラムが無かった。
- 返す機器
- 宛先の機器
- 返るICMP
- 到達不能タイプ3・コード3(ポート到達不能)
- 分かること
- 機器までは届いたが、そのポートは使われていないことが分かります。TCPの場合はICMPではなく、TCPのRSTで断られます。
- 起きたこと
- ルータを1台通るたびにTTLが1ずつ減り、途中のルータで0になった。
- 返す機器
- TTLが0になったルータ
- 返るICMP
- 時間超過タイプ11・コード0
- 分かること
- どのルータで止まったかが、返ってきたICMPの送信元アドレスで分かります。tracerouteはこれを使って経路を調べます。
- 起きたこと
- 次の区間のMTUより大きいパケットに、分割を禁じるDFビットが立っていた。
- 返す機器
- MTUの小さい区間の手前のルータ
- 返るICMP
- 到達不能タイプ3・コード4(分割が必要だがDFビットあり)
- 分かること
- 次の区間のMTUの値が、メッセージの中に入って届きます。送信元はこの値に合わせてパケットを小さくします。
- 起きたこと
- ルータのフィルタの設定で、そのパケットの転送が禁じられていた。
- 返す機器
- フィルタで止めたルータ
- 返るICMP
- 到達不能タイプ3・コード13(管理上の禁止)
- 分かること
- 設定で止められたことが分かります。ただし、ICMPを返さずに黙って捨てる設定も認められているので、何も返らないこともあります。
- 起きたこと
- PCがゲートウェイ(192.168.10.1)へ送ったが、宛先へは同じLANの別のルータから出るほうが近かった。
- 返す機器
- ゲートウェイ(192.168.10.1)
- 返るICMP
- リダイレクトタイプ5・コード1(ホスト宛てのリダイレクト)
- 分かること
- その宛先には、次から別のルータへ送ればよいことが分かります。パケット自体は、ゲートウェイがそのまま転送します。
エラー通知を返すのは、問題に気づいた機器です。送信元は、返ってきたICMPの送信元アドレスを見て、どこで止まったかを知ります。ただし、ICMPを返さない設定の機器も多いので、何も返らないこともあります。
ICMPv6とNDP:IPv6ではICMPが欠かせない
IPv6では、IPv6用のICMPv6を使います。仕様はRFC 4443です。IPv6ヘッダで中身の種類を示す値は、ICMPv6なら58です。
タイプの番号も、IPv4とは違います。ICMPv6では、0〜127がエラー通知、128〜255が問い合わせなどの情報のメッセージです。
| タイプ | ICMPv6の | IPv4で |
|---|---|---|
| 1 | 到達不能(Destination Unreachable) | タイプ3 |
| 2 | パケット過大(Packet Too Big) | タイプ3のコード4 |
| 3 | 時間超過(Time Exceeded) | タイプ11 |
| 4 | パラメータ問題(Parameter Problem) | タイプ12 |
| 128 | エコー要求(Echo Request) | タイプ8 |
| 129 | エコー応答(Echo Reply) | タイプ0 |
NDPもICMPv6のメッセージで動く
IPv6の記事で説明したNDPは、ICMPv6のメッセージを使って動きます。NDPは、IPv4でARPが受け持っていた、相手のMACアドレスの問い合わせを引き継いでいます。ルータの発見やアドレスの自動設定にも使い、仕様はRFC 4861です。
| タイプ | NDPの | 役割 |
|---|---|---|
| 133 | ルータ要請(Router Solicitation) | 端末がルータを探す |
| 134 | ルータ広告(Router Advertisement) | ルータがネットワーク部などを知らせる |
| 135 | 近隣要請(Neighbor Solicitation) | 相手のMACアドレスを尋ねる。ARP要求にあたる |
| 136 | 近隣広告(Neighbor Advertisement) | 自分のMACアドレスを答える。ARP応答にあたる |
| 137 | リダイレクト(Redirect) | もっと近い次のルータを教える |
このため、IPv6でICMPv6を全部止めると、同じLANの相手とも通信できなくなります。IPv4のARPはICMPとは別のプロトコルなので、ICMPを止めてもLANの中の通信は残ります。IPv6では、ICMPを止めたときの影響がIPv4よりずっと大きくなります。
ICMPを全部止めると困ること:経路MTU探索が動かない
ICMPは攻撃に使われることがあるため、ファイアウォールで全部止めたくなります。しかし、全部止めると、正常な通信まで止まることがあります。代表的な例が、経路MTU探索です。
経路MTU探索は、宛先までの経路で通せるパケットの最大サイズを、送信元が調べる仕組みです。パスMTU探索とも呼びます。IPv4ではRFC 1191、IPv6ではRFC 8201に定められています。
IPv4の送信元は、分割を禁じるDFビットを立ててパケットを送ります。途中にMTUの小さい区間があると、その手前のルータはパケットを破棄します。そして、到達不能のコード4を送信元に返します。このメッセージには、次の区間のMTUの値が入っています。
IPv6では、途中のルータはパケットを分割しません。MTUを超えたパケットを受けたルータは、Packet Too Bigを返す決まりです。MTUとDFビットの関係は、カプセル化の記事のMTUの節にあります。PPPoEやVPNでMTUが小さくなる理由は、MTUとMSSの記事にまとめています。
途中でこのICMPを止めると、送信元にはMTUの値が分かりません。大きいパケットを送り続け、そのたびに捨てられます。この状態を、経路MTU探索のブラックホールと呼びます。
ブラックホールが起きても、TCPの3ウェイハンドシェイクは成功します。最初のやり取りは、小さいパケットだからです。そのため、接続はできるのに、大きいデータを送り始めると止まる症状になります。RFC 2923とRFC 8201が、この症状を挙げています。
止めてはいけないICMP
IPv6については、RFC 4890が、ファイアウォールで止めてはいけないICMPv6を挙げています。到達不能・Packet Too Big・時間超過のコード0・パラメータ問題のコード1と2です。エコー要求とエコー応答も、この一覧に入っています。
IPv4でも、経路MTU探索のために、到達不能のコード4は通す必要があります。時間超過を止めると、tracerouteで経路を調べられなくなります。IPv4では、ファイアウォールでエコー要求を止める運用が広く行われてきたと、RFC 4890も書いています。
通信の種類ごとに通すかを決める仕組みは、ファイアウォールの記事のパケットフィルタリングの節を読むと分かります。
ICMPの悪用と対策:Smurf攻撃など
ICMPは、受け取った機器に答えを返させるプロトコルです。この性質が、攻撃にも使われてきました。
Smurf攻撃
Smurf攻撃では、攻撃者が、あるネットワークのブロードキャストアドレスへエコー要求を送ります。このとき、送信元アドレスを、狙った相手のアドレスに偽ります。ネットワークの中の機器が一斉にエコー応答を返し、その応答がすべて狙われた相手に届きます。
1つの要求が、ネットワークの機器の台数分の応答に増えるので、狙われた相手の回線があふれます。外から特定のネットワークのブロードキャストアドレスへ送るパケットを、ダイレクトブロードキャストと呼びます。Smurf攻撃は、このダイレクトブロードキャストを通すネットワークを踏み台にします。
対策は、次のように何か所かで取られています。
- ルータがダイレクトブロードキャストを転送しない。RFC 2644で、これがルータの既定の動きになりました。
- 機器が、ブロードキャスト宛てのエコー要求に答えない。RFC 1122は、このエコー要求を黙って捨ててよいとしています。
- プロバイダなどの入口で、送信元を偽ったパケットを捨てる。この方法をイングレスフィルタリングと呼び、RFC 2827にあります。
ICMPを大量に送りつける攻撃
エコー要求を大量に送り、相手の回線や処理を埋める攻撃もあります。この攻撃を、ICMPフラッドと呼びます。ルータやOSは、ICMPを返す頻度に上限を設けます。応答のために、自分の処理や戻りの回線を使い切らないようにするためです。
RFC 1812は、エラー通知を送る頻度を制限できる機能をルータに求めています。RFC 4443は、IPv6の機器にICMPv6のエラー通知の頻度の制限を義務づけています。
偽のリダイレクトと、ネットワークの下調べ
偽のリダイレクトを送り込めば、PCの通信を別のルータへ向けられます。RFC 1122は、今使っているゲートウェイ以外から届いたリダイレクトを捨てるよう定めています。OSによっては、リダイレクトを受け付けない設定にもできます。
また、エコー要求を順に送れば、どのアドレスに機器があるかを調べられます。外からのエコー要求を止めるのは、この下調べを防ぐためです。そのため、pingが通らなくても、相手が止まっているとは限りません。
練習問題(全6問)
正解:エコー要求が
エコー要求は
正解:中身は
プロトコル番号1は
正解:ルータが
DFビットは
正解:経路MTU探索に
経路MTU探索は、
正解:ICMPv6の
IPv6では
正解:ルータが、
Smurf攻撃は、
選んでから「採点する」を押すと、解説つきで答え合わせができます。
関連記事
おすすめの本 PR
ネットワークを初めて学ぶ人向けの入門書です。
![『[改訂新版]3分間ネットワーク基礎講座』の表紙](https://m.media-amazon.com/images/P/4774143731.09.MZZZZZZZ.jpg)
