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 も追加します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲