dhcp-eval(5) | FreeBSD File Formats Manual | dhcp-eval(5) |
名称
dhcp-eval - ISC DHCP における条件付き評価解説
Internet Software 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" {
max-lease-time 17600;
option domain-name "sales.example.org";
option domain-name-servers ns1.sales.example.org,
ns2.sales.example.org;
} elsif option dhcp-user-class = "engineering" {
max-lease-time 17600;
option domain-name "engineering.example.org";
option domain-name-servers ns1.engineering.example.org,
ns2.engineering.example.org;
} else {
max-lease-time 600;
option domain-name "misc.example.org";
option domain-name-servers ns1.misc.example.org,
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
boolean-expression-1 or boolean-expression-2
not boolean-expression
exists option-name
known
static
データ式
前述のブール式は、データ式の評価結果に依存します。データ式をここに示します。substring ( data-expr, offset, length)
suffix ( data-expr, length)
option option-name
config-option option-name
hardware
packet ( offset, length)
string
colon-seperated hexadecimal list
concat ( data-expr1, ..., data-exprN)
reverse ( numeric-expr1, data-expr2)
leased-address
binary-to-ascii ( numeric-expr1, numeric-expr2, data-expr1, data-expr2)
最初の 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 ] )
host-decl-name
数値式
数値式は、評価結果が整数になる式です。一般に、整数の最大サイズが 32 ビット未満であると仮定すべきではありませんが、整数の精度が 32 ビットを越えることはあり得ます。extract-int ( data-expr, width)
lease-time
number
client-state
- •
- 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 オペレータを使用してそれらを連結する必要があります。
参照: 動的な DNS 更新
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"と結合されたものです。右辺は、アドレスのリース提供先クライアントの、完全な形でのドメイン名です。