dhcp-eval - ISC DHCP における条件付き評価 |
Internet Systems Consortium の DHCP クライアントとサーバは、どちらも受 信するパケットに依存した条件付き動作を行う能力を持ちます。条件付き動 作 の文法をここに示します。 |
条 件付き動作は、if, else, elsif 文を使用して指定します。条件文は、通常 文 (option 文) が登場可能な場所はどこにでも登場可能であり、またこのよう な 文を括ることも可能です。サーバにおける条件文は次のようになることが多 いでしょう: if option dhcp-user-class = "accounting" { max-lease-time 17600; option domain-name "accounting.example.org"; option domain-name-servers ns1.accounting.example.org, |
ns2.accounting.example.org; |
} elsif option dhcp-user-class = "sales" { |
ns2.sales.example.org; |
} elsif option dhcp-user-class = "engineering"
{ |
ns2.engineering.example.org; |
} else { |
ns2.misc.example.org; |
} クライアント側では、条件付き評価の例は次のようになるでしょう: # example.org はファイアウォールで DNS をフィルタするので、 # example.org ネットワークに繋がるときのみ、その DNS サーバを使用します。 # example.org に繋がるのではない場合、自己の DNS サーバを優先使用します。 if not option domain-name = "example.org" { prepend domain-name-servers 127.0.0.1; } if 文と elsif 継続文は、引数としてブール式を取ります。つまり、これら の 文 は、評価されるとブール値の結果を生成する式を取ります。式の評価結果が 真になると、 if 文の直後のブレースで括られた文が実行さ れ、 後 続 す る elsif と else の節はスキップされます。そうでない場合、評価結果が真にな る elsif 節に出会うまで、後続する各 elsif 節の式がチェックされます。 そ の ような節が見付かると、直後のブレース中の文が実行され、後続する elsif と else の節はスキップされます。すべての if および elsif の節がチェック さ れ たもののどの式も真にならない場合で、 else 節が存在する場合、 else の直後のブレース中の文が評価されます。条件においては、評価結果が空に な るブール式は偽として扱われます。 |
以下は、DHCP 配布物で現在サポートされているブール式の一覧です。 data-expression-1 = data-expression-2 |
= オペレータは、2 個のデータ式を比較し、両者が同じ場合は真を返し、同 一でない場合は偽を返します。左辺もしくは右辺のいずれかが空の場合、結 果は空になります。 |
boolean-expression-1 and boolean-expression-2 |
and オペレータは、左辺のブール式と右辺のブール式の両方の評価結果が真 の場合、真と評価されます。そうでない場合、偽と評価されます。左辺もし くは右辺のいずれかが空の場合、結果は空になります。 |
boolean-expression-1 or boolean-expression-2 |
or オペレータは、左辺のブール式と右辺のブール式のいずれかの評価結果 が真の場合、真と評価されます。そうでない場合、偽と評価されます。左辺 もしくは右辺のいずれかが空の場合、結果は空になります。 |
not boolean-expression |
not オペレータは、boolean-expression の評価結果が偽の場合、真と評価 されます。また、boolean-expression の評価結果が真の場合、偽と評価 さ れます。 boolean-expression の評価結果が空の場合、結果もまた空になり ます。 |
exists option-name |
exists 式は、処理対象の入力 DHCP パケット中に、指定されたオプショ ン が存在する場合、真を返します。 |
known |
known 式は、要求対応中のクライアントが既知の場合、すなわちホスト宣言 がある場合、真を返します。 |
static |
static 式は、要求対応中のクライアントへのリース割り当てが、静的ア ド レス割り当てによるものであった場合、真を返します。 |
前 述のブール式は、データ式の評価結果に依存します。データ式をここに示し ます。 substring (data-expr, offset, length) |
substring オペレータは、データ式を評価し、評価結果中の offset バイト か ら開始して length バイト継続するサブストリングを返します。 offset と length は共に数値式です。 data-expr, offset, length のいずれか が 空 と 評価される場合、結果もまた空になります。 offset が、評価された データの長さ以上である場合、長さ 0 のデータ文字列が 返 さ れ ま す。 length が、評価されたデータの offset より後の長さより大きい場合、評 価されたデータの offset から終端までの全データを含むデータ文字列が返 されます。 |
suffix (data-expr, length) |
suffix オペレータは、data-expr を評価し、評価結果の最後の length バ イトを返します。 length は数値式です。 data-expr または length の 評 価結果が空の場合、結果もまた空になります。 suffix (訳注: length が正 しいと思われます) の評価結果が評価されたデータの長さより大きい場合、 評価されたデータが返されます。 |
option option-name |
option オペレータは、サーバが応答処理中のパケットの中の、指定したオ プションの内容を返します。 |
config-option option-name |
config-option オペレータは、指定したオプションに対し、 DHCP クライア ントまたはサーバが送出するよう設定された値を返します。 |
hardware |
hardware オペレータは、データストリングを返します。データストリング の最初の要素は、対象パケットが示すネットワークインタフェースのタイプ であり、後続する要素は、クライアントのリンク層アドレスです。パケット が存在しない場合もしくは RFC2131 hlen フィールドが無効な場合、結果は 空になります。ハードウェアタイプには、イーサネット (1)、トークンリン グ (6)、 FDDI (8) が含まれます。ハードウェアタイプは IETF によって規 定 さ れ、 どのようにタイプの数値が定義されるかの詳細は RFC2131 (ISC DHCP 配布物では、doc/ サブディレクトリにあります) を参照してく だ さ い。 |
packet (offset, length) |
packet オペレータは、対象パケットの指定部分を返すか、対象パケットが 無い文脈では空を返します。 offset と length は、 substring オペ レー タと同様に、パケットの内容に適用されます。 |
string |
クォートで括られたストリングはデータ式として指定可能であり、クォート の間を ASCII エンコードしたのテキストを返します。バック ス ラッ シュ (’\’) 文字は C プログラムのように特別扱いされます: すなわち ’\t’ は タブを、’\r’ は復改を、’\n’ は改行を、’\b’ はベルを意味します。 8 進 数値は ’\nnn’ で指定可能であり、nnn は 0 以上 0377 以下の 8 進数値で す。 16 進数値は ’\xnn’ で指定可能であり、nn は 0 以上 0xff 以 下 の 16 進数値です。 |
colon-separated hexadecimal list |
コロンで区切られた 16 進数のオクテット値のリストを、データ式として指 定可能です。 |
concat (data-expr1, ..., data-exprN) |
式が評価され、各評価結果がサブ式の順番に連結されます。サブ式のいずれ かの評価結果が空になる場合、連結の結果は空になります。 |
reverse (numeric-expr1, data-expr2) |
2 個の式が評価され、データ式の評価結果がその場で反転されます。反転 は、数値式で指定される大きさの単位で行われます。例えば、数値式の評価 結 果 が 4 の 場 合で、データ式の評価結果が 12 バイトになる場合、 reverse 式の評価結果は、次のような 12 バイトのデータになります。すな わち、入力の最後の 4 バイト、真中の 4バイト、最初の 4 バイトの順にな ります。 |
leased-address |
いかなる文脈においても、要求処理対象となっているクライアントに IP ア ドレスが割り当て済の場合、その IP アドレスが返されます。 |
binary-to-ascii (numeric-expr1, numeric-expr2, data-expr1, data-expr2) |
data-expr2 の評価結果をテキストストリングに変換します。このテキスト ストリング中では、 data-expr2 の評価結果の各要素が、1 個の数値になり ま す。 各 数値は、それぞれ、data-expr1 の評価結果によって区切られま す。 numeric-expr1 の評価結果は、基数 (2 から 16) であり、この基数に 数 値が変換されます。 numeric-expr2 の評価結果は、各数値のビット幅で あり、 8, 16, 32 のいずれかです。 最初の 3 個のタイプの式の例として、クライアントに割り当てられ た IP ア ドレス用の PTR レコードの名前を生成するために使用可能な式を示しま す |
concat (binary-to-ascii (10, 8, ".", reverse (1, leased-address)), ".in-addr.arpa."); encode-int (numeric-expr, width) |
数値式が評価され、指定された幅のデータストリングにネットワークバイト 順 (最上位バイトが最初) でエンコードされます。数値式の評価結果が空の 値になる場合、結果もまた空です。 |
pick-first-value (data-expr1 [ ... exprn ] ) |
pick-first-value 関数は、任意個のデータ式を取り得ます。リストの先 頭 から各式が評価され、評価結果が空ではない式が見付かるまでこれが続きま す。この式が返され、この式に後続する式は評価されません。すべての式の 評価結果が空の場合、空の値が返されます。 |
host-decl-name |
host-decl-name 関 数は、現在要求処理対象となっているクライアントに マッチする、ホスト宣言の名前を返します。どのホスト宣言もマッチしない 場合、結果は空になります。 |
数 値 式 は、 評価結果が整数になる式です。一般に、整数の最大サイズが 32 ビット未満であると仮定すべきではありませんが、整数の精度が 32 ビット を 越えることはあり得ます。 extract-int (data-expr, width) |
extract-int オペレータは、ネットワークバイト順の整数を、指定したデー タ式の評価結果から取り出します。幅は、取り出す整数のビット幅です。現 在、 サポートされている幅は 8, 16, 32 のいずれかです。データ式の評価 結果が、指定した大きさの整数と取り出すのに十分なビットを提供しない場 合、空の値が返されます。 |
lease-time |
現在のリースの期間です。すなわち、現在の時刻とリースの期限が切れる時 刻との差です。 |
number |
0 から表現可能な最大サイズの範囲の任意の数値を、数値式として指定可能 です。 |
client-state |
処理対象のクライアントの現在の状態です。 DHCP クライアント設定ファイ ルにおいてのみ有用です。取り得る値は次の通りです: |
• |
Booting - DHCP クライアントは INIT 状態であり、 IP アドレス を ま だ持ちません。次に送信されるメッセージは DHCPDISCOVER であり、 これはブロードキャストされます。 |
|
• |
Reboot - DHCP クライアントは INIT-REBOOT 状態です。 IP アド レ ス を 持 ちますがまだ使用していません。次に送信されるメッセージは DHCPREQUEST であり、これはブロードキャストされます。応答が何も 聞 こえないと、クライアントはこのアドレスにバインドし、 BOUND 状態に 遷移します。 |
|
• |
Select - DHCP クライアントは SELECTING 状態です。少なくとも 1 個 の DHCPOFFER メッセージは受信しましたが、他の DHCPOFFER メッ セージを他のサーバから受け取るかどうか待っています。 SELECTING 状 態ではメッセージは送信されません。 |
|
• |
Request - DHCP クライアントは REQUESTING 状態です。少なくとも 1 個の DHCPOFFER メッセージを受信し、そのうちのどれを要求するか選 択しました。次に送信されるメッセージは DHCPREQUEST メッセージであ り、これはブロードキャストされます。 |
|
• |
Bound - DHCP クライアントは BOUND 状態です。 IP アドレスを所有 しています。この状態ではメッセージは送信されません。 |
|
• |
Renew - DHCP クライアントは RENEWING 状態です。 IP アドレスを 所有しており、これを更新するためにサーバに接続を試みています。 次 に送信されるメッセージは DHCPREQUEST メッセージであり、これはサー バに直接ユニキャストされます。 |
|
• |
Rebind - DHCP クライアントは REBINDING 状態です。 IP アドレ ス を 所有しており、これを更新するために任意のサーバに接続を試みてい ます。次に送信されるメッセージは DHCPREQUEST メッセージであり、こ れはブロードキャストされます。 |
ロ グ文を使用して、標準ログチャネルに情報を送信可能です。ログ文は、省略 可能な priority (fatal, error, info, debug のいずれか) と、データ式を取 ります。 log (priority, data-expr) ロ グ文は、単一のデータ式引数のみ取ります。複数のデータ値を出力したい場 合、 concat オペレータを使用してそれらを連結する必要があります。 |
DHCP クライアントとサーバは、動的にドメインネームシステムを更新する能力 が あります。設定ファイル中に、どのようにドメインネームシステムを更新し て欲しいか、定義可能です。更新は RFC 2136 に従っているため、 RFC 2136 をサポートする DNS サーバは、 DHCP サーバからの更新を受け付け可能と思わ れます。 |
TSIG および DNSSEC はまだサポートされていません。 DHCP サーバまたはクラ イアントからの更新を受け付けるように DNS サーバを設定する場合、権限の無 い更新に対して DNS サーバを晒すことになるかもしれません。これを避けるた め に今すぐできる最良の方法は、 IP アドレスベースのパケットフィルタを使 用して、権限の無いホストからの更新要求発行を抑止することです。 明 ら か に、 現状ではクライアントの更新に対するセキュリティを提供する方法はあり ません。このためには TSIG か DNSSEC が必要ですが、この DHCP 配布物に は まだ含まれていません。 動 的 DNS (DDNS) 更新は、dns-update 式を使用することで実行されます。 dns-update 式は、ブール式であり、4 個のパラメータを取ります。更新に成功 すると、結果は真になります。失敗すると、結果は偽になります。 4 個のパラ メータは、リソースレコードタイプ (RR)、 RR の左辺、RR の右辺、レコー ド に 適 用 さ れるべき ttl です。この関数の最も簡単な使用例は、dhcpd.conf ファイルの参照節にあり、なにが起きるか記述されています。この例では、 複 数の式が使用されて、 dns-update 用の引数が作成されています。 例の中では、最初の dns-update 式への 1 番目の引数は、 A RR タイプに評価 されるデータ式です。 2 番目の引数は、DHCP host-name オプションとロー カ ル ドメイン、この場合 "ssd.example.net"、を含むテキストストリングを連結 することで、構築されます。 3 番目の引数は、クライアントに割り当てられた アドレスを、 32 ビットの数値から各バイトを "." で区切った ASCII 文字列 に変換することで、構築されます。 4 番目の引数 TTL は、リースの残り時 間 です (これは本当は正しくありません。なぜなら DNS サーバは、要求に対して いつもこの TTL 値を出力してしまうからです。これは、リース期限切れの数秒 前であってもです)。 最 初の dns-update 文が成功すると、引き続いて 2 番目の更新により PTR RR がインストールされます。 PTR レコードのインストールは、A RR の イ ン ス トー ル と 同 様 ですが、レコードの左辺はリースされたアドレスを逆にして ".in-addr.arpa" と結合されたものです。右辺は、アドレスのリース提供先 ク ライアントの、完全な形でのドメイン名です。 |
dhcpd.conf(5), dhcpd.leases(5), dhclient.conf(5), dhcp-eval(5), dhcpd(8), dhclient(8), RFC2132, RFC2131 |
Internet Systems Consortium DHCP Distribution は、Vixie Labs との契約の も と で、Ted Lemon が記述しました。本プロジェクトの資金は、Internet Systems Consortium が提供しました。 Internet Systems Consortium に関 す る情報は、 http://www.isc.org にあります。 |