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 [BSD/OS や FreeBSD では/var/db/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