2026年6月4日

2026年6月4日

TinyDNS から NSD へ移行する手順|data をゾーンファイルに変換し、並行稼働で比べてから切り替える

TinyDNS から NSD への移行は、「data ファイルをゾーンファイルに変換する → NSD を別のアドレスで動かして答えを比べる → 問い合わせの向き先を切り替える」の3段階で進めると、名前解決を止めずに済みます。変換は、djbdns に含まれる axfrdns からゾーン転送(AXFR)で取り出す方法が手堅く、手で書き直すより誤りが入りにくくなります。この記事では、移行前の棚卸し、変換、NSD の設定、比較の方法、切り替えと切り戻しの手順を説明します。

なぜ NSD なのか、移行前に確かめること

djbdns(TinyDNS を含む)は 1.05 以降、作者による公式な更新がなく、DNSSEC や EDNS0 に対応していません(2026年10月現在)。NSD は NLnet Labs が開発を続けている権威DNS専用のサーバーで、TinyDNS と同じく「権威の応答だけを行う」設計のため、役割をそのまま置き換えやすいのが利点です。TCP の応答やゾーン転送も NSD 単体で扱えるので、axfrdns のような別のプログラムは要りません。

作業の前に、data ファイルに NSD へそのまま持っていけない書き方がないかを確認します。

  • **ロケーション(% の行と、各行の末尾のロケーション項目)**:問い合わせ元によって答えを変える TinyDNS 独自の機能です。NSD にはこれに当たる機能がないため、使っていれば別の手段(問い合わせ元ごとに別サーバーを立てる、ほかのソフトの機能を使うなど)を検討します。
  • タイムスタンプ付きのレコード:決まった時刻に有効・無効が切り替わるレコードは、ゾーンファイルでは表せません。
  • **ワイルドカード(*)**:NSD でも使えますが、標準の仕様どおりに動くため、細かな挙動が TinyDNS と違うことがあります。比較の段階で重点的に確認します。
  • SOA シリアル:. の行で作ったゾーンは、data ファイルの更新時刻(UNIX 時刻)がシリアルになっています。
# ロケーションの定義行(% で始まる行)がないかを探す
grep -n '^%' /etc/tinydns/root/data
# ゾーンの一覧(. と Z の行)
grep -E '^[.Z]' /etc/tinydns/root/data | cut -d: -f1 | sort -u

% の行がなければ、ロケーションは使われていません。タイムスタンプは各行の後ろのほうの項目に16進数で書かれるため、grep では見分けにくく、変換後の比較で確認するのが現実的です。data ファイルは作業前にコピーを取っておきます。移行が終わるまでは、レコードの変更をできるだけ止めておくと、比較と切り戻しが簡単になります。

data をゾーンファイルに変換する

axfrdns からゾーン転送で取り出す

axfrdns は data.cdb の内容を AXFR で送るプログラムです。すでに動いていれば、tcp ファイルで変換作業をするホストからの AXFR を許可します。動いていなければ、ループバックアドレスだけで待ち受ける axfrdns を一時的に作ります。

# 127.0.0.1 で待ち受ける axfrdns を一時的に作る(tinydns のディレクトリを指定)
sudo axfrdns-conf axfrdns dnslog /etc/axfrdns-tmp /etc/tinydns 127.0.0.1
cd /etc/axfrdns-tmp
echo '127.0.0.1:allow' | sudo tee tcp
sudo make
sudo ln -s /etc/axfrdns-tmp /etc/service/axfrdns-tmp

axfrdns ユーザーがなければ先に作ります。tcp に AXFR= の指定を書かないと、すべてのゾーンの転送を許可します。ここではループバックからの接続に限っているので外部には出ません。

続いて、ゾーンごとに dig で AXFR を取り、そのままゾーンファイルにします。

mkdir -p ~/nsd-migrate
for z in example.com example.net 2.0.192.in-addr.arpa; do
  dig @127.0.0.1 "$z" AXFR +onesoa +nocmd +nostats > ~/nsd-migrate/"$z".zone
done

+onesoa は、AXFR の最後にもう一度出てくる SOA を省くオプションです。出来上がったファイルは名前がすべて末尾にドットの付いた完全な形で書かれているので、NSD のゾーンファイルとしてそのまま使えます。= の行は A と PTR に分かれ、汎用レコード(: の行)で書いた AAAA も AAAA として出力されます。

ロケーション付きのレコードがゾーン転送にどう現れるかは、構成によって想定と違う可能性があります。棚卸しで見つけた行は、変換後のファイルを目で見て確認します。

シリアルを決め直す

変換後の SOA シリアルは、TinyDNS が使っていた値(UNIX 時刻)のままです。NSD に移った後は自分でシリアルを管理するため、2026101801 のような日付形式に切り替えると分かりやすくなります。日付形式の値は現在の UNIX 時刻より大きいので、既存のセカンダリが値の後退と誤解することもありません。シリアルは変更のたびに上げる、という手順をここで決めておきます。

NSD を設定する

NSD はパッケージで入れられます(Debian・Ubuntu 系では nsd、RHEL 系では EPEL などで提供)。比較のため、最初は TinyDNS とは別のアドレスで待ち受けます。

# /etc/nsd/nsd.conf
server:
    ip-address: 192.0.2.54
    hide-version: yes
    zonesdir: "/etc/nsd/zones"

remote-control:
    control-enable: yes
    control-interface: 127.0.0.1

zone:
    name: "example.com"
    zonefile: "example.com.zone"

zone:
    name: "example.net"
    zonefile: "example.net.zone"

zone:
    name: "2.0.192.in-addr.arpa"
    zonefile: "2.0.192.in-addr.arpa.zone"
sudo mkdir -p /etc/nsd/zones
sudo cp ~/nsd-migrate/*.zone /etc/nsd/zones/

# 設定とゾーンファイルを検査する
sudo nsd-checkconf /etc/nsd/nsd.conf
sudo nsd-checkzone example.com /etc/nsd/zones/example.com.zone

# nsd-control 用の鍵を作り、起動する
sudo nsd-control-setup
sudo systemctl restart nsd
sudo nsd-control status

nsd-checkzone で zone example.com is ok と出れば、ゾーンファイルは読み込めます。セカンダリがある場合は、各 zone: に provide-xfr:(転送を許可する相手)と notify:(変更を知らせる相手)を書きます。TinyDNS は NOTIFY を送らないため、axfr-get などで定期的に取りに来ていたセカンダリも、NOTIFY を受けて取りに来る設定に変えると反映が早くなります。

並行稼働で答えを比べる

TinyDNS(192.0.2.53)と NSD(192.0.2.54)の両方に同じ問い合わせをして、答えが一致するかを確かめます。ゾーンファイルから名前と種類の一覧を作り、全件を比べます。

# ゾーンファイルから「名前 種類」の一覧を作る
awk '!/^;/ && NF>=5 {print $1, $4}' ~/nsd-migrate/*.zone | sort -u > names.txt

# 両方に問い合わせて、違いがあるものだけを表示する
while read -r name type; do
  a=$(dig @192.0.2.53 "$name" "$type" +norec +short | sort)
  b=$(dig @192.0.2.54 "$name" "$type" +norec +short | sort)
  [ "$a" = "$b" ] || echo "DIFF: $name $type"
done < names.txt

SOA はシリアルを変えていれば差が出るのが正常です。それ以外に DIFF が出たら、変換後のファイルを確認します。あわせて、存在しない名前(dig @192.0.2.54 nothing.example.com +norec)で NXDOMAIN が返るか、ワイルドカードのある名前で同じ答えが返るかも試します。flags に aa が付いていれば、NSD がそのゾーンの権威として答えています。

切り替える

切り替えには2つの方法があります。

方法A:同じ IP アドレスを NSD に引き継ぐ

レジストラの NS やグルーレコードを変えずに済む方法です。停止から起動までの短い間は応答が止まるため、利用の少ない時間帯に行います。

# TinyDNS と axfrdns を止め、OS の再起動後も起動しないようにする
sudo svc -d /etc/service/tinydns /etc/service/axfrdns
sudo touch /etc/tinydns/down /etc/axfrdns/down

# nsd.conf の ip-address を 192.0.2.53 に変えて再起動する
sudo nsd-checkconf /etc/nsd/nsd.conf && sudo systemctl restart nsd
dig @192.0.2.53 example.com SOA +norec

down ファイルを置かないと、OS を再起動したときに daemontools が TinyDNS を起動し、53番ポートを NSD と取り合います。一時的に作った axfrdns-tmp も、リンクを外して止めておきます。

方法B:新しいアドレスの NSD に NS を向け替える

NSD を別のサーバーで動かす場合は、レジストラで NS とグルーレコードを新しいアドレスに変えます。上位のゾーンに登録された NS の TTL は1〜2日程度のことが多く、その間は古いサーバーにも問い合わせが届きます。TTL が切れるまでは TinyDNS も止めずに動かし、両方に同じ内容を保ちます。

切り戻しと移行後の作業

問題が出たら、方法Aでは NSD を止めて down ファイルを削除し、svc -u で TinyDNS と axfrdns を起動し直します。data ファイルと data.cdb は消さずに残しておけば、すぐに元の状態に戻れます。方法Bでは、レジストラの NS を元に戻します。

移行が落ち着いたら、次の作業を行います。

  • 外部のネットワークから dig +trace やオンラインの診断ツールで、委任と応答に問題がないかを確認します。
  • data ファイル、tinydns・axfrdns のサービスディレクトリ、一時的に作ったユーザーを、切り戻しの必要がなくなった時点で片付けます。
  • ゾーンファイルをバージョン管理し、変更時は「編集 → シリアルを上げる → nsd-checkzone → nsd-control reload ゾーン名」の順で反映します。
  • DNSSEC を導入する場合、NSD は署名済みのゾーンを配信する役割で、署名そのものは別のツールで行います。鍵の管理方法を決めてから進めます。

本番での作業の前に、同じ手順を検証用のサーバーで一通り試しておくと、変換や切り替えの抜けを事前に見つけられます。

まとめ

  • 移行前に、ロケーションやタイムスタンプなど NSD で表せない書き方を data ファイルから探しておきます。
  • 変換は、ループバックで待ち受ける axfrdns から dig AXFR +onesoa でゾーンを取り出すと誤りが入りにくくなります。
  • NSD は別のアドレスで起動し、nsd-checkconf・nsd-checkzone で検査してから、全レコードを TinyDNS と比べます。
  • 切り替えは同じ IP の引き継ぎか、NS の向け替えで行います。前者では down ファイルで TinyDNS の自動起動を止め、data は切り戻し用に残します。

お気軽にご相談ください

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