1 はじめに
本記事は、自分の備忘録として、
ICMP(Internet Control Message Protocol)について、調べた結果をまとめたものです。
実は自分のたてたメールサーバーなのですが、
このメールサーバーで中継しようとする不正アクセスがとっても多い。
それでファイアウォールでSMTPのポートを閉じたのですが、
その後ICMPのパケットが流れるようになりました。
ファイアウォールで閉じたはずのポートにSMTPの接続要求が入り、
その後ICMPパケットが流れる。
不正アクセス者が、またなにか悪さを企んでいるのではないか?と思い、
それでICMPについて調べたというのが経緯なのです。
2 ICMPプロトコル
2.1 ICMPとは?
ICMP(Internet Control Message Protocol)は、
IPプロトコルの「エラー通知」や「制御メッセージ」を転送するためのプロトコルです。
TCP/IPが実装されたコンピュータ間で、通信状態を確認するために使用されます。
ICMPはインターネット層(OSI参照モデルのネットワーク層)で動作するプロトコルです。
IPプロトコルはIPデータグラムの送受信を行うプロトコルですが、
処理がエラーとなってしまった場合など、結果の詳細を報告する機能は実装されていません。
ICMPは、
IPの代わりに通信の疎通状態や処理エラーを報告するといった、IPの補助として動作します。
★ IP通信の疎通状態を確認する
送信先IPアドレスを指定して
ICMPデータを含んだIPデータグラム(Echo Message)を送信します。
送信先で受け取ると、
送信元と送信先のアドレスやタイプ、チェックサムを書き換えて返信します。
この返信が送信元に到着することで、送信先は送信元との疎通状態を判断できます。
★ 問題があるときにエラー情報を送る
IPデータグラムの処理でエラーが発生した時に、その詳細な原因を送信元に通知します。
具体的な原因の例として、
送信先のネットワークやホストに到着できない、
指定されたポート番号に接続できない、
パケットが分割できない、TTL(Time To Live)を超えてしまった
などがあります。
送信元がこれらのエラーを受け取ることで、なぜ疎通できないかの理由が判断できます。
2.2 ICMPパケットのフォーマット
ICMPは、ネットワーク層で動作するとはいえ、
図2.2-1に示すようにTCPやUDPと同じレベルに位置しており、
それぞれ異なるプロトコル番号を与えられています(ICMPは1番、TCPは6番、UDPは17番)。
ICMPのパケットは、IPパケットを使って送信されます。
IPヘッダーの後ろにICMPヘッダーとデータ部が付与される形となります。
【図参照】TCP/IP - ICMP
ICMPパケットには、その機能によって何種類かのパターンがあります。
基本的な構造は、表2.2-1に示すようになっています。
2.3 ICMPメッセージの構造
2.3.1 ICMPのメッセージ
ICMPメッセージは、大きく以下の2種類のメッセージ分けられます。
Query
「問い合わせ」用のメッセージです。
監視サーバーからこのメッセージを監視するノードに対して送信し、通信状態を確認します。
Error
監視サーバーから監視するノードにテストパケットを送付した際、
経路の途中でパケットが破棄された場合に発せられるメッセージです。
また、破棄の原因も併せて知らせてくれます。
2.3.2 ICMPのタイプとコード
ICMPにはTCPやUDPのようなポート番号は存在しません。
代わりに、表2.3-1に示すようなタイプとコードにより、
メッセージに役割や意味を持たせています。
3 よく使われるICMPメッセージの詳細
本章では、よく利用される下に示すICMPメッセージについて、もっと突っ込んでみます。
(1) タイプ8/0: ICMPエコー要求/エコー応答
(2) タイプ3: 宛て先不達
(3) タイプ5: ICMPリダイレクト
(4) タイプ11: ICMP時間超過
3.1 タイプ8/0: ICMPエコー要求/エコー応答
「ICMPエコー」は、指定されたエコー・データ・パケットを、
2つのTCP/IPノード間で送受信するためのメッセージです。
ICMPエコーの送信元が送ったデータ・パケットが相手のノードに届くと、
そのデータがそっくりそのまま元のノードへと送り返されてきます。
この応答操作ではアプリケーションは介在せず、
TCP/IPのプロトコル・スタック自身が応答処理を行います。
パラメーターとなるデータをそのまま送り返すので「エコー」と呼ばれており、
TCP/IPのプロトコル・スタックが稼働しているかどうかを調べるために使われます。
TCP/IPをサポートしているノードは必ずこの機能を実装することが求められており、
ノードの動作状態を調査するためには欠かせない機能となっています。
一般ユーザーが利用するpingコマンドは、このICMPエコー機能を使って実現されています。
先頭にある「タイプ」フィールドには「エコー要求(8)」か「エコー応答(0)」が
セットされます。
最初にエコー要求を出す方が、
タイプ・フィールドに「エコー要求(8)」をセットしてパケットを送信し、
受信した側では、タイプを「エコー応答(0)」に変えて元のパケットをそのまま返信します。
コード・フィールドは、このICMPメッセージでは使用されません(0が入っている)。
「ID」と「シーケンス番号」は、
ICMPエコー・メッセージを利用するアプリケーションが自由に利用できるフィールドです。
通常は、エコー・メッセージを送信する側において、
送信したパケットを一意に識別できるような数値をセットします。
エコー・メッセージでは、
これらのフィールドの内容もそのまま変更せずにパケットを送り返すため、
受信した側でこれらのフィールドの内容を調べることにより、
どのエコー要求に対する応答であるかを識別することができます。
同時に複数の要求パケットを送信して、その応答時間が大きくずれているような場合とか、
同時に複数のユーザーがpingコマンドを実行した場合でも、
パケットを送信するたびに異なる値をセットしておくことで、
どの要求パケットに対する応答であるかが分かるようになります。
3.2 タイプ3: あて先不達
タイプ3のメッセージは、
何らかの理由であて先となるサービスへパケットを送ることができない場合に、
送信元に対して送り返されるエラー・メッセージです。
たとえば、
特定のTCPやUDPポートに向けて送られた通信要求に対して、
下に示すようなエラーを伝えるために利用されます。
・ ポートをリッスン(待ち受け)しているサービスがない
・ IPフラグメンテーションが必要にもかかわらず、
IPパケット中の「フラグメント禁止bit(DF bit)」がセットされていて、
その先へパケットをルーティング(フォワード)することができない
ICMPのヘッダー中にある「コード」部分には、
エラーの要因を表す数値がセットされ、送信されます。
表3.2-1に示すようなエラー要因があります。
3.3 タイプ5: ICMPリダイレクト
タイプ5のメッセージは、ルーティングに関する情報を伝えるためのICMPメッセージです。
IPパケットの送信先が適切でない場合に、ルーターによって送信元に返信されることがあります。
このメッセージは、ルーターでしかサポートされていないメッセージです。
以下に、「ICMPリダイレクトによるルーティングの変更」の例を示します。
① PC2に送信するべきIPパケットをデフォルト・ゲートウェイであるルーター1に送信する。
②
より適切なルートであるルーター2の存在をPC1にICMPリダイレクト・メッセージで返す。
PC1ではこれにより、動的にルート情報を更新する。
②'
受け取ったパケットは、代理でルーター2に送信しておく。
このため通信が途絶えることはない。
③
一度ICMPリダイレクトを受け取ると、
PC2に対する動的なルートが定義され、以後は直接ルーター2へ送信されるようになる。
そして動的ルート・エントリの寿命が尽きると、またルーター1へ送られ、
ICMPリダイレクトを受け取るとまたルート情報が更新される。
3.4 タイプ11―ICMP時間超過
タイプ11のメッセージは、ルーティングの途中で、時間(回数)が超過してしまった場合に、
IPパケットの送信元に対して返信されるICMPメッセージです。
このメッセージが生成される要因は2つあります。
1つは、IPヘッダー中のTTLが0になってしまった場合です。
IPヘッダー中には、TTLというフィールドがあり、
ルーターによってパケットがフォワードされるたびに1ずつ減算されます。
このTTL値が0になると、そのIPパケットは破棄され、 IPパケットが無限にルーティングされるのを防いでいます。
そのとき、同時に元の送信元に対してICMPの時間超過メッセージが送られ、
送信元では、パケットが経路の途中で破棄されたことを知ることができます。
もしこのメッセージが返されないとすると、
パケットが相手まで届いたかどうかを知ることが困難になるでしょう。
ルーターによって破棄されたか、
それとも相手からの応答が遅れているのかを区別するのが難しくなます。
ちなみに、tracertコマンドは、
このメッセージを受信することによって、
パケットがどこまで届いたかを調べるようになっています。
以上
HTMLだと、
思うように編集することは難しく、やろうすればとっても時間が掛かります。
ですので、本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
役に立てていただければ、うれしく思います。
このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元と著者名は明らかにしてください。
なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。