ITの教科書検索
入門・発展ページ読了 約13分

ICMPとは ― タイプとコードの一覧と仕組み

ICMPとは、IPの通信で起きたエラーや到達確認を送信元に知らせるプロトコルです。タイプとコードの一覧、ICMPv6とNDP、止めると困る理由と悪用への対策を解説します。

目次
  1. ICMPとは
  2. ICMPはどの層か
  3. メッセージの形:タイプとコード
  4. 主なタイプとコードの一覧
  5. 動かして確かめる:どのICMPが返るか
  6. ICMPv6とNDP
  7. 止めると困ること:経路MTU探索
  8. ICMPの悪用と対策
  9. 練習問題

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という番号の管理団体が一覧で定めています。

IPヘッダIPが運ぶデータICMPプロトコル番号1タイプ8ビットコード8ビットチェックサム16ビットメッセージごとの中身TCPプロトコル番号6送信元ポート16ビット宛先ポート16ビットシーケンス番号など番号で中身の読み方が決まる
IPヘッダのプロトコル番号が1なら、受け取った側はデータ部分をICMPとして読みます。ICMPの先頭はタイプとコードで、TCPやUDPのようなポート番号の欄はありません。

図のとおり、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の送信元アドレスを見て、どこで止まったかを知ります。ただし、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 14001500バイト・DF付きICMP 3/4(MTU 1400)送信元が1400バイト以下にして送り直すICMPを全部止めた場合送信元ルータ大きすぎて破棄宛先MTU 14001500バイト・DF付きICMP 3/4(MTU 1400)ファイアウォール送信元は気づかず、大きいまま送り続ける
上の段では、ルータが返すICMPで送信元がMTUを知り、小さくして送り直します。下の段では、そのICMPが途中で止められ、大きいパケットだけが捨てられ続けます。

途中でこの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問)

Q1pingが送るエコー要求と、相手が返すエコー応答のICMPタイプの組み合わせは?
Q2IPヘッダのプロトコル番号が1のパケットについて、正しいものは?
Q3IPv4で、DFビットが立った1500バイトのパケットが、MTU 1400の区間の手前のルータに届いた。起きることは?
Q4ファイアウォールでICMPを全部止めたところ、Webサーバに接続はできるが、大きいデータを送り始めると止まるようになった。原因として最も考えられるものは?
Q5IPv6で、同じLANの相手のMACアドレスを調べるときに使うものは?
Q6Smurf攻撃への対策として正しいものは?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

おすすめの本 PR

ネットワークを初めて学ぶ人向けの入門書です。

目的別の本の選び方を見る

ネットワークの記事を探す