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 サーバーとも比べてください。

お気軽にご相談ください

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