2026年6月17日
2026年6月17日
TinyDNS のゾーン設定方法|data ファイルの記号と書式、複数ゾーン・逆引き・委任・IPv6 の書き方
TinyDNS のゾーンは、BIND のようなゾーンファイルではなく、1つの data ファイルに1行1レコードで書きます。行頭の1文字がレコードの種類を表し、. の行でゾーン(SOA と NS)を作り、= や + の行でホストを加えて、make で data.cdb に変換すると反映されます。この記事では、ゾーンを作るのに要る記号と各項目の意味、複数ゾーン・逆引き・サブドメインの委任・IPv6 の書き方、変更の反映と確認の方法を説明します。TinyDNS がすでに起動している前提で進めます。
data ファイルの基本
data ファイルは tinydns のサービスディレクトリの root/ にあります(tinydns-conf で /etc/tinydns に作った場合は /etc/tinydns/root/data)。各行は次のような形です。
記号 名前 : 値1 : 値2 : ... : TTL : タイムスタンプ : ロケーション
項目はコロンで区切り、後ろの項目は省略できます。TTL を省略すると種類ごとの既定値が使われます。名前の末尾にドットは付けません(www.example.com. ではなく www.example.com)。# で始まる行はコメントです。
覚えておくと書式の誤りを減らせる点が2つあります。1つは、値の中にコロンを書くときは8進数で \072 と書くこと。もう1つは、= や . の行のように、1行で複数のレコード(A と PTR、NS と SOA と A)がまとめて作られる記号があることです。
ゾーンを作る記号
.:ゾーンの開始(SOA・NS・ネームサーバーの A)
.example.com:192.0.2.53:a:259200
.example.com:198.51.100.53:b:259200
1行目で、example.com の SOA レコード、a.ns.example.com を指す NS レコード、a.ns.example.com の A レコード(192.0.2.53)がまとめて作られます。3番目の項目にドットを含まない文字を書くと 文字.ns.ゾーン名 という名前になり、ドットを含む名前(例:ns1.example.com)を書くとその名前がそのまま使われます。2行目のように同じゾーンで別の文字を指定すると、2台目のネームサーバーが NS に加わります。
SOA は自動で作られ、シリアルには data ファイルの更新時刻が使われます。管理者アドレスや refresh などを自分で決めたい場合は、. の代わりに次の Z と & を組み合わせます。
Z:SOA を明示する
Zexample.com:ns1.example.com:hostmaster.example.com:2026101801:3600:900:1209600:300:3600
&example.com:192.0.2.53:ns1.example.com
&example.com:198.51.100.53:ns2.example.com
Z の項目は順に、ゾーン名、プライマリのネームサーバー名、管理者アドレス(@ をドットにしたもの)、シリアル、refresh、retry、expire、minimum、TTL です。シリアルを自分で書く場合は、変更のたびに上げる必要があります。セカンダリが別ソフトで AXFR を受けている構成では、シリアルの管理方法を決めておきます。
&:NS(委任)
& は NS レコードと、ネームサーバーの A レコードを作ります。SOA は作りません。上の例のように自分のゾーンの NS を並べるほか、サブドメインを別のネームサーバーに任せる「委任」にも使います(後述)。
ホストとその他のレコード
# A と PTR を同時に作る
=www.example.com:192.0.2.80:3600
# A だけを作る(同じアドレスを複数の名前に割り当てるとき)
+blog.example.com:192.0.2.80:3600
# CNAME
Cshop.example.com:shops.example-provider.net:3600
# MX(mail.mx.example.com を作り、優先度 10)
@example.com:192.0.2.25:mail:10:3600
# 既存のホストを MX にする場合は IP を空にして名前を書く
@example.com::mx.example-provider.net:20:3600
# TXT(コロンは \072)
'example.com:v=spf1 mx -all:3600
# PTR だけを作る
^80.2.0.192.in-addr.arpa:www.example.com:3600
= はとても便利ですが、同じ IP アドレスに = を2行書くと、PTR が2つ作られて逆引きの結果が定まらなくなります。1つのアドレスにつき = は1行にし、別名は + か C で書きます。
C(CNAME)を書いた名前には、ほかのレコードを置けません。ゾーンの頂点(example.com そのもの)に CNAME を書くと、SOA や NS と衝突して問題が起きるので避けます。
TXT は、255バイトを超える長い文字列(DKIM の公開鍵など)でも1行に書けます。tinydns-data が自動で短い文字列に分割し、受け取った側では連結して扱われます。
ワイルドカード
+*.example.com:192.0.2.80:3600
*.example.com は、レコードが存在しない名前(例:foo.example.com)の問い合わせに答えます。すでにレコードがある名前には適用されません。
複数ゾーンを1つの data で管理する
ゾーンを増やすには、同じ data ファイルに別のゾーンの .(または Z と &)の行を加えるだけです。
.example.com:192.0.2.53:a:259200
=www.example.com:192.0.2.80:3600
.example.net:192.0.2.53:a:259200
+www.example.net:192.0.2.81:3600
ゾーンが増えると data が長くなり、編集の誤りが起きやすくなります。ゾーンごとにファイルを分け、root/ の Makefile で連結してから変換する形にすると管理しやすくなります。
# /etc/tinydns/root/Makefile(tinydns-data のパスは環境に合わせる)
# 最初に書いた data.cdb が make の既定の対象になる
data.cdb: data
/usr/bin/tinydns-data
data: zones/*.data
cat zones/*.data > data
make は Makefile の最初の規則を既定の対象にするので、data.cdb の規則を先に書きます。この形にすると data は自動生成されるファイルになるため、直接編集せず zones/ 側を編集します。コマンドの行頭はタブで字下げします。スペースにすると make がエラーになります。data ファイルを Git などで管理しておくと、誰がいつ何を変えたかを追え、誤った変更もすぐに戻せます。
逆引きゾーンを設定する
逆引き(IP アドレスから名前を引く)に答えるには、そのアドレス範囲の逆引きゾーンが自分のサーバーに委任されている必要があります。多くの場合、逆引きの委任や PTR の登録は IP アドレスを割り当てた事業者(VPS やクラウドの提供元)の管理画面で行うため、自前の TinyDNS で答えられるのは委任を受けている範囲だけです。
委任を受けている場合は、逆引きゾーンを . で作ります。
.2.0.192.in-addr.arpa:192.0.2.53:a:259200
=www.example.com:192.0.2.80:3600
=mail.example.com:192.0.2.25:3600
= の行は、対応する逆引きゾーンが data にあれば PTR も自動で答えます。正引きと逆引きが1行で揃うのが TinyDNS の大きな利点です。
サブドメインを別のサーバーに委任する
dev.example.com を別のネームサーバーで管理する場合は、& で委任します。
&dev.example.com:192.0.2.60:ns1.dev.example.com:259200
これで dev.example.com 配下の問い合わせには、自分では答えず「ns1.dev.example.com(192.0.2.60)に聞いてください」という委任の応答を返します。委任先のネームサーバーが委任したゾーンの中にある場合、IP アドレスの項目がグルーレコードの役割を果たすので省略しないでください。
IPv6(AAAA)を書く
標準の tinydns-data には AAAA 専用の記号がありません。汎用レコードの : 記号で、種類番号 28 とアドレスの16バイトを8進数で書きます。2001:db8::1 は次のようになります。
:www.example.com:28:\040\001\015\270\000\000\000\000\000\000\000\000\000\000\000\001:3600
先頭の4バイトが 2001:0db8(0x20, 0x01, 0x0d, 0xb8)、続く11バイトが 0、最後の1バイトが 1 です。手で書くと誤りやすいので、変換スクリプトを用意するか、IPv6 対応のパッチを当てた版(AAAA 用の記号が追加されているもの)を使う方法もあります。パッチ版の記号は版によって違うため、使う版の説明を確認してください。
反映と確認
cd /etc/tinydns/root
sudo make
# サーバー内で data.cdb の中身を引く
tinydns-get a www.example.com
tinydns-get mx example.com
# 別のマシンから再帰なしで問い合わせる
dig @192.0.2.53 example.com SOA +norec
dig @192.0.2.53 www.example.com A +norec
dig @192.0.2.53 -x 192.0.2.80 +norec
tinydns は data.cdb を問い合わせのたびに読むので、make が成功すれば再起動は要りません。make が失敗すると data.cdb は更新されず、古い内容のまま答え続けます。エラーの行には問題のある data の行が示されるので、記号の打ち間違いやコロンの数を確認します。
dig の flags に aa があれば権威として答えています。tinydns-get では答えが出るのに dig で返らない場合は、ファイアウォールの UDP 53番か、tinydns の待ち受けアドレスを確認します。
注意点
djbdns(TinyDNS を含む)は 1.05 以降、作者による公式な更新がなく、DNSSEC や EDNS0 には対応していません(2026年10月現在)。既存の構成を保守する用途では問題なく使えますが、DNSSEC が必要になったら NSD など別の権威DNSへの移行を検討します。data ファイルを編集する前には控えを取り、変更は検証用のサーバーで make と tinydns-get を試してから本番に反映すると安全です。
まとめ
- TinyDNS のゾーンは
dataファイルに1行1レコードで書き、makeでdata.cdbに変換して反映します。再起動は要りません。 .でゾーン(SOA・NS・A)をまとめて作り、SOA を細かく決めたいときはZと&を使います。- ホストは
=(A と PTR)、+(A のみ)、C、@、'で書きます。1つのアドレスに=は1行だけにします。 - 複数ゾーンは同じ data に並べられ、ゾーンごとのファイルを Makefile で連結すると管理しやすくなります。
- 逆引きは委任を受けた範囲だけ答えられます。AAAA は汎用レコード
:で種類番号 28 を使います。