不正なDHCPサーバを見つけるTech TIPS

クライアントコンピュータのTCP/IPの設定を行うためには、現在ではDHCPサービスを使うのが一般的である。管理者が意図しないDHCPサーバが稼働していると、さまざまなネットワークトラブルの原因となる。不正なDHCPサーバを見つけるためには、dhcplocコマンドを使うか、ネットワークパケットをキャプチャして解析する。

» 2003年03月15日 05時00分 公開
「Tech TIPS」のインデックス

連載目次

不正なDHCPサーバを見つける

対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition、Windows 2000 Server/Windows 2000 Advanced Server


広く普及しているネットワークプロトコル「DHCP」とは?

 TCP/IPネットワークの設定を行う場合、IPアドレスネットマスクデフォルトゲートウェイDNSサーバなどのパラメータをホストごとに正確にセットする必要がある。Windowsクライアントなら、さらにWINSサーバや(DNSの)ドメイン名なども設定しなければならないかもしれない。

 このような作業を簡単に、そして確実に行うために、現在ではDHCPというネットワークプロトコルが開発され広く普及している。ネットワーク上にDHCPサーバを1台用意しておくと、クライアントとなるコンピュータは、起動時にDHCPサーバに問い合わせて自分自身のIPアドレスを決定し、さらに必要ならばDNSサーバやデフォルトゲートウェイ、WINSサーバなどのアドレス情報も自動的に取得して、TCP/IPプロトコルスタックの設定を行う。どのクライアントにどのIPアドレスを割り当てるかといった細かいことを気にせずに、管理者はネットワーク上の各コンピュータの設定を済ませることができる。

 現在では、Windows 2000 ServerのようなサーバOSだけでなく、個人用の非常に安価なルータブロードバンドルータISDNダイヤルアップルータ)でもこのDHCPサーバ機能を装備している。ルータだけでなく、Windows OSなどに用意されているネットワーク共有機能でも、DHCPによってクライアントにIPアドレスなどの情報を配布している。このように、現在ではDHCPなしのネットワーク運用は考えられないほど、あたりまえのように使われている。

「ローグサーバ」と呼ばれる不正なDHCPサーバ

 このようにDHCP機能は非常に便利なので、現在ではさまざまなOSやルータなどにDHCPサーバ機能が組み込まれている。そのため、管理者が知らないうちに、誰かが別のDHCPサーバを稼働させてしまう可能性がある。このような、管理されていないサーバのことを「ローグサーバ(rogue server、rogueとは「ならず者」とか「ごろつき」などという意味)」と呼ぶことがある。

 このローグDHCPサーバによる影響は非常に深刻である。ほかの種類のサーバと違って、不正なDHCPサーバが稼働していると、クライアントコンピュータに配布されるIPアドレス情報が間違ったものになり、インターネットや社内のさまざまな場所にあるサーバなどのリソースにアクセスできなくなってしまう可能性が非常に高いからだ。

 不正なDHCPサーバが稼働していることが分かったら(インターネットなどにアクセスできなくなるなどの症状が出てから初めて気が付くことが多い)、速やかにそのDHCPサーバを見付け、サービスを停止させるなどの処置を行う必要がある。

DHCPのメカニズム

 DHCPプロトコルにおけるパケットのやりとりを簡単にまとめると、次のようになる(詳細はMaster of IP Networkフォーラムの「DHCP設定は正しいか?〜DHCP設定の確認と利用〜」などを参照していただきたい)。

  1. クライアントがブロードキャストを使ってDHCPDISCOVERパケットを送信する。このパケットの中には、クライアントのネットワークインターフェイスのMACアドレスが入っている。
  2. それを受信したDHCPサーバは、クライアントに割り当てるべきIPアドレスを1つ用意する。MACアドレスベースの割り当ての場合は、あらかじめ用意したIPアドレスを使う。そうでない場合は、DHCPの空き領域(DHCPプール)からIPアドレスを1つ選び、ARPリクエストをネットワークに送信して、そのIPアドレスを誰も使っていない(ARPに対する応答がない)ことを確認する。
  3. リースするIPアドレスが決まったら、そのIPアドレスをDHCPパケット中に埋め込んで、ブロードキャストでDHCPOFFERを送信する。この2と3の操作は、DHCPDISCOVERを受信したすべてDHCPサーバが行うので、DHCPOFFERは同時に複数のDHCPサーバから送信されることになる。
  4. クライアントは、(複数ある場合は)適当なDHCPOFFERを1つ選択し、その要求を使うことを、DHCPREQUESTパケットを使って特定のDHCPサーバに返信する(そのほかのDHCPサーバには応答しない)。DHCPのリース切れに対する更新の場合は、(1〜3を行なわずに)このDHCPREQUESTを送信する。
  5. DHCPサーバは、その要求を認める場合はDHCPACKを使ってクライアントに承認を返す。認めない場合は(リースに対する更新など)、DHCPNACKを返す。

 このように、DHCPクライアントとDHCPサーバ間では、幾つかのDHCPパケットのやりとりでIPアドレスが割り当てられる。ただしブロードキャスト通信だけでなく、OSや環境によってはユニキャスト通信が使われることもあるので、スイッチングハブなどを導入していると、そのやりとりのすべてを外部からキャプチャして観察することはできない。例えばWindows 2000では、4と5ではユニキャスト通信が使われている。

方法その1――「dhcploc.exe」でDHCPサーバを検出する

 Windows 2000のリソースキットに含まれるdhcploc.exeというツールを使うと、DHCPサーバ(が送信するパケット)を検出することができる。リソースキットとは、Windows 2000に対する技術情報などを網羅した書籍で、各種のツール類をまとめたCD-ROMが付属している(リソースキットについてはこちらの書評を参照)。Server版とWorkstation版のいずれのCD-ROMでもdhcploc.exeというツールが収録されている。

 Windows XP Professional/Home Editionの場合は、インストールCD-ROM中にあるサポートツール(\SUPPORT\TOOLSフォルダ参照)の1つとして用意されているので、これらのツール(Windows Support Tools)をインストールすればよい(ただし何度か実験したところ、手元のWindows XP上では動作が不安定なことがあった。幾つかのプラットフォーム上で実験して利用していただきたい)。

 dhcploc.exe(DHCP Server Locator Utility)は、DHCPサーバが送信するパケットをキャプチャして表示するためのコマンドである。ほかのクライアントが出すDHCP要求とそれに対するDHCPサーバの応答を表示するだけでなく、自分自身でダミーのDHCP要求を送信して、それに対するDHCPサーバの応答を表示させることもできる。

 このツールは、コマンドプロンプト上で実行する。引数としては自分自身のコンピュータに付けられているIPアドレスを指定する(複数のインターフェイスを持つコンピュータにおいて、どのインターフェイス上で動作するかを限定させるためであろう)。

 このコマンドを実行すると、指定されたインターフェイス上でDHCPのパケットが受信されるのを待つ状態に入る。DHCPによる通信が行われなければ何も表示されない。これは正常な動作である。ただし「d」と「q」の2文字のキー入力だけは受け付ける。もしそれ以外のキー(スペースキーなど)を押すと、非常に簡単なヘルプメッセージが表示される。

 「d」キーを押すとDHCPのダミー要求が送信され、「q」キーを押すとプログラムが終了する。

 コマンドの動作中は、以下のように、DHCPの通信を受信した時間とその内容が表示される。

C:\>dhcploc 192.168.2.104  ……引数には自ホストのIPアドレスを指定
Type d - to discover; q - to quit; h - for help.  ……ヘルプメッセージ
18:38:39    OFFER (IP)192.168.2.180   (S)192.168.2.59    ***  ……受信したDHCPパケット
18:38:39      ACK (IP)192.168.2.180   (S)192.168.2.59    ***
18:42:09      ACK (IP)0.0.0.0         (S)192.168.2.59    ***
18:49:17      ACK (IP)0.0.0.0         (S)192.168.2.59    ***
18:49:21    OFFER (IP)192.168.2.117   (S)192.168.2.11    ***
18:49:21      ACK (IP)192.168.2.117   (S)192.168.2.11    ***
18:49:33      ACK (IP)0.0.0.0         (S)192.168.2.59    ***
18:49:41      ACK (IP)0.0.0.0         (S)192.168.2.59    ***
18:50:07    OFFER (IP)192.168.2.181   (S)192.168.2.59    ***
18:50:07      ACK (IP)192.168.2.181   (S)192.168.2.59    ***
18:50:07    OFFER (IP)192.168.2.129   (S)192.168.2.11    ***
19:53:07      ACK (IP)0.0.0.0         (S)192.168.2.59    ***
19:53:23      ACK (IP)0.0.0.0         (S)192.168.2.59    ***
19:54:41      ACK (IP)192.168.2.187   (S)192.168.2.59    ***
19:54:41     NACK (IP)0.0.0.0         (S)192.168.2.11    ***
19:54:41      ACK (IP)192.168.2.182   (S)192.168.2.59    ***
19:54:41     NACK (IP)0.0.0.0         (S)192.168.2.11    ***
……最後にqキーを押すと終了する



 表示されている各行の内容は、左から順番に、DHCPメッセージを受信した時刻、DHCPのメッセージの種類、DHCPクライアントのIPアドレス、DHCPサーバのIPアドレスなどとなっている。

 OFFERやACK、NACKなどは、DHCPでやりとりされるメッセージの種類である。ただし、すべてのDHCPのやりとりが表示されるわけでもないし(DHCPのクライアント側からの初回要求や、DHCPのリースの更新などは見えない)、最近ではスイッチングハブなどの普及により、ほかのホストとDHCPサーバ間のやりとりがすべて見えるわけでもないので(ブロードキャストアドレスあてのパケットのみが見える)、あまり気にすることはないだろう。

 クライアント側のIPアドレスは、DHCPで割り当てられる前は不定なので0.0.0.0と表示されることもある。

 前出の例では、「(S)192.168.2.11」とか「(S)192.168.2.59」などと表示されているのが、DHCPサーバのIPアドレスである。DHCPサーバを見つけるためには、これに注目する。つまり、このネットワークには、「192.168.2.11」と「192.168.2.59」という2台のDHCPサーバが存在しているということが分かる。

 IPアドレスが分かれば、あとはDNSの逆引きやtelnet、Tech TIPS「IPアドレスからホスト名を見つける方法」などの手法を駆使して実際のDHCPサーバとなっているホストを見付ければよいだろう。

 なお、ここで表示されるDHCPサーバのIPアドレスは、DHCPパケットの中のサーバIPアドレスフィールドに含まれるデータを表示しているようである。実際には、このDHCPパケットは下位のUDPパケットのペイロード(データ部分)として送信されており、そのUDPは、さらに下位のIPパケットのペイロードとして送信されている。送信元のサーバのIPアドレスは、このIPパケットのヘッダ中にも含まれているので、DHCPサーバのコンフィグレーションが間違っていたりすると、この2つの「サーバIPアドレス」が不一致となる可能性がある。このような場合は、表示されたIPアドレスのコンピュータを調べてみても、DHCPサービスが動作していない可能性がある。

 この場合は、次の方法を使って、より正確にDHCPパケットの内容を調べなければならない。

方法その2――パケットのキャプチャでDHCPサーバを検出する

 DHCPプロトコルによるパケットのやりとりは、(一部を除き)ブロードキャストが使われているので、たとえスイッチングハブなどが使われている環境でも、パケットをキャプチャして解析することができる。Windows 2000 Serverに用意されているネットワークモニタを使えばよいだろう。

 ただしネットワークモニタでは、先のdhcploc.exeのように、DHCPのパケットを生成して送信することはできないので、少々手順が異なる。だれかがDHCPパケットを送信するまでずっとキャプチャし続けるか、手っ取り早くは、どこかのWindowsコンピュータ上で「ipconfig /release」と「ipconfig /renew」を実行してDHCPパケットを生成させればよい。「ipconfig /renew」だけだと、(Windowsの場合は)DHCPクライアントとDHCPサーバ間のユニキャスト通信になるので、スイッチングハブが導入されていると、キャプチャすることができない。必ずいったんIPアドレスを解放(/release)してから、再割り当て(/renew)させよう。

 ネットワークモニタによるDHCPパケットの解析は、慣れてくれば非常に便利で手っ取り早い。パケットの構造などもよく分かるし、どのようなパケットがやりとりされているかも簡単に見ることができる(DHCPで配布するIPアドレスが重複しないように、ARPプロトコルが使われている。そのパケットもキャプチャできる)。

 また、DHCPパケットの中にあるサーバIPアドレスと、IPパケットの送信元IPアドレスの両方を見ることができるので、この方法なら、両者が一致していないというような、非常にやっかいなトラブルも見つけることができる。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。