オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

DHCPのOption82による固定IPアドレス払い出し

»

今回はDHCPの深いお話しです。

DHCPで固定IPアドレスを払い出すのはよくあることで、よく使われるISC-DHCPサーバではこんな感じに設定を書きます。

shared-network sn1 {
subnet 192.168.33.0 netmask 255.255.255.0 {
host {
hardware ethernet 02:00:00:00:00:01;
fixed-address 192.168.33.1;
}
・・・
}
}

MACアドレスかクライアントIDが02:00:00:00:00:01の端末から192.168.33.0/24のセグメントのリクエストが来れば、必ず192.168.33.1を払い出し、それ以外の端末には192.168.33.1は払い出しません。

さて、普通はMACアドレスに対してIPアドレスを固定できれば十分だったのですが、回線事業者では困ることもあります。MACアドレスは基本的にネットワーク機器固有のものであり、例えば機器が故障して交換となるとMACアドレスが変わってしまうのが普通です。すると、例えばIP電話用のTAが故障して交換となると、固定IPアドレスの設定も交換する機器に合わせて変更しなければなりません。そこで考えるのが、機器固有の値ではなく、機器に設定した値で固定IPアドレスを払い出したいということです。
古くからケーブルTVネットワークを中心に使われてきたのがOption82です。Option82はDHCPリレーエージェントが付加するオプションであり、複数の値をカプセル化したデータを格納できるのですが、一般的には「リモートID」「サーキットID」がよく使われます。リモートIDはDHCPリレーエージェントが動作するルーターの識別に使われ、サーキットIDはルーター内のネットワークポートの識別に使われることが多いです。この値はルーターのDHCPリレーエージェントの設定として指定できますので、機器交換の際には事前にその機器に設定を入れておくか、あるいは交換の現場で設定することで、交換前と同じ設定にすれば、交換しても同じ払い出しを受けることができます。

Option82は固定IPアドレスの割り当てに使われるというよりは、払い出しのサブネットやレンジの選択に使われることも多いのですが、今回は一番深い使い方として固定IPアドレスの割り当ての例を紹介してみましょう。

例として、
・vendor-class-identifierにDHCP_TEST_DEVICEという値が入っていること
・Option82のリモートIDとサーキットIDの2バイト目からの値に応じて固定IPアドレスを払い出す
ということを実現してみます。

ISC-DHCPサーバでこれを実現するのはかなり難しい設定を書く必要があります。ISC-DHCPサーバの設定にはインタプリターのようにif文などを書くことができますので、それを駆使してこんな感じになります。

shared-network sn1 {
subnet 192.168.33.0 netmask 255.255.255.0 {
class "fewNcKUKzz-MXDbPkjYgi" {
match if option vendor-class-identifier = "DHCP_TEST_DEVICE";
match concat(option agent.remote-id, "-", substring(option agent.circuit-id, 2, 10));
}
subclass "fewNcKUKzz-MXDbPkjYgi" "fewNcKUKzz-MXDbPkjYgi";
pool {
range 192.168.33.1;
allow members of "fewNcKUKzz-MXDbPkjYgi";
}
・・・
}
}

まず、pool内に1個だけのrangeを記述し、192.168.33.1だけのレンジとします。このpoolから払い出しを受けるには、fewNcKUKzz-MXDbPkjYgiというクラスにマッチする必要があると、allow members ofを使って指定します。
classでfewNcKUKzz-MXDbPkjYgiを記述し、match ifでvendor-class-identifierがDHCP_TEST_DEVICEと一致することと条件を書き、さらに、Option82のリモートIDとサーキットIDの2バイト目以降をconcatで結合して、その値がsubclassと一致することというのをmatchで記述します。ISC-DHCPサーバではmatch ifは複数指定することができず、match ifとmatchで強引に二つの条件を指定しましたが、他に、3つの条件を全部concatで結合して条件を書くこともできますね。

さて、こんな感じでこのセグメントに100個の固定IP払い出しを記述して、当社の誇るDHCP負荷テストツールdhcpperfで性能を測定すると・・・
Finished and report: 2 transactions per second.
秒間2トランザクションしか安定して払い出せません。

私が作ったProDHCPでもやってみましょう!
ProDHCPでもmatch ifとかclass/subclassを使うこともできますが、やはり条件判断はそれなりに性能に影響が出ますので、特別に「Option82による固定IP払い出し」機能を用意しています。これを使うと以下のように設定が書けます。

shared-network 192.168.33-20160519.json {
subnet 192.168.33.0 netmask 255.255.255.0 {
class "DHCP_TEST_DEVICE" {
match if option vendor-class-identifier = "DHCP_TEST_DEVICE";
}
allow members of "DHCP_TEST_DEVICE";
host fewNcKUKzz-MXDbPkjYgi {
fixed-address 192.168.33.1;
agent "fewNcKUKzz","MXDbPkjYgi";
}
・・・
}
}

従来のhost定義と同じ書き方で、hardware ethernetの代わりにagentを指定することができるようにしました。2バイト目以降という指定はトップレベルで先に1回指定しておけばよいのですが、その書き方はオプションライセンスをお求めいただいた方だけへの公開ですので・・・

ISC-DHCPサーバでの設定のように、固定IPアドレス1個に付きpool,range,class,subclassを用意する必要がなく、とてもシンプルに記述できます。さらに、このようにシンプルに記述できることから想像できるように、dhcpperfで測定すると、
Finished and report: 446 transactions per second.
通常の固定IPアドレス払い出しと同等の性能で動きます。

なお、ProDHCPでも専用機能を使わず、

shared-network 192.168.33-20160519.json {
subnet 192.168.33.0 netmask 255.255.255.0 {
class "fewNcKUKzz-MXDbPkjYgi" {
match if option agent.remote-id = "fewNcKUKzz";
match if option substring(agent.circuit-id,2, 10) = "MXDbPkjYgi";
match if option vendor-class-identifier = "DHCP_TEST_DEVICE";
}
pool {
range 192.168.33.1;
allow members of "fewNcKUKzz-MXDbPkjYgi";
}
・・・
}
}

こんな設定でもISC-DHCPサーバと同じ動きを実現できますが、これだと性能は、
Finished and report: 2 transactions per second.
と、ISC-DHCPサーバ同様に遅い結果となります。

この専用機能の良い点は性能や設定のしやすさだけではありません。ISC-DHCPサーバのようにclassやmatchなどで無理矢理IPを固定した場合は、リース中に機器交換でクライアントのMACアドレスが変わった場合、タイムアウトするまでなにも払い出せなくなります。ProDHCPのOption82による固定IPアドレス払い出しの場合はクライアントのMACアドレスとは無関係にOption82の値をキーに払い出しますので、リース中に交換して機器のMACアドレスが変わってもリース延長として払い出せます。

ProDHCPではRFC準拠などDHCPの基本はもちろんですが、回線事業者での運用を支援するような機能もどんどん取り入れています。追加オプション費用が必要なものと不要なものがありますが、基本的に、開発費をいただいて開発したものは別途オプション費用をいただくようにしています。そうしないと開発費を出した分が他者に無料で使われることになり、損になりますので。もちろん、追加オプションとして他のユーザにも提供して良いかは事前に相談しており、提供できる方を皆さん基本的には選択します。そうでないと別ブランチでの特注品となってしまい、バージョンアップに追従できなくなるためです。

一般的な使い方ではDHCPサーバは無線LANルーターなどにおまけでついているもので、空気のような存在という感じかも知れませんが、実は商用では様々な深い使われ方をしており、それこそ犯罪調査の証拠としても重要な部分なのです。回線事業者向けの採用がとても多いProDHCPの開発・販売・サポートでは回線事業者ならではの大変さをいろいろと教わってきました。その経験を活かしてますますインターネットを支える製品を提供していきたいと考えています。

Comment(0)