2026年6月13日
2026年6月13日
djbdns をインストールする手順|ソースからのビルド、dnscache と tinydns を別IPで動かすまで
djbdns は「キャッシュDNSの dnscache」と「権威DNSの tinydns」を中心にした小さなプログラム群で、インストールは「daemontools を入れる → djbdns をビルドする → 専用ユーザーを作る → 役割ごとに *-conf で設定ディレクトリを作り、/service に登録する」という流れになります。この記事では、両方を1台に入れる場合を例に、つまずきやすい errno のビルドエラー、古いルートサーバー一覧の差し替え、同じ IP を共有できない問題まで順に説明します。
tinydns だけを動かしたい場合の細かな設定や systemd での運用は別の記事で扱っているため、ここでは「djbdns 一式を入れて、dnscache と tinydns がそれぞれ応答するところまで」に絞ります。
始める前に知っておきたいこと
djbdns の公式最終版は 2001年公開の 1.05 で、その後は新しい版が出ていません。2007年末にパブリックドメインとして公開されたため、ディストリビューションが独自のパッチを当てたパッケージを配布していることがあります。
導入前に次の点を把握しておくと、あとで設計を変える手間が減ります。
- DNSSEC に対応していません。 署名の検証(キャッシュ側)も署名済みゾーンの配信(権威側)もできません。新規構築で DNSSEC が要件なら、Unbound や NSD、Knot DNS を検討してください。
- 公式 1.05 は IPv6 での待ち受けに対応していません。 有志の IPv6 パッチがありますが、公式のものではありません。
- 1.05 公開後に脆弱性の報告と修正パッチが出ています。 ソースから入れる場合は、使うパッチを把握したうえで適用し、ディストリビューションのパッケージを使う場合はそのパッケージに修正が含まれているかを確認してください。
- ディストリビューションのパッケージは配置が異なります。 Debian 系などで djbdns や daemontools のパッケージが提供されていることがありますが、収録状況やサービスディレクトリの場所(/service か /etc/service か)は版によって違います(2026年10月現在)。この記事はソースから入れる手順で説明するので、パッケージを使う場合はパスを読み替えてください。
作業は検証用のサーバーで一度通してから本番に入れるのが安全です。既存の DNS サーバーを置き換える場合は、現在の設定ファイルとゾーンデータをバックアップしてから始めます。
手順1:daemontools をインストールする
djbdns の各サーバーは daemontools の supervise に監視される前提で作られています。先に daemontools を入れます。
sudo mkdir -p /package
sudo chmod 1755 /package
cd /package
sudo tar xzpf /path/to/daemontools-0.76.tar.gz
cd admin/daemontools-0.76
現在の glibc 環境では、そのままビルドすると errno に関するリンクエラーで止まります。コンパイラの設定ファイルに errno.h を読み込ませるオプションを足してからインストールします。
sudo sed -i '1s|$| -include /usr/include/errno.h|' src/conf-cc
sudo package/install
package/install は起動時に svscanboot を動かす設定を /etc/inittab に追記しようとしますが、systemd の環境ではそれが効きません。その場合は svscanboot を起動する unit を作ります。
# /etc/systemd/system/daemontools.service
[Unit]
Description=daemontools svscan
After=network.target
[Service]
ExecStart=/command/svscanboot
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now daemontools
ps ax | grep svscan
svscan と readproctitle が動いていれば準備完了です。
手順2:djbdns をビルドしてインストールする
djbdns も同じ errno の問題を抱えているので、conf-cc を書き換えてからビルドします。
cd /usr/local/src
tar xzf /path/to/djbdns-1.05.tar.gz
cd djbdns-1.05
echo 'gcc -O2 -include /usr/include/errno.h' > conf-cc
make
sudo make setup check
make setup check で /usr/local/bin に dnscache、tinydns、dnscache-conf、tinydns-conf、dnsq、dnsip などが入ります。脆弱性修正パッチを当てる場合は make の前に適用します。
手順3:専用ユーザーを作る
djbdns はサーバーごとに権限の小さいユーザーで動かす設計です。ログ用のユーザーも分けます。
sudo useradd -r -s /usr/sbin/nologin dnscache
sudo useradd -r -s /usr/sbin/nologin tinydns
sudo useradd -r -s /usr/sbin/nologin dnslog
nologin のパスはディストリビューションによって /sbin/nologin のこともあります。どのユーザーにもログインシェルやパスワードは与えません。
手順4:dnscache を設定して起動する
dnscache と tinydns は、同じ IP アドレスの 53番ポートを同時に使えません。1台に両方を置くなら、dnscache は 127.0.0.1 か内部向けの IP、tinydns は外部向けの IP というように分けます。ここでは dnscache を 192.0.2.10 で、tinydns を 192.0.2.53 で動かす例にします(どちらもドキュメント用のアドレスなので、実際の IP に置き換えてください)。
sudo dnscache-conf dnscache dnslog /etc/dnscache 192.0.2.10
ルートサーバー一覧を最新にする
ここが見落とされやすい点です。dnscache-conf は、djbdns と一緒にインストールされた /etc/dnsroots.global を root/servers/@ にコピーします。この一覧は 2001年当時のもので、その後いくつかのルートサーバーの IP アドレスが変わっています。古い一覧のままでも残りのサーバーで動くことは多いのですが、無駄な問い合わせと遅延の原因になります。
IANA が公開している最新の root hints(named.root)から IPv4 アドレスだけを取り出し、1行に1つずつ書き直します。
curl -s https://www.internic.net/domain/named.root \
| awk '$3=="A"{print $4}' | sudo tee /etc/dnscache/root/servers/@
問い合わせを許可するクライアントを決める
dnscache は、root/ip にファイルがあるアドレスからの問い合わせにだけ答えます。初期状態では 127.0.0.1 だけです。社内ネットワーク 192.0.2.0/24 から使わせる場合は、プレフィックス名の空ファイルを作ります。
sudo touch /etc/dnscache/root/ip/192.0.2
インターネット全体に開いたキャッシュDNS(オープンリゾルバ)は DNS 増幅攻撃に悪用されるため、許可範囲は必要なネットワークだけにしてください。
起動と確認
sudo ln -s /etc/dnscache /service/dnscache
sleep 5
sudo svstat /service/dnscache
dnsqr a www.example.com 192.0.2.10
dig @192.0.2.10 www.example.com A
svstat が up を返し、名前が引ければ dnscache は動いています。応答が無い場合は /etc/dnscache/log/main/current を見ます。タイムスタンプは tai64n 形式なので、tai64nlocal < current で読める時刻に変換できます。
手順5:tinydns を設定して起動する
権威DNSも使う場合は tinydns を別の IP で設定します。
sudo tinydns-conf tinydns dnslog /etc/tinydns 192.0.2.53
cd /etc/tinydns/root
sudo ./add-ns example.com 192.0.2.53
sudo ./add-host www.example.com 192.0.2.80
sudo make
sudo ln -s /etc/tinydns /service/tinydns
add-ns や add-host は data ファイルに行を追記するスクリプトで、make が data を data.cdb に変換します。tinydns が読むのは data.cdb なので、data を編集したら make を忘れないことが大事です。
dnsq a www.example.com 192.0.2.53
dig @192.0.2.53 www.example.com A +norec
権威サーバーへの確認は、再帰を求めない +norec を付けると実際の応答が見やすくなります。応答の flags に aa(権威応答)が付いていれば正常です。
よくあるつまずきと確認方法
- make で errno のエラーが出る:conf-cc に
-include /usr/include/errno.hが入っているか確認します。daemontools と djbdns の両方で必要です。 - svstat が「unable to open supervise/ok」を返す:svscan が動いていないか、/service へのリンクを作った直後でまだ supervise が起動していません。数秒待ってから再確認し、それでも駄目なら svscan のプロセスを確認します。
- dnscache がクライアントに答えない:root/ip に許可ファイルがあるか、env/IP が意図したアドレスかを確認します。
- tinydns が起動を繰り返す:53番ポートを別のプロセス(systemd-resolved のスタブなど)が使っていないかを
ss -lunp | grep :53で確認します。systemd-resolved は 127.0.0.53 で待ち受けるため、dnscache を 127.0.0.1 に置くなら衝突しないこともありますが、0.0.0.0 で待ち受けるプロセスがあると起動できません。 - data を変えたのに反映されない:make を実行して data.cdb が更新されたか、タイムスタンプを確認します。
まとめ
- djbdns のインストールは daemontools → djbdns のビルド → 専用ユーザー → *-conf → /service 登録の順に進めます。
- 現在の環境では conf-cc に errno.h の読み込みを足さないとビルドが通りません。
- dnscache の root/servers/@ は古い一覧なので、最新の root hints に差し替えます。
- dnscache と tinydns は IP を分け、dnscache の許可範囲は必要なネットワークだけにします。
- DNSSEC と公式の IPv6 対応が無いため、新規構築では要件に照らして他の DNS サーバーとも比べてください。