DNS サーバ djbdns のインストールと設定: tinydns-data 形式

DNS サーバである djbdns のインストールと設定をまとめてみました。

ここでは、tinydns のゾーン情報を構成する記号について説明します。

 

A-1: tinydns-data 形式

data ファイル

tinydns ではレコードの登録に、tinydns-data 形式で書かれた data ファイルを使用します。ユーザは data ファイルを書いて make コマンドを実行することで、tinydns が処理できる data.cdb ファイルを作ることができます。

たとえデータファイルを書き間違えてしまっても、make 時には直前の data.cdb ファイルが残るので安心です。

 

tinydns-data 形式は、1行ごとに1つのレコードを記載します。それぞの行の役割はその行の先頭1文字の記号で表されています。

個人的には、せっかく data.cdb ファイルというのを作るのですから、その前段階である data ファイルではもうちょっと視覚的にわかりやすい書式の方がいいような気もしますけど、それほど量もないので、記号の方がなにかと取り扱いやすいのかもしれませんね。

 

データ行

データ行をまとめてみました。大きく分類して 「標準的なデータ行」 と 「普段は使わないデータ行」 とに分かれるようです。 個人的にもうひとつ、「特殊な制御行」 という分類も追加してみました。

また、それぞれの行の見出し部分に、もう少し細かいお話を載せたページへのリンクを用意してみました。

 

標準的なデータ行

記号 書式 レコード 役割
. .fqdn:ip:x:ttl:timestamp:lo IN SOA fqdn
IN NS x.ns.fqdn
x.ns.fqdn IN A ip
fqdn ドメインのネームサーバを設定します。(自サーバへ譲渡されたドメイン用)
& &fqdn:ip:x:ttl:timestamp:lo IN NS x.ns.fqdn
x.ns.fqdn IN A ip
fqdn ドメインのネームサーバを設定します。(他サーバへ譲渡するドメイン用)
= =fqdn:ip:ttl:timestamp:lo fqdn IN A ip
ip IN PTR fqdn
fqdn のホスト情報を登録します。(正引き/逆引き)
+ +fqdn:ip:ttl:timestamp:lo fqdn IN A ip fqdn のホスト情報を登録します。(正引きのみ)
@ @fqdn:ip:x:dist:ttl:timestamp:lo IN MX dist x.mx.fqdn
x.mx.fqdn IN A ip
メールエクスチェンジャとそのホストの登録を行います。
# #comment   コメント行です。

 

普段は使わないデータ行

記号 書式 レコード 役割
- -fqdn:ip:ttl:timestamp:lo   + で定義されたレコードを一時的に除外するのに使用します。この行は無視されます。
' 'fqdn:s:ttl:timestamp:lo fqdn IN TXT s TXT レコードを登録します。
^ ^fqdn:p:ttl:timestamp:lo fqdn IN PTR p PTR レコードを登録します。通常は = 行で登録します。
C Cfqdn:p:ttl:timestamp:lo fqdn IN CNAME p CNAME レコードを登録します。通常は + 行で登録します。
Z Zfqdn:mname:rname:ser:ref:ret
:exp:min:ttl:timestamp:lo
IN SOA mname rname ( ser, ref, ret, exp, min, ttl ) SOA レコードを登録します。通常は . 行で登録します。
: :fqdn:n:rdata:ttl:timestamp:lo fqdn IN n rdata 一般レコードを登録します。

 

 

特殊な制御行

記号 書式 レコード 役割
% %lo:ipprefix   ipprefix が lo に位置することを示します。この情報は lo の値に使用されます。

 

データの要素

ttl "time to live" と呼ばれる、キャッシュに保持できる期間です。秒単位の数値で指定します(省略可能)。300 秒以下の TTL 設定を 300 秒と解釈するクライアントがあること、DNS の TTL を 2 秒未満にすると検索に失敗するかもしれないことに注意する必要があるそうです。省略時には tinydns によって定められた適切な値が使用されるそうです。
timestamp 指定する値は external TAI64 timestamp という文字列です。使われ方は TTL の値によって異なります。TTL が省略されているか 0 ではないときは、その行が有効になる時間を示します。TTL が 0 のときは "time to die" と呼ばれる、無効になる時間を示します。tinydns はこの timestamp の値を考慮して、無効なデータがキャッシュに保持されないように TTL の値を自動的に調整します。これら2つを利用すれば、時期によってホストの切換をスムーズに行うことができます。
lo クライアントごとの制限を行います。lo は1文字または2文字の ASCII 文字(列)で、% 行によって、クライアントは1つの lo に制限されます。クライアントにとっては、自分が所属している以外の lo が指定されたレコードを参照することはできません。
fqdn フルドメイン名です。たとえば network.ez-net.jp というような文字列です。
ip IP アドレスです。たとえば 192.168.0.1 というような文字列です。
x . や & レコードで、DNS サーバの名前を指定するのに使用します。ここにドット ( . ) が含まれない場合、DNS 名は x.ns.fqdn という名前になります。逆にドットが含まれる場合は、純粋に x を DNS 名として採用します。
dist MX レコードの優先順位を指定します。省略した場合には 0 とみなされます。
mname プライマリネームサーバを意味します。
rname 連絡用アドレスです。ただし、mail.dummy.ez-net.jp というような文字列で指定します。このとき、mail@dummy.ez-net.jp というように、最初のドット ( . ) をアットマーク ( @ ) に替えたメールアドレスが指定されたことになります。
ser SOA レコードのシリアル番号です。
ref SOA レコードの更新間隔です。
ret SOA レコードのリトライ間隔です。
exp SOA レコードの有効期限です。
min SOA レコードの最低有効期間です。
ipprefix クライアントの位置を定めるための IP アドレス情報です。たとえば 192.168 というような文字列で指定し、これで 192.168.*.* の IP アドレスをもつクライアントという意味になります。クライアントは必ず、0個または1個の位置に所属しなくてはならず、2つ以上の該当がある場合には、長い ipprefix の方が有効になります。

 

共通事項である ttl / timestamp / lo に関する値の意味は、次のような感じです。

 

ttl

レコードの生存時間 "Time To Live" を秒単位の数値で表します。

この値は何秒間、DNS キャッシュがその値を保持できるかを示すものです。この値は省略することができ、省略した場合には tinydns によって適切な値が返されるそうです。

 

timestamp

レコードの有効期限を意味します。期限の設定には external TAI64 timestamp を使用し、そのときに有効になるか無効になるかは TTL の設定によって変わってきます。

TTL の値が 0 に設定されている場合、ここで指定した時刻は、このレコードが無効になる時期を示したことになります。tinydns は自動的に、TTL の値も調整して、キャッシュに残ってしまうことがないように気を配ってくれるそうです。

逆に、TTL の値を省略したり、または 0 以外の値を指定していた場合は、その時刻が来た時点で、このレコードが有効になります。

【例】

+www.ez-net.jp:192.168.0.1:0:4000000038af1379

+www.ez-net.jp:192.168.0.2::4000000038af1379

external TAI64 timestamp では 4000000038af1379 が、2000-02-19 22:04:31 UTC を意味するそうです。細かい算出方法はまだ調べていません。

上記のような設定にすると、その 4000000038af1379 という時刻で IP アドレスを切り換えるということができるようです。上の例の1番目の方は、TTL が 0 に設定されているので、その時刻になったら無効になる設定です。逆に2番目の方は、TTL の値が省略されていますので、その時刻になったら有効になる設定です。

 

lo

レコードの有効範囲を決定します。

この lo の部分には、1文字の ASCII 文字または、2文字の ASCII 文字列を使用します。接続してきたクライアントによって、検索できるレコードに制限をつけるために使用します。

 

あらかじめ、% 行によって、どの IP を持ったクライアントが、どの lo に所属するかを定義しておきます。

そして、その lo に所属しているクライアントにのみ検索を許可したいレコードには、lo の部分にそのグループの ASCII 文字(列) を指定することで、それ以外のクライアントには参照できないように制限することができます。

【例】

%in:192.168

%ex

 

+pc.ez-net.jp:192.168.0.1:::in

+pc.ez-net.jp:192.168.255.1:::ex

上記の設定では、in は、IP が 192.168.0.0 から 192.168.255.255 までの PC のグループになります。 ex はそれ以外全ての PC を意味します。厳密には全ての PC だけれどより長いほうが優先されるので、192.168 で始まる IP を持った PC は、ex ではなく in に所属します。

こうすることで、192.168.*.* のコンピュータから名前検索を行ったときには pc.ez-net.jp の IP アドレスとして 192.168.0.1 が取得されますが、それ以外のコンピュータから pc.ez-net.jp を検索してみると、192.168.255.1 という値を取得できることになります。

 

ワイルドカード

tinydns-data 形式では、*.fqdn という形式のワイルドカードを使用することができます。たとえば、次のようなレコードを登録したとします。

+network.ez-net.jp:192.168.0.2

+*.ez-net.jp:192.168.0.1

このとき、* で指定した部分はなんでもいいということになります。なので program.ez-net.jp とか index.ez-net.jp とか、そういった全てのホスト名から、192.168.0.1 という IP アドレスが取得できます。

また、* の部分はべつに program とか index とか、そういった単語の必要はなくて、www2.program.ez-net.jp というような検索でも、192.168.0.1 を取得できます。

ただし、優先順位があって、より制約される方向で適用されるので、個別に登録されている network.ez-net.jp から IP アドレスを取得した場合には 192.168.0.2 が取得されます。

 

目次