1. はじめに

ここでは、WIDE版DHCPサーバおよびrelay agentを利用するために、簡単な説
明を行なう。サーバを利用するには/etc/dhcpdb.poolと/etc/dhcpdb.relayの
二つのファイルを記述する必要がある。また、relay agentを利用する場合に
は/etc/dhcpdb.serverというファイルを記述しなければならない。ここでの説
明は導入的なものであり、各ファイルの詳しい記述の仕方に関しては、それぞ
れのマニュアルを参照して欲しい。


2. アドレスプールデータベースの設定方法

設定ファイル/etc/dhcpdb.poolはtermcap形式の拡張である。一行が一つのエ
ントリとして解釈される。ただし、一つのエントリはバックスラッシュで複数
の行にまたがることができる。また#から始まる行はコメント行とみなされる
し、termcapにおけるtcエントリ同様に、既に解釈された行を参照(引用)する
ことができる。

ただし次にあげるいくつかの点で異なる。

  1. 各シンボルが4文字の長さである。
  2. 既に読み込まれたエントリへの参照(symbolはtblc)がtermcapでは各エン
     トリの最後でしか利用できなかったが、ここではエントリ中の任意の場所
     で可能である。
  3. 参照した値も、シンボルの前に"@"をつけることで無効にできる。
  4. 引用した値を明示的に上書きできる。
  5. 各シンボルの前に"!"をつけると、その値は強制的にクライアントに渡さ
     れる。

各エントリの最初のシンボルは、そのエントリにたいするIndexとなる文字列
である。これは後でtblcで参照する時に利用されたり、サーバがアドレスの割
り当てを管理するためのデータベース(/etc/dhcpdb.bind)でもIndexとして使
用されている。Indexには':'以外の任意の文字を使用してよい。各エントリの
残り部分は、key=value形式のフィールドの列であり、各フィールドは':'で区
切られている。以下に、簡単な例を示す。

-- begin of sample

   # define a global entry which specifies the stuff every host uses.
   global:		:!snmk=255.255.255.224:tmof=32400:

   # define different master entries for each subnet. . .
   subnet30:	:tblc=global:rout=133.4.30.1:dht1=500:dht2=850:\
		:brda=133.4.30.31:

   # entries for manual allocation (DHCP, BOOTP)
   3001:	:ipad=133.4.30.1:tblc=subnet30:clid="1:0x0080c75fdc03":
   3002:	:ipad=133.4.30.2:tblc=subnet30:clid="1:0x08004600e5d5":

   # entries for dynamic allocation (DHCP)
   3003:	:ipad=133.4.30.3:dfll=3600:maxl=7200:tblc=subnet30:
   3004:	:ipad=133.4.30.4:dfll=3600:maxl=7200:tblc=subnet30:

   # entries for dynamic / automatic allocation (DHCP) 
   3005:	:maxl=0xffffffff:ipad=133.4.30.5:tblc=subnet30:
   3006:	:maxl=0xffffffff:ipad=133.4.30.6:tblc=subnet30:

   # entries for automatic allocation (BOOTP) 
   3007:	:ipad=133.4.30.7:albp=true:tblc=subnet30:
   3008:	:ipad=133.4.30.8:albp=true:tblc=subnet30:

-- end of sample


最初の"global"というエントリでは、サブネットマスク(snmk)と世界標準時か
らオフセット(tmof)を定義している。このサーバが取り扱うアドレス群ではす
べてこの2つの値が共通に使われると仮定し、後で引用するために定義してあ
る。snmkの前に"!"がついているが、これによってDHCPクライアントがサブネッ
トマスクを要求して来ない場合でも、強制的に応答にサブネットマスクが挿入
される。これは、RFCに「Host Requirements RFCに示されているデフォルト値
と違う場合は、それをクライアントに返す」と規定されているためである。し
たがってRFCに厳密に忠実な運用をするためには、

  1. Host Requirementsのデフォルト値を定義したエントリを作成し、他のす
     べてのエントリは、これをtblcで引用する。
  2. Host Requirementsのデフォルトとは違う場合は、それを明示的に指定し
     ておく("!"を使用する)。

ということをする必要がある。実用上はそこまで厳密に定義しなくても問題な
いだろう。

次の"subnet30"というエントリでは、133.4.30.0/27のサブネットに共通の値
を定義している。globalを引用(tblc)し、デフォルトルータのアドレス(rout)
とブロードキャストアドレス(brda)を与えている。"dht1=500"は、アドレスの
有効期限の50%が経過した時点で(ユニキャストで)、期限の延長を試み始める
ことを意味している。"dht2=850"は、同様に有効期限の85%が経過した時点で
(ブロードキャストで)期限の延長を開始することを意味する。これらについて
はDHCPのRFCに記述されているので参照して欲しい。ちなみに500,850はRFCで
示されているデフォルトの値であり、この2つに関しては省略しても構わない
(デフォルト値が利用される)。

次の"3001"および"3002"の2エントリは、手動割り当て(静的割り当て)の見本
である。割り当てるIPアドレス(ipad)と、subnet30の引用(tblc)、それにクラ
イアントの識別子(clid)が指定されている。クライアント識別子としてはMAC
アドレスを利用することを勧める。ここで、"1:0x0080c75fdc03"のうち、最初
の"1"が識別子がMACアドレスであることを指定している。識別子のその他の型
についてはRFCを参照して欲しい。基本的にはDHCPクライアントが要求時に指
定する識別子をここで記述すれば良い。WIDE版のDHCPクライアントは、MACア
ドレスを指定するようになっている。

"3003"および"3004"の2エントリは、DHCPの最大の特徴である動的割り当ての
ための記述である。ipad, tblcの他に、デフォルトの有効期限(dfll)と最大の
有効期限(maxl)が秒単位で指定されている。DHCPのRFCによれば、デフォルト
のリースは最短でも1時間となっている(指定しなかった場合も1時間になる)。
また最大の有効期限は、「1回の要求に対する割当の最大期限」という意味で
ある。したがって、最大の有効期限が7200秒であっても期限の延長申請を繰り
返すことで、そのアドレスを使用し続けることが可能となる。

"3005"および"3006"は、自動割り当ての例である。自動割り当ては、アドレス
の有効期限が無限という点以外は動的割り当てと等しい。WIDE版DHCPサーバで
は、最大の有効期限を0xffffffff(RFCでは無期限のアドレスは0xffffffffで表
現すると規定している)と記述することで、暗黙的に自動割り当てを指定する。
WIDE版DHCPサーバは、自動割り当てのアドレスを動的割り当てを要求するクラ
イアントに割り当てないように、可能な限り努力する。

"3007"および"3008"はやはり自動割り当て用だが、"albp=true"という記述を
することで、BOOTPのクライアントに対しての割り当てが許可される。つまり、
このように記述しない限りはBOOTPのクライアントにはアドレスは割り当てら
れない。また、このように記述されているアドレスは、出来る限り通常のDHCP
クライアントには割り当てない。ただし混乱を避けるために、BOOTPのクライ
アントをサポートする場合には、手動割り当て(静的割り当て)を使うことを推
奨する。


3. relay agentデータベースおよびDHCPサーバデータベースの設定方法

3.1 Example (1)

最初の例として、一つのDHCPサーバだけが設定されている場合を考える(図1)。

      -----+----------------------- 133.4.27.0/27
           |
        +--+---+
        |サーバ|
        +--+---+
           |
      -----+----------------------- 133.4.34.0/27

	(図1) サーバしか存在しない場合

ここでサーバは2つのセグメントともサポートする。この図にはDHCPクライア
ントが記述されていないが、もちろん133.4.27.0/27および133.4.34.0/27の両
方セグメントに接続される。この場合はrelay agentが存在しないわけだから、
/etc/dhcpdb.relayは空のファイルで良い。したがって、2.で説明したように
両方のサブネットに関するアドレスプールを用意し、起動時に両方のインタフェー
ス名を指定してやれば良い。


3.2 Example (2)

次に図2のような場合を想定する。ここではサーバは一つのネットワークイン
タフェースしか持たず、またrelay agent(RA)もやはり一つのネットワークイ
ンタフェースしか持たず、サーバとは別のネットワークに接続されているとす
る。さらにルータはrelay agentの機能は持っていないとする。

                        +------+
                        |サーバ|
                        +--+---+
                           |133.4.27.2
      -----+---------------+-------------- 133.4.27.0/27
           |
        +--+---+
        |ルータ|
        +--+---+
           |
      -----+---------------+-------------- 133.4.34.0/27
                           |133.4.34.2
                        +--+--+
                        | RA  |
                        +-----+

	(図2) サーバとrelay agentがそれぞれ一本足の場合

サーバ側の/etc/dhcpdb.relayファイルには、relay agentのアドレスとサブネッ
トマスクを記述するので、この場合は次のようなファイルを用意する。

  133.4.34.2   255.255.255.224

またrelay agent側の/etc/dhcpdb.serverには、次のように記述する。

  1
  133.4.27.2

ここではサーバが一つしかないので、先頭行の「いくつのサーバに対してメッ
セージを(複製して)中継するか」という値としては1を使用し、次にサーバの
IPアドレスを記述する。

もしも133.4.34.0/27のサブネットをサポートするサーバがNホストあった場合
には、先頭行には1からNまでの整数を記述する。残りの行にはN個のサーバの
IPアドレスを列挙する。


3.3 Example (3)

最後の例として、ルータ上でrelay agentが動作している場合を考える(図3)。

                        +------+
                        |サーバ|
                        +--+---+
                           |133.4.27.2
      -----+---------------+-------------- 133.4.27.0/27
           |133.4.27.1
        +--+--+
        | RA  |
        +--+--+
           |133.4.34.1
      -----+------------------------------ 133.4.34.0/27

	(図3) ルータ上でrelay agentが動作している場合

この場合、relay agent側のファイル/etc/dhcpdb.serverに記述する内容は3.2
と差がなく、次のようになる。

  1
  133.4.27.2

さて、relay agentは133.4.27.0/27側のサブネットを受け持つ必要はない。
DHCPの仕様により、relay agentはメッセージを受信したネットワークインタ
フェースのアドレスをサーバに通知しなければならない。したがってrelay
agentのIPアドレスを記述する際には、どちらのネットワークインタフェース
をサポートさせたいかを意識しなければならない。

例えば、この場合は133.4.34.0/27側のサブネットをrelay agentに受けもたせ
るので、そちら側のIPアドレスである133.4.34.1を指定する。したがって
/etc/dhcpdb.relayには次のように記述する。

  133.4.34.1  255.255.255.224

もし仮にサーバがさらに別のサブネットに存在し、relay agentに
133.4.27.0/27と133.4.34.0/27の両方のサブネットをサポートさせる場合には
サーバのデータベースファイル"/etc/dhcpdb.relay"に次のように記述し、
relay agentを起動する時には両方のネットワークインタフェース名を指定す
れば良い。

  133.4.27.1  255.255.255.224
  133.4.34.1  255.255.255.224
