DHCP サーバ ブラックリスト

Windows 2003 のDHCPサーバで、特定の機器にはアドレスを払い出したくない場合ですが、複数のネット情報で Callout DLL というフリーソフトを使え、とあります。

たとえばここ。
http://naonao71.wordpress.com/2009/02/27/dhcp-server%E3%81%A7mac%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%86/

Microsoft の開発スタッフが関わっているが、フリーソフト扱いで公式サポートはないよ、ということだそうです。
English Build 以外では動かないかもという弱気なコメントもありますが、とりあえずは動作します。

で、今回はNOLISTを作ってやれば目的が達せられそうです。

なお、2008R2では標準でこの機能が搭載されます。移行の際は、手作業はありえないので移行ツールが用意されているようです。

http://blogcastrepository.com/blogs/external_news/archive/2010/03/26/mac.aspx
http://blogs.technet.com/windowsserverjp/archive/2010/03/26/3320612.aspx

さて、callout dll のアーカイブを展開すると x86版と x64版があるので、適合した方のMSIファイルをダブルクリックする。

使用許諾条件に応答するとインストールはあっという間に終了。

インストールに成功するとレジストリに設定が入る。pathは "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DHCPServer\Parameters"の中になる。

Callout〜というやつが該当するものすべて。それ以外の項目はない。

レジストリ

レジストリ値を見ると CallOutEnabled が 1 になっているので、「次回DHCPサーバが起動されたときには有効」になる設定にすでになっている。

インストールされると、%systemroot%\system32\dhcp の中にファイルが3つ生成される。

3つのファイル

MacFilterCalloutErrorLog.txt … たぶん DLL がロードできなかったとかシステム的なエラーログ。
MacFilterCalloutInfolog.txt … 排除したログ。後述
MACList.txt … 設定ファイル。

以下のファイルがサンプルでインストールされた。このMACアドレスはすでにリース済みのものでもなく、自分のMACでもなく謎。

謎のサンプル

このファイルを編集する。管理するホストの台数が少なければMAC_ACTIONは ALLOW の方がよいが、今回はNOLISTを作るので DENY にして、IPを渡さない端末のMACを並べ立てる。行頭に # を入れればコメントとして無視される。ただし English Build以外云々という話もあるので、日本語のコメントはやめたほうがよいでしょう。

たとえばこんな感じ

MAC_ACTION={DENY}
0017****6325

注意事項

サンプルファイルでの MACアドレスの記述方法は IPCONFIGコマンドの出力と同じ形式になっているが、
この形式では callout は正しく動作しない。

DHCPサーバの設定で使用するように、ハイフンや . を含まない形式(例:000d0c4a6723)と記述する必要がある。

なお、アルファベットの大文字・小文字は区別されない。(旧バージョンではこれも対応できていなかったらしい)


注意事項

設定ファイルを書き換えた場合、変更を反映するために DHCPServer サービスの再起動が必要である。
このため、一瞬ではあるが DHCP のリクエストを受けれない時間ができてしまう。


これで、ブラックリスト入りした端末からIP取得に行くと以下のようなイベントが残る。

端末側ログ

ここで重要なのは、callout は DHCP サーバにリクエストが届く前に横取りしてブロックしているため、端末側のイベントログにはDHCPサーバの名前やIPアドレスが表示されない。

(もしDHCPサーバが DHCPNACK を返し続けたのならイベントにはサーバのIPアドレスが残る)

ということは、端末側から見たときには単にAPIPAアドレスになっているので、ネットワーク障害なのか拒否されたのかは分からないということになる。ここの実装が「無条件にDHCPNACKを返す」だったらありがたかったのだが。これだとPCを拒否した場合はPC側でログを確認できても、NASやプリンタが相手だった場合は調査が大変そう。

で、本当に拒否されたかどうかのログは MacFilterCalloutInfolog.txt である。

サンプルはこんな感じ。

Action specified is : DENY
Successfully read mac addresses
The DHCP server has successfully started.
Mon May 02 15:30:17 2011 0017****6325 Deny                                                      
Mon May 02 15:30:24 2011 0017****6325 Deny
Mon May 02 15:30:27 2011 0017****6325 Deny

まあ、最低限のログといったところである。本来なら、「どのネットワークから」「どんなIPを要求されたか」も残してほしいものである。
(実装上、ハンドシェークを一切させていないのならどんなIPを要求されたかは分からないだろうが)

さらに、このログファイルには大事な注意事項がある。

注意事項

DHCPServer サービスが(再)起動されると、このファイルはクリアされます。

おいおい。定期的にバックアップしておかないと怖くてしょーがないよ。

なんだか本当に一般の人が作ったフリーソフトっぽいですな。

戻る