ICMP(Internet Control Message Protocol)その5
目次
ICMPリダイレクトメッセージ
コンピュータのデフォルトゲートウェイの設定次第で、目的のネットワークに対する最適な経路を通らないこともあります。そのような場合、ICMPタイプ5のリダイレクトメッセージで、よりよい経路を通知することができます。
ICMPリダイレクトメッセージの動作
では、具体的に次のネットワークを考えてみます。
10.0.0.0/8のネットワークにコンピュータとルータA、ルータBがいます。さらに、ルータAの向こう側には20.0.0.0/8のネットワーク、ルータBの向こう側に30.0.0.0/8のネットワークがあります。30.0.0.0/8のネットワークには、サーバがいて、30.0.0.1のIPアドレスを持っています。10.0.0.0/8のネットワークにいるコンピュータのIPアドレスは、10.0.0.0/8でデフォルトゲートウェイとしてルータAのIPアドレスが設定されています。
ルータA、ルータBにはスタティックルーティングでもダイナミックルーティングでもなんでもいいのですが、きちんとすべてのネットワークを認識しているものだとします。
たとえば、ルータAのルーティングテーブルは次のようになります。
このようなネットワークでクライアントとサーバの通信を考えてみます。サーバはクライアントとは異なるネットワークにいるので、クライアントはまずデフォルトゲートウェイ、つまるルータAにパケットを送ります。
サーバは30.0.0.0/8のネットワークにいるので、本当はルータAよりもルータBに送るほうがいいのですが、クライアントはどのようなネットワーク構成になっているのかよくわかりません。設定されているデフォルトゲートウェイに送ります。
ルータAはやってきたパケットの送信先アドレスを見てルーティングテーブル照合します。そうすると、30.0.0.0/8はネクストホップがルータBでE0インタフェースから出せばいいことがわかります。で、パケットを次にルータBに中継していくわけですね。
でも、これってすごくムダではありませんか?直接クライアントからルータBに送ってくれればいいものを、わざわざルータAがルーティングをしなければいけません。10.0.0.0/8のネットワークの利用率が高くなるし、ルータAに対しても負荷がかかってしまいます。
こういう最適ではない経路を選んでしまっている場合に、よりよい経路を教えるためにICMPタイプ5リダイレクトメッセージが使われています。
ICMPリダイレクトが出される条件は、パケットが入ってきたインタフェースに再び出力するときです。この例では、ルータAのE0インタフェースにパケットが入ってきました。そして、ルータAがルーティングをしてE0インタフェースを通してルータBに中継しています。同じインタフェースに出力することになってしまったので、効率が悪いルーティングです。そこでクライアントに対して、「30.0.0.1にいくならルータBに送ってね~」ということを通知します。
リダイレクトメッセージを受け取ると
このICMPリダイレクトを受け取ったクライアントは、自分のルーティングテーブルに追加します。これまであまり詳しくお話したことがなかったのですが、コンピュータ自身もルーティングテーブルを持っているんですね。で、次からは30.0.0.1に対してはより効率のいい、ルータBへ送っていくことになります。
ICMPリダイレクトのメッセージの内容が「30.0.0.1」というアドレスなのか、それとも「30.0.0.0/8」というネットワークなのかということは、おそらくルータのICMPの実装によって変わってきているようです。シスコのルータで、実際にこの例のネットワークを構築すると「30.0.0.1」というアドレスで返ってきています。
もしも、違うメッセージの例があるのを見たことがあるという方がいらっしゃればぜひ教えてくださいね。
セキュリティ上の観点から
このようにICMPリダイレクトはより適切な経路を通知するために使われるのですが、セキュリティ上の観点から無効にされることもよくあります。セキュリティを考えると、なるべくネットワークの構成を知られたくないものです。でも、ICMPリダイレクトではルータの存在、ネットワークの存在がわかってしまいます。このようなネットワークの存在、ルータやサーバのIPアドレスなどの情報はクラッカーにとって不正侵入するための情報にもなりかねません・・・