[Network] | ||||||||||||||
不正な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機能であるが、現在ではさまざまなOSやルータなどにDHCPサーバ機能が組み込まれているため、管理者が知らないうちに、誰かが別のDHCPサーバを稼働させてしまう可能性がある。このような、管理されていないサーバのことを「ローグ・サーバ(rogue server、rogueとは「ならず者」とか「ごろつき」などという意味)」と呼ぶことがあるが、ローグDHCPサーバによる影響は非常に深刻である。ほかの種類のサーバと違って、不正なDHCPサーバが稼働していると、クライアント・コンピュータに配布されるIPアドレス情報が間違ったものになり、インターネットや社内のさまざまな場所にあるサーバなどのリソースにアクセスできなくなってしまう可能性が非常に高いからだ。不正なDHCPサーバが稼働していることが分かったら(インターネットなどにアクセスできなくなるなどの症状が出てから初めて気が付くことが多い)、速やかにそのDHCPサーバを見付け、サービスを停止させるなどの処置を行う必要がある。
DHCPのメカニズム
DHCPプロトコルにおけるパケットのやりとりの詳細については、Master of IP Networkフォーラムの「DHCP設定は正しいか?〜DHCP設定の確認と利用〜」などを参照していただきたいが、簡単にまとめると次のようになる。
-
クライアントがブロードキャストを使ってDHCPDISCOVERパケットを送信する。このパケットの中には、クライアントのネットワーク・インターフェイスのMACアドレスが入っている。
-
それを受信したDHCPサーバは、クライアントに割り当てるべきIPアドレスを1つ用意する。MACアドレス・ベースの割り当ての場合は、あらかじめ用意したIPアドレスを使う。そうでない場合は、DHCPの空き領域(DHCPプール)からIPアドレスを1つ選び、ARPリクエストをネットワークに送信して、そのIPアドレスを誰も使っていない(ARPに対する応答がない)ことを確認する。
-
リースするIPアドレスが決まったら、そのIPアドレスをDHCPパケット中に埋め込んで、ブロードキャストでDHCPOFFERを送信する。この2と3の操作は、DHCPDISCOVERを受信したすべてDHCPサーバが行うので、DHCPOFFERは同時に複数のDHCPサーバから送信されることになる。
-
クライアントは、(複数ある場合は)適当なDHCPOFFERを1つ選択し、その要求を使うことを、DHCPREQUESTパケットを使って特定のDHCPサーバに返信する(そのほかのDHCPサーバには応答しない)。DHCPのリース切れに対する更新の場合は、(1〜3を行なわずに)このDHCPREQUESTを送信する。
-
DHCPサーバは、その要求を認める場合はDHCPACKを使ってクライアントに承認を返す。認めない場合は(リースに対する更新など)、DHCPNACKを返す。
このように、DHCPクライアントとDHCPサーバ間では、幾つかのDHCPパケットのやりとりでIPアドレスが割り当てられる。ただしブロードキャスト通信だけでなく、OSや環境によってはユニキャスト通信が使われることもあるので、スイッチング・ハブなどを導入していると、そのやりとりのすべてを外部からキャプチャして観察することはできない。例えばWindows 2000では、4と5ではユニキャスト通信が使われている。
設定方法 |
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アドレスを指定 |
表示されている各行の内容は、左から順番に、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、「TIPS―IPアドレスからホスト名を見付ける方法」などの手法を駆使して実際のDHCPサーバとなっているホストを見付ければよいだろう。
なお、ここで表示されるDHCPサーバのIPアドレスは、DHCPパケットの中のサーバIPアドレス・フィールドに含まれるデータを表示しているようである。実際には、このDHCPパケットは下位のUDPパケットのペイロード(データ部分)として送信されており、そのUDPは、さらに下位のIPパケットのペイロードとして送信されている。送信元のサーバのIPアドレスは、このIPパケットのヘッダ中にも含まれているので、DHCPサーバのコンフィグレーションが間違っていたりすると、この2つの「サーバIPアドレス」が不一致となる可能性がある。このような場合は、表示されたIPアドレスのコンピュータを調べてみても、DHCPサービスが動作していない可能性がある。この場合は、次の方法を使って、より正確にDHCPパケットの内容を調べなければならない。
パケットのキャプチャによる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アドレスの両方を見ることができるので、この方法なら、両者が一致していないというような、非常にやっかいなトラブルも見付けることができる。
関連記事(Windows Server Insider) | ||
![]() |
Windows TIPS―IPアドレスからホスト名を見付ける方法 | |
この記事と関連性の高い別の記事
- DHCPリレー・エージェントを使う(TIPS)
- DHCPサーバを冗長構成で運用する方法(TIPS)
- DHCPのスコープを分割して冗長構成にする(Windows Server 2008 R2編)(TIPS)
- DHCPによる未許可クライアントへのIP割り当てを禁止する(TIPS)
- DHCPサーバのスコープ・オプションを追加定義する(TIPS)
- Windowsでは、DHCPによるIPアドレスの切り替え時に、いったん解放してから再割り当てする(TIPS)
- 破損したDHCPデータベースを復元する(Windows Server 2003編)(TIPS)
- Windows VistaでDHCPサーバからIPアドレスが取得できない不具合を解消する(TIPS)
- Hyper-Vの内部ネットワークでDHCPを利用する(TIPS)
- DHCPサーバの構成情報をバックアップ/移行する(TIPS)
このリストは、デジタルアドバンテージが開発した自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。

![]() |
「Windows TIPS」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
![]() |
|
|
|
![]() |