2012年11月28日

そろそろDHCPリースクエリーについて語っておくか(RFC4388 DHCP Lease Query Client for Java)

最近DHCPについて熱く語っている僕ですが、実際のところDHCPに真っ直ぐな情熱がある訳では無いんです。

だって・・・地味でしょう・・・ だから結構アバウトな理解で、例えばDHCPリースクエリーなんて言われても、適当に理解してたんですけど、「光陰矢のごとし」ですから一度具体的に語ってみようかと。

DHCPリースクエリーを簡単に言えばDHCPサーバーへIPアドレスのリース状態・情報を問い合わせる為のインタフェースで、運用ではクライアント(端末)が信頼出来るものか否かを判断する為に利用することが多いようです。

ID-10067168

DHCPリースクエリーの概要


大規模なネットワークであれば、ほぼ必ず幾つかのサブネットワークに分割され、各サブネットの出口のとなるルーターが存在します。

サブネットワークに接続するクライアント端末のIPアドレスをDHCPで動的に管理している場合には、DHCPサーバーが必要で、ルーターはDHCPサーバーにDHCPリクエストを転送するDHCPリレーエージェントとしても働きます。

leasequery1

このような状況で、DHCPサーバーがIPアドレスのリース状況を問い合わせるインタフェース、つまり、DHCPリースクエリーをサポートしていれば、DHCPリレーエージェント(又は、他のシステム)はDHCPリースクエリーを使ってトラフィックの認証を行うことができます。

例えば、DHCPリースクエリーを使って、アクセス(トラフィック)送信元の端末(加入者)に設定されているIPアドレスが正規のDHCPサーバーから払い出されたIPアドレスであるか否かを問い合わせれば、不正にネットワークに接続した端末・トラフィックを拒否することができるという訳です。

「え、微妙な仕組みじゃない?」ですって?、そうですね。 登録済みクライアント(MACアドレス)にIPアドレスをリースしているのでれば有用だと理解できますが、未登録クライアントにもIPアドレスをリースする一般的なDHCPサーバーのイメージからすると少し疑問を感じる認証プロセスかもしれません。


DHCPリースクエリーの仕組みと歴史的な背景・標準化


ネットワークといえばCISCO。 ネットワークの標準はCISCOが作る、と言われた(言っていた)ぐらいですからDHCPリース・クエリーにも影響を与えています。

まずCISCOが独自に実装したのが次のような仕組み。 リースクエリー・クライアントは、chaddrに問い合わせ対象のMACアドレスをセットして、DHCPメッセージ・タイプ13(LEASE ACTIVE)をDHCPサーバーに送信します。

lq_cisco

DHCPサーバーはACK、NAKを使って、既知(リース済み)・未知のクライアントであることを回答します。

しかし、標準化の流れの中でRFCで策定されたのがRFC4388リースクエリー。 こちらは、メッセージ・タイプ10(LEASE QUERY)を送信し、その結果をLEASE ACTIVE(13)、UNKNOWN(12)、UNASSIGNED(11)の何れかで回答します。

lq_rfc4388

ややこしいのが双方共にメッセージ・タイプ13(LEASE ACTIVE)を使うところ。 RFC標準で考えると応答(ACTIVEレスポンス)しているように見えて、実際には問い合わせを受けているだけだった、なんて勘違いも起きかねません。

また、RFC4388では問い合わせる際のパラメーターとして、MACアドレスの他にIPアドレス、Client-identifierの計3つが定義されています。


RFC4388 LEASE QUERY CLIENT FOR JAVA


リースクエリーなんて詳しく知らないよーっと適当にあしらってきた僕ですが、DHCPサーバーの評価で否が応でもリースクエリーの検証方法を用意しなければいけない状況になってしまいました。

オフラインでもプログラム実行環境のインストールが簡単なJavaが良いなと探してみたところ、見つけたのがこちらのdhcpLQプロジェクト。

dhcpLQ | Free software downloads at SourceForge.net

問い合わせのパラメーターにはMACアドレスしか指定出来ませんが、Javaベースで動きます。

こちらのソース覗いてみたんですが、僕には次の点で不満が・・・・。

  • メッセージの出力にlog4jを使っている
  • 少ない設定項目がxmlファイルで定義されている
  • LEASE QUERYパラメーターにIPアドレスも指定したい

うーん、1から作るのは面倒ですし、dhcpLQの一部クラスをそのまま使ってカスタマイズすることにします。

それがこちら。 RFC4388LQ。


RFC4388LQダウンロード



リンク先にあるzipファイルにはソースコード、実行ファイル、外部ライブラリ(commons CLI)が含まれています。

lq-pacage-jar

distフォルダにあるRFC4388.jarを次のように実行してみて下さい。

$ sudo java -jar RFC4388LQ.jar 
usage: RFC4388LQ
 -d <arg>   dhcp server v4 ip address
 -i <arg>   interface name to send lease query.
 -p <arg>   paramerter for lease query. ip4v or mac address

-dでDHCPサーバーIPアドレス、-iでリクエストを送信するネットワーク・インタフェース、-pで問い合わせで指定するパラメーター(IPアドレス又はMACアドレス)を指定します。
※IPかMACアドレスでしか問い合わせ出来ないのでRFC4388準拠とは言えないんですが・・・。

じゃあ、早速動かしてみましょう。

$ sudo java -jar RFC4388LQ.jar -i eth0 -d 10.0.0.1 -p 00:00:00:90:17:81
    LEASE QUERY:LEASE ACTIVE(13),CHADDR:00:00:00:90:17:81,CIADDR:10.0.0.20

お、DHCPサーバー(10.0.0.1)からACTIVE応答がありましたね。

今度はIPアドレスで問い合わせてみます。

$ sudo java -jar RFC4388LQ.jar -i eth0 -d 10.0.0.1 -p 10.0.0.20
    LEASE QUERY:LEASE ACTIVE(13),CHADDR:00:00:00:90:17:81,CIADDR:10.0.0.20

同じ結果になりました。

今回はDHCPサーバーにISC-DHCP-SERVER(古いバージョンではRFC4388 LEASE QUERYをサポートしていません。有効化はdhcpd.confにallow leasequery;を追記)を使いましたが、ログはこんな感じ。

23:31:47 dhcpd: DHCPLEASEQUERY from 10.0.0.2 for MAC address 00:00:00:90:17:81
23:31:47 dhcpd: DHCPLEASEACTIVE to 10.0.0.2 for MAC address 00:00:00:90:17:81 (0 associated IPs)
- snip - 
23:32:13 dhcpd: DHCPLEASEQUERY from 10.0.02 for IP 10.0.0.20
23:32:13 dhcpd: DHCPLEASEACTIVE to 10.0.0.2 for IP 10.0.0.20 (0 associated IPs)

もちろん、UNKNOWN(12)、UNASSIGNED(11)レスポンスの場合にも正しく表示されますよ。


それでは、また今度。



Ciscoネットワーク構築教科書[設定編]
ダイワボウ情報システム株式会社 シスコシステムズ合同会社 
インプレスジャパン 
売り上げランキング: 100778

DHCP Handbook, The (Kaleidoscope)
Ralph Lemon, Ted Droms 
Sams 
売り上げランキング: 180292

Posted by netbuffalo at 01:00│Comments(0)TrackBack(0)ネットワーク | プログラミング


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/4284824

コメントする

名前
URL
 
  絵文字