Windows TIPS
[Network] |
ICMPリダイレクト使用時のファイアウォール設定に注意
→ 解説をスキップして操作方法を読む
デジタルアドバンテージ 打越 浩幸
2005/09/10 |
|
対象OS |
Windows XP |
Windows Server 2003 |
|
|
|
■ |
例外的なルート情報を追加するには、各クライアント・コンピュータ上で作業をする必要があり、面倒である。 |
■ |
だがICMPリダイレクト・メッセージを受信すると、動的なルーティング・エントリが作成され、一時的にルーティング情報が利用可能になるので、これを利用するとよい。 |
■ |
Windowsファイアウォールのデフォルト設定では、ICMPリダイレクト・メッセージの受信が拒否されるようになっている。 |
■ |
ICMPリダイレクトの受信を許可するには、ファイアウォールの設定を変更する。 |
|
|
TCP/IPの設定では、必ず「デフォルト・ゲートウェイ」と呼ばれるパラメータをセットしなければならない。デフォルト・ゲートウェイとは、デフォルトのルートとして利用されるゲートウェイのIPアドレスであり、ローカルのネットワーク上に存在しないホストへ到達する場合は、必ずこのゲートウェイが利用される。
ICMPリダイレクトで一時的なルート変更を行う
ところで組織内に別のネットワークを増設した場合、都合により、デフォルト・ゲートウェイではなく別のゲートウェイを経由しなければならないことがある。このようなネットワークでは、例えばrouteコマンドを使ってコンピュータごとに個別のルート情報を設定したり、動的なルーティング情報を受け取る「RIPリスナ」(Windows OSのネットワーク・オプション・コンポーネントの1つ)をインストールしたりする作業が必要となる。
だがこれらの作業をすべてのコンピュータに対して行うのは手間がかかるので、できることならばクライアントの設定をまったく変更したくないことも少なくない。このような場合、もし新しいネットワーク上のコンピュータの数が少なければ「ICMPリダイレクト(ICMP Redirect)」メッセージ機能を利用するという方法がある。ICMPはTCP/IPプロトコルにおける補助プロトコルの1つで、ICMPリダイレクトを使うと、一時的にルーティング先を切り替えることができる。例えば次の図を見ていただきたい。
|
ICMPリダイレクトによるルーティングの変更 |
一般的には、ローカル・セグメントあて以外のパケットは、すべてデフォルト・ゲートウェイ(ここではルータ1)に送信する。だがPC2あてのパケットはルータ2へ送らなければならない。ルータが受信したIPパケットについて、より適切なルート(この場合はルータ2)があるならば、その存在を送信元(PC1)に対して、ICMPリダイレクト・メッセージを使って通知する。PC1ではそのメッセージを受け取り、PC2あてのルート情報を動的に更新する。以後は、PC2あてのパケットは直接ルータ2に送信される。このルート情報は動的であり、デフォルトでは10分で削除される。なお、以上の機能が正しく働くためには、ルータ1やルータ2は、お互いのネットワークの存在を知っていて、正しくルーティング情報が設定されている必要がある。また、ICMPリダイレクト・メッセージの送信が各ルータで許可されている必要がある(このメッセージはルータのみが送信する)。 |
|
|
PC2に送信するべきIPパケットをデフォルト・ゲートウェイであるルータ1に送信する。 |
|
|
より適切なルートであるルータ2の存在をPC1にICMPリダイレクト・メッセージで返す。PC1ではこれにより、動的にルート情報を更新する。 |
|
’ |
受け取ったパケットは、代理でルータ2に送信しておく。このため通信が途絶えることはない。 |
|
|
一度ICMPリダイレクトを受け取ると、PC2に対する動的なルートが定義され、以後は直接ルータ2へ送信されるようになる。そして動的ルート・エントリの寿命が尽きると、またルータ1へ送られ、ICMPリダイレクトを受け取るとまたルート情報が更新される。 |
|
あるネットワーク上にコンピュータ「PC1」が存在し、デフォルト・ゲートウェイは「ルータ1」に設定されている。「ルータ2」は増設した新しいネットワークであり、この先に通信したいコンピュータ「PC2」が存在しているものとする。そしてルータ1はルータ2の存在を知っているとする(つまり、ルータ1のルーティング・テーブルには、ルータ2/PC2へのルーティング情報が設定されている)。
この状態でPC1からPC2へ通信しようとすると、パケットはまずルータ1へ送られる()。だがPC2はルータ1の配下にはないので、そのままでは直接送信することはできない。そこで受信したパケットをルータ2へ代行で転送するとともに(’)、PC1に対しては「ICMPリダイレクト」のパケットを送信する()。この中には、「PC2へのゲートウェイ(ルータ)はルータ2である」というルーティング情報が含まれており、PC1はこれを見て、自分自身のルーティング・テーブルにPC2へのルート情報を追加する。以後PC1は、新しく追加されたルーティング情報に基づいて、PC2へパケットを送信する場合は、直接ルータ2へ送信することができる()。
このようにICMPリダイレクトを利用すると、最初に1回余計なパケットが送受信されるが、以後は正しいルート情報に基づいて通信が行われるようになる。ただしこのルート情報は動的なものであり、一定時間(Windows OSのデフォルトでは10分)経過すると自動的に削除されるが、その場合はまたICMPリダイレクト・メッセージが送信され、ルート情報が更新される。また、これによって通知されるルート情報は、1ホストごとに1エントリずつ作成されるので、リダイレクト先のホストが多い場合には非効率な方法であるが(数百もあるようなら、ネットワークの構成やルートを再設計すべき)、一時的なネットワークや、例外的なネットワークを使用する場合には、問題なく利用できる。
なお、逆方向のルート(PC2からPC1への戻りパケット)に関しては、ルータ2からPC1へ直接送られるため問題とはならない。またICMPリダイレクトを処理しないクライアントがいたとしても、送信したパケットはルータが代理でルーティング処理しているので、相手に届かないということはない(つまり、少し遅くなるかもしれないが、通信可能ということ)。
WindowsファイアウォールとICMPリダイレクト・メッセージ
ICMPで送受信されるメッセージは、通常はアプリケーション・レベルで関知することはできず、TCP/IPのプロトコル・スタックが必要に応じて自動的に送受信している。だがWindowsファイアウォールを利用していると、デフォルトではこのICMPメッセージは受信せず、ドロップするようになっている。
つまりPC1でWindowsファイアウォールを有効にしていると、で送信されたICMPリダイレクト・メッセージを受け取れないということである。ということは、PC1にとっては、PC2に対するパケットの送信先は常にルータ1になったままであり、ルータ2に切り替わることはない。
この結果、PC1からPC2に送信するパケットは、常に最初に必ずルータ1へ送られ、そこで再ルーティングされて今度はルータ2へと向かうことになる。これらのパケットは同じネットワーク・セグメントを経由するため、結局、ネットワークのトラフィックは2倍になるし、余計なICMPリダイレクト・メッセージも送信される(PC1からPC2へ1つIPパケットを送信するたびに、1つICMPリダイレクト・メッセージが送信される)、ルータや各クライアントの負荷も高くなる、という事態が起こる。もしファイアウォールのログ(ドロップしたパケットのログ)を採取するように設定していれば、おびただしい数のログ・エントリが作成されることになる。実際には次のようなログが記録されることになる。
pfirewall.logの例(部分)
2005-09-01 13:08:44 DROP ICMP 192.168.1.56 192.168.1.155 - - 56 - - - - 5 1 - RECEIVE
2005-09-01 13:08:44 DROP ICMP 192.168.1.56 192.168.1.155 - - 56 - - - - 5 1 - RECEIVE
2005-09-01 13:08:44 DROP ICMP 192.168.1.56 192.168.1.155 - - 56 - - - - 5 1 - RECEIVE
※192.168.1.56(ルータ)からICMPのリダイレクト・メッセージ(5)を受信/ドロップしたというメッセージ。 |
このように、ICMPリダイレクトが利用される環境では、ファイアウォールをデフォルトのまま利用するといろいろと不都合が多いので、可能ならばICMPリダイレクトを許可するように設定しておこう。
WindowsファイアウォールでICMPリダイレクトの受信を許可するには、ファイアウォールのICMP設定を変更する。
手動によるICMPリダイレクトの許可設定
まずWindowsファイルの設定画面を表示させ([コントロール パネル]の[Windows ファイアウォール]を実行する)、[詳細設定]タブを選択する。
|
WindowsファイアウォールにおけるICMP設定 |
ICMPの設定は2カ所ある。Windowsファイアウォール全体で有効にするか、インターフェイスごとに有効にするかを選択できる。 |
|
|
個別のインターフェイスごとに設定する場合はこれを選択し、[ICMP]タブで以下の設定を行う。 |
|
|
Windowsファイアウォール全体で有効にする場合はこちらで設定する。 |
|
この画面のうち、[ICMP]グループにある[設定]ボタンをクリックするか、[ネットワーク接続の設定]でインターフェイスを選択してから[設定]ボタンをクリックする。前者は全インターフェイスでICMP設定を変更するためのものであり、後者は特定のインターフェイスでのみ有効にするための機能である。どちらで設定してもよいが、インターネットに直接接続しているネットワーク・インターフェイスでは安全のために無効にしておき、ローカルのネットワーク・インターフェイスでのみ有効にするとよいだろう。
[設定]ボタンをクリックすると次の画面が表示されるので、一番下から2番目にある[リダイレクトを許可する]のチェック・ボックスをオンにすればよい。
|
ICMPリダイレクトの許可 |
ICMPのサブメッセージごとに送受信を許可するかどうかを設定する。デフォルトではすべて無効になっている(ただし実際には、この設定にかかわらず処理されるメッセージがいくつかある)。 |
|
|
ICMPリダイレクトの着信を許可するにはこれをオンにする。 |
|
グループ・ポリシーによるICMPリダイレクトの許可設定
ドメイン内の各クライアントのファイアウォール設定をまとめて変更するには、グループ・ポリシーを使ってもよい。ICMPの設定を変更するグループ・ポリシー・オブジェクトに対して、次のように設定する。
|
グループ・ポリシーによるICMPリダイレクトの許可 |
グループ・ポリシーを利用すると、ドメイン内のクライアントをまとめて制御できる。ICMPに関する設定は、[管理用テンプレート]−[ネットワーク]−[ネットワーク接続]−[Windows ファイアウォール]にある[ドメイン プロファイル]か[標準プロファイル]で行う。 |
|
|
ドメイン・プロファイルを利用する場合はこれを選択する。 |
|
|
ICMPの設定はこれで行う。 |
|
|
デフォルトでは未構成となっている。 |
|
|
[有効]を選択する。 |
|
|
ICMPリダイレクトの着信を許可するには、これを選択する。 |
|
|
これはICMPエコーの着信の設定。これはpingコマンドで利用されているICMPメッセージであり、ネットワークを管理するためには有効にしておいた方が望ましい。 |
|
ICMPリダイレクトの動作の確認
ICMPリダイレクト・メッセージを受け取って、正しく動作しているかどうかを確認するには、例えばルーティング・テーブルを表示させてみればよい。「ping 10.20.1.1」のようなコマンドを実行してICMPリダイレクト・メッセージを受信させ、その後「route print」コマンドで結果を見てみる。
C:\>route print …ルーティング・テーブルの表示
=======================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x2 ...00 10 dc 3b f2 00 ...... Intel(R) PRO/100 VE Network Connection - パケット スケジューラ ミニポート
=======================================================
=======================================================
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.56 192.168.1.155 20 …デフォルト・ルート
10.20.1.1 255.255.255.255 192.168.1.15 192.168.1.155 1 …追加された動的ルート
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1
192.168.1.0 255.255.255.0 192.168.1.155 192.168.1.155 20
…(以下省略)… |
ルート情報のうち、あて先が指定したIPアドレス、ネットマスクが255.255.255.255となっているエントリがICMPリダイレクトによって動的に追加されたエントリである。あて先IPアドレスごとに1エントリずつ作られる。そのまま何も通信しないでいると、10分程度で消滅することが分かるだろう。
また受信したICMPリダイレクト・メッセージのパケット数は、netstat -sコマンドで確認することができる。この値が0以外なら、正しく受信していることになる。
C:\>netstat -s -p icmp …ICMP統計情報の表示
ICMPv4 Statistics
Received Sent
Messages 766 768
Errors 0 0
Destination Unreachable 1 1
Time Exceeded 0 0
Parameter Problems 0 0
Source Quenches 0 0
Redirects 3 0 …ICMPリダイレクトの数
Echos 11 756
Echo Replies 751 11
Timestamps 0 0
Timestamp Replies 0 0
Address Masks 0 0
Address Mask Replies 0 0 |
Windows Server Insider フォーラム 新着記事