2026年6月13日
2026年6月13日
TinyDNS をインストールする手順|daemontools で動かし、最初のゾーンが応答するまで
TinyDNS(tinydns)は djbdns に含まれる権威DNSサーバーで、daemontools の supervise に見張られて動きます。インストールは「daemontools を入れる → djbdns を入れる → tinydns-conf でサービスを作る → data ファイルにレコードを書いて make する」の順です。この記事では、Linux サーバーに TinyDNS を入れ、最初のゾーンが外部から正しく引けるところまでを、つまずきやすい点と確認方法を添えて説明します。
djbdns 本体は 1.05 以降、作者による公式な更新がなく、DNSSEC や EDNS0 には対応していません(2026年10月現在)。新しく権威DNSを立てるなら NSD・Knot DNS・PowerDNS なども候補になります。既存の TinyDNS 構成を増設・再構築する場合や、data ファイル1つで管理できる簡素さを重視する場合に、この手順を使ってください。
インストールの前に決めておくこと
作業を始める前に、次の3点を決めておくと後で迷いません。
- 待ち受ける IP アドレス:tinydns は1つの IP アドレスの UDP 53番で待ち受けます。同じサーバーで dnscache(キャッシュDNS)も動かすなら、tinydns とは別の IP アドレスを割り当てます。両方が同じアドレスの 53番を取り合うと、後から起動したほうが起動と終了を繰り返します。
- TCP で答えるかどうか:tinydns は UDP 専用です。応答が大きくなり TC ビットが立つと、問い合わせ側は TCP で再問い合わせします。TXT レコードが長い場合などに備えるなら、axfrdns(TCP 担当)も一緒に入れます。
- サービスを置くディレクトリ:daemontools の svscan が見張るディレクトリは、ソースから入れた場合は
/service、Debian 系のパッケージでは/etc/serviceが一般的です。以下では/etc/serviceとして書くので、手元の環境に読み替えてください。
daemontools と djbdns を入れる
パッケージで入れる(Debian・Ubuntu 系)
Debian・Ubuntu 系では、daemontools・ucspi-tcp・djbdns がパッケージとして提供されています。パッケージ名や分割のしかたは版によって変わることがあるので、apt search djbdns で確認してから入れます。
sudo apt update
apt search djbdns
sudo apt install daemontools daemontools-run ucspi-tcp djbdns
daemontools-run は、OS の起動時に svscan を立ち上げる設定を含むパッケージです。これが入っていないと、サービスを作っても誰も起動してくれません。入れた後に ps aux | grep svscan で svscan が動いていることを確かめます。
RHEL 系(AlmaLinux・Rocky Linux など)では公式リポジトリに含まれていないことが多く、サードパーティのリポジトリかソースからのビルドになります。サードパーティのパッケージは保守状況を確認してから使ってください。
ソースからビルドする
パッケージがない環境では、daemontools と djbdns をソースからビルドします。どちらも古いコードのため、新しい glibc では errno の宣言に関するエラーでビルドが止まります。コンパイラの指定に errno.h の読み込みを加えるのが定番の対処です。
# djbdns の展開先で実行(daemontools・ucspi-tcp も同様の修正が要る)
echo 'gcc -O2 -include /usr/include/errno.h' > conf-cc
make
sudo make setup check
daemontools をソースから入れた場合、svscan を起動時に立ち上げる仕組み(古い手順では /etc/inittab や rc.local への追記)が今の systemd 環境では働かないことがあります。その場合は svscan を起動する systemd ユニットを自分で用意します。
tinydns のサービスを作る
tinydns 用と、ログ(multilog)用の2つのシステムユーザーを作ります。どちらもログインできないユーザーにします。tinydns は起動後に権限を落とし、データのディレクトリに chroot して動くので、root のまま動くことはありません。
sudo useradd --system --no-create-home --shell /usr/sbin/nologin tinydns
sudo useradd --system --no-create-home --shell /usr/sbin/nologin dnslog
# tinydns-conf 実行ユーザー ログ用ユーザー 作成先 待ち受けIP
sudo tinydns-conf tinydns dnslog /etc/tinydns 192.0.2.53
# svscan の見張り対象に登録(数秒で起動する)
sudo ln -s /etc/tinydns /etc/service/tinydns
sleep 5
sudo svstat /etc/service/tinydns /etc/service/tinydns/log
svstat で up (pid ...) 数秒 と出れば起動しています。supervise not running と出る場合は svscan が動いていないか、リンク先のディレクトリを svscan が見張っていません。/etc/tinydns は作成済みのディレクトリを指定するとエラーになるので、作り直すときは古いディレクトリを退避してから実行します。
作られたディレクトリのうち、よく触るのは次の3つです。
env/:IP(待ち受けアドレス)やROOT(データの置き場所)などの環境変数。変更したらサービスの再起動が要ります。root/:レコードを書くdataファイルと、それを変換したdata.cdbの置き場所。log/main/current:ログ。行頭の@4000...は TAI64N 形式の時刻で、tai64nlocalを通すと読めます。
最初のゾーンを書いて反映する
root/ には add-ns や add-host などの補助スクリプトが入っています。最初はこれを使うと書式を間違えにくくなります。
cd /etc/tinydns/root
sudo ./add-ns example.com 192.0.2.53
sudo ./add-host www.example.com 192.0.2.10
sudo ./add-mx example.com 192.0.2.20
sudo make
make は内部で tinydns-data を実行し、data から data.cdb を作ります。tinydns は問い合わせのたびに data.cdb を開くので、レコードの変更に再起動は要りません。make がエラーを出したときは data.cdb が更新されず、前の内容のまま答え続けます。「直したのに変わらない」ときは、まず make の出力を見ます。
data ファイルは1行1レコードで、行頭の記号が種類を表します。
# NS と SOA(ネームサーバー名は a.ns.example.com になる)
.example.com:192.0.2.53:a:259200
# A レコードと逆引き PTR を同時に作る
=www.example.com:192.0.2.10:86400
# A レコードのみ
+app.example.com:192.0.2.11:3600
# CNAME
Cblog.example.com:www.example.com:3600
# MX(優先度は省略時 0)
@example.com:192.0.2.20:a::86400
# TXT(コロンは \072 と書く)
'example.com:v=spf1 mx -all:3600
標準の tinydns には AAAA レコード用の記号がありません。IPv6 を返すには汎用レコード(: で始まる行に種類番号 28 と8進数のエスケープで書く形式)を使うか、IPv6 対応のパッチを当てた版を使います。
動作を確認する
確認は「サーバー内でデータを引く」「ネットワーク越しに問い合わせる」の2段階で行うと、どこで止まっているかが分かります。
# 1. data.cdb の中身を直接引く(root/ で実行する)
cd /etc/tinydns/root
tinydns-get a www.example.com
# 2. 別のマシンから、再帰なしで問い合わせる
dig @192.0.2.53 www.example.com A +norec
dig @192.0.2.53 example.com SOA +norec
dig の応答の flags に aa があれば、権威を持つサーバーとして答えています。1 で答えが出るのに 2 で connection timed out になる場合は、ファイアウォールで UDP 53 番が閉じているか、env/IP のアドレスがそのサーバーに付いていません。ss -lunp | grep ':53 ' で待ち受け状態を確認します。
TCP 用の axfrdns を追加する
応答が UDP の上限を超えたときの TCP での再問い合わせに答えるため、axfrdns を追加します。ゾーン転送を許可しない設定にしておけば、TCP での通常の問い合わせだけを受け付けられます。
sudo useradd --system --no-create-home --shell /usr/sbin/nologin axfrdns
sudo axfrdns-conf axfrdns dnslog /etc/axfrdns /etc/tinydns 192.0.2.53
cd /etc/axfrdns
# すべての接続元に TCP の問い合わせは許可し、ゾーン転送は許可しない
echo ':allow,AXFR=""' | sudo tee tcp
sudo make
sudo ln -s /etc/axfrdns /etc/service/axfrdns
ファイアウォールでは TCP 53 番も開けます。セカンダリにゾーン転送を許可する場合は、tcp ファイルにそのサーバーの IP アドレスだけを書き足します。
公開前の注意点
- ドメインの委任:レジストラ側で NS をこのサーバーに向け、ネームサーバー名を自ゾーン内に置く場合はグルーレコードも登録します。権威DNSは2台以上用意し、別のネットワークに置くと片方が止まっても名前解決が続きます。
- 再帰問い合わせは受けない:tinydns は権威DNS専用で、ほかのドメインの名前解決はしません。サーバー自身の
/etc/resolv.confに tinydns のアドレスを書くと、そのサーバーから外部の名前が引けなくなります。 - data ファイルの控え:data ファイルはゾーン情報のすべてです。編集前にコピーを取り、可能ならバージョン管理しておくと、誤った変更をすぐに戻せます。
まとめ
- TinyDNS は daemontools の上で動くため、svscan が起動時に立ち上がる状態を先に作ります。Debian 系ではパッケージ、それ以外ではソースのビルドに errno の修正が要ります。
tinydns-confでサービスを作り、svscan の見張り対象にリンクすると起動します。状態はsvstat、ログはtai64nlocalで確認します。- レコードは
root/dataに書いてmakeで data.cdb に変換します。再起動は要らず、makeの失敗時は古い内容のまま答えます。 - 確認は
tinydns-getと、別マシンからのdig +norecの2段階で行います。TCP の応答が必要なら axfrdns も追加します。