2026年6月13日
2026年6月13日
dnsmasq から TinyDNS へ移行する手順|役割を分けてローカルレコードを data 形式に書き換える
dnsmasq から TinyDNS への移行は、設定ファイルの置き換えではなく「役割の分割」です。dnsmasq は1台でキャッシュDNS・ローカルの名前・DHCP を兼ねますが、TinyDNS が引き継げるのはローカルの名前を権威DNSとして答える部分だけです。そのため、ローカルレコードを data ファイルに書き換えて TinyDNS に移し、キャッシュDNSは dnscache か Unbound に、DHCP は dnsmasq の DNS 機能を止めて残すか別のサーバーに任せる、という形で進めます。この記事では、棚卸しから変換、並行稼働での比較、切り替えと切り戻しまでを順に説明します。
TinyDNS 自体のインストールは済んでいる前提です。なお djbdns は 1.05 以降、作者による公式な更新がなく、DNSSEC に対応していません(2026年10月現在)。社内の固定的な名前を、1つのテキストファイルで管理したい場合に向いた移行です。
移行後の構成を決める
最初に、dnsmasq が今どの役割を担っているかを整理し、それぞれの移行先を決めます。
- キャッシュDNS(外部の名前解決と転送):TinyDNS は再帰問い合わせを受け付けないので、クライアントが直接 TinyDNS を参照すると外部の名前が引けなくなります。dnscache か Unbound を用意し、ローカルのゾーンだけ TinyDNS に問い合わせる設定にします。
- ローカルの名前(/etc/hosts・host-record など):TinyDNS の data ファイルに移します。
- DHCP:dnsmasq を
port=0にして DNS 機能だけを止めれば、DHCP サーバーとして使い続けられます。 - DHCP で登録された名前:dnsmasq は DHCP でアドレスを配ったクライアントのホスト名を自動で DNS に載せます。TinyDNS は静的なデータしか扱わないため、この機能は引き継げません。後で対処を説明します。
ローカルのドメイン名を見直す機会でもあります。家庭や小さな事務所の内部用には home.arpa(RFC 8375)が用意されています。.local は mDNS が使う名前なので、通常の DNS のゾーン名には使わないほうが混乱を避けられます。
現状を棚卸しする
dnsmasq の設定は、本体の設定ファイルと追加ディレクトリ、読み込んでいる hosts ファイルに分かれています。名前に関わる行を洗い出します。
grep -hvE '^\s*(#|$)' /etc/dnsmasq.conf /etc/dnsmasq.d/*.conf 2>/dev/null \
| grep -E '^(address|host-record|cname|mx-host|txt-record|srv-host|ptr-record|domain|local|server|addn-hosts|expand-hosts|dhcp-host)'
grep -vE '^\s*(#|$)' /etc/hosts
あわせて、移行後の比較に使う「今の答え」を記録しておきます。名前の一覧をファイルにまとめ、現在の dnsmasq に問い合わせた結果を保存します。
# names.txt に1行1名前で書いておく
while read -r n; do
printf '%s A %s\n' "$n" "$(dig @192.168.1.1 +short "$n" A | sort | tr '\n' ' ')"
done < names.txt > before.txt
dnsmasq の設定と data 形式の対応
主な設定と、TinyDNS の data ファイルでの書き方の対応は次のとおりです。dnsmasq のローカル名は TTL が短い(既定は 0)ので、data でも 300 秒程度の短い TTL を明示すると、移行直後の修正がすぐに反映されます。
| dnsmasq の設定 | 意味 | data ファイルでの書き方 |
|---|---|---|
/etc/hosts の行、host-record=nas.home.arpa,192.168.1.20 |
A と逆引き | =nas.home.arpa:192.168.1.20:300 |
| hosts の別名(2つ目以降の名前) | A のみ | +files.home.arpa:192.168.1.20:300 |
cname=wiki.home.arpa,nas.home.arpa |
CNAME | Cwiki.home.arpa:nas.home.arpa:300 |
mx-host=home.arpa,mail.home.arpa,10 |
MX | @home.arpa::mail.home.arpa:10:300 |
txt-record=home.arpa,"v=spf1 -all" |
TXT | 'home.arpa:v=spf1 -all:300 |
ptr-record=30.1.168.192.in-addr.arpa,printer.home.arpa |
PTR のみ | ^30.1.168.192.in-addr.arpa:printer.home.arpa:300 |
address=/dev.home.arpa/192.168.1.40 |
その名前と配下すべて | +dev.home.arpa:192.168.1.40:300 と +*.dev.home.arpa:192.168.1.40:300 |
ゾーンそのものは . の行で作ります。正引きと、逆引きを答える範囲の両方を書きます。
.home.arpa:192.168.1.54:a:259200
.1.168.192.in-addr.arpa:192.168.1.54:a:259200
=nas.home.arpa:192.168.1.20:300
+files.home.arpa:192.168.1.20:300
Cwiki.home.arpa:nas.home.arpa:300
= は A と PTR を同時に作るため、同じ IP アドレスに = を2行書くと逆引きの答えが2つになります。1つのアドレスにつき = は1行にし、別名は + か C で書きます。
hosts ファイルをまとめて変換する
hosts の行が多い場合は、変換を手作業で行うより小さなスクリプトに任せるほうが誤りを減らせます。次の例は、IPv4 の行だけを対象に、1つ目の名前を =、2つ目以降を + にします。ループバックと IPv6 の行は飛ばします。
awk '!/^[[:space:]]*#/ && NF >= 2 && $1 !~ /:/ && $1 !~ /^127\./ {
for (i = 2; i <= NF; i++) {
if ($i ~ /^#/) break
print (i == 2 ? "=" : "+") $i ":" $1 ":300"
}
}' /etc/hosts > zones/hosts.data
hosts に短い名前(nas だけなど)が書かれている場合、dnsmasq は expand-hosts と domain= の設定でドメインを補っていました。data ファイルでは完全な名前で書く必要があるので、変換後の行を確認してドメインを付け足します。
標準の記号がないレコード
標準の tinydns には SRV と AAAA の記号がありません。汎用レコードの : 記号で、種類番号と中身を8進数のエスケープで書きます。たとえば _sip._tcp.home.arpa の SRV(優先度 10、重み 5、ポート 5060、宛先 pbx.home.arpa)は次のようになります。
:_sip._tcp.home.arpa:33:\000\012\000\005\023\304\003pbx\004home\004arpa\000:300
優先度・重み・ポートをそれぞれ2バイト、宛先の名前をラベルごとの長さ付きで並べた形です。手で書くと誤りやすいので、件数が多ければ変換スクリプトを用意し、tinydns-get 33 _sip._tcp.home.arpa(種類は番号でも指定できます)で結果を確かめます。
TinyDNS に移さない設定
次の設定は名前の「権威」ではなく「解決のしかた」に関するものなので、キャッシュDNS側に移します。
server=/corp.example/10.0.0.1のような条件付き転送address=/ads.example/(IP なし)のような特定ドメインの遮断- 上流の DNS サーバーの指定(
server=8.8.8.8など)
DHCP で登録されていた名前の扱い
dnsmasq が自動で載せていたクライアントの名前は、TinyDNS では引けなくなります。サーバーやプリンターなど名前で使う機器は、dhcp-host= で MAC アドレスと IP を固定し、その名前を data に = で書きます。動的な名前がどうしても必要なら、動的更新に対応した DNS サーバーを選ぶほうが向いています。
キャッシュDNSから TinyDNS に問い合わせる設定
クライアントはキャッシュDNSを参照し、キャッシュDNSが home.arpa と逆引きの範囲だけ TinyDNS に問い合わせる形にします。
dnscache を使う場合は、root/servers/ にゾーン名のファイルを作り、TinyDNS のアドレスを書きます。dnscache はそのゾーンの権威サーバーとして TinyDNS に問い合わせます。
echo 192.168.1.54 | sudo tee /etc/dnscache/root/servers/home.arpa
echo 192.168.1.54 | sudo tee /etc/dnscache/root/servers/1.168.192.in-addr.arpa
# servers/ は起動時に読まれるので dnscache を再起動する
sudo svc -t /etc/service/dnscache
Unbound を使う場合は stub-zone: を使います。Unbound は home.arpa やプライベートアドレスの逆引きを既定で自分で答える設定を持っているため、local-zone: ... nodefault で外す必要がある場合があります。また、DNS リバインディング対策でプライベートアドレスを含む答えを捨てる設定(private-address:)を使っているなら、private-domain: にゾーンを加えます。
server:
local-zone: "home.arpa." nodefault
local-zone: "168.192.in-addr.arpa." nodefault
private-domain: "home.arpa"
stub-zone:
name: "home.arpa"
stub-addr: 192.168.1.54
stub-zone:
name: "1.168.192.in-addr.arpa"
stub-addr: 192.168.1.54
並行稼働で答えを比べる
dnsmasq を動かしたまま、TinyDNS とキャッシュDNSを別のアドレスで立ち上げ、同じ名前の答えを比べます。dnsmasq が 0.0.0.0:53 で待ち受けていると衝突するので、先に listen-address= と bind-interfaces で dnsmasq の待ち受けを限定しておきます。
cd /etc/tinydns/root && sudo make
while read -r n; do
printf '%s A %s\n' "$n" "$(dig @192.168.1.55 +short "$n" A | sort | tr '\n' ' ')"
done < names.txt > after.txt
diff before.txt after.txt
192.168.1.55 は新しいキャッシュDNSのアドレスの例です。差分の多くは data の書き漏れかドメインの付け忘れなので、tinydns-get a 名前 で TinyDNS 単体の答えも確かめます。外部の名前が新しいキャッシュDNSで引けることも確認します。
切り替えと切り戻し
クライアントは DHCP で受け取った DNS サーバーを使うので、DHCP で配るアドレスを新しいキャッシュDNSに変えるのが切り替えになります。作業の数日前に DHCP のリース時間を短くしておくと、変更がクライアントに早く行き渡ります。設定ファイルは編集前に控えを取っておきます。
# /etc/dnsmasq.conf(DHCP は残し、DNS 機能を止める)
port=0
dhcp-option=option:dns-server,192.168.1.55
dhcp-option=option:domain-search,home.arpa
sudo dnsmasq --test
sudo systemctl restart dnsmasq
port=0 にすると dnsmasq は DNS の問い合わせに答えなくなるので、DNS サーバーのアドレスは dhcp-option で明示します。IP アドレスを固定設定しているサーバー類は DHCP の変更が届かないため、それぞれの /etc/resolv.conf やネットワーク設定を個別に直します。
問題が起きたら、控えておいた dnsmasq の設定に戻して再起動すれば元の構成に戻ります。リースが更新されるまでは新しい DNS を使うクライアントが残るので、新しいキャッシュDNSは切り戻し後もしばらく止めずにおきます。
まとめ
- dnsmasq から TinyDNS への移行は役割の分割です。ローカルの名前は TinyDNS、外部の名前解決はキャッシュDNS、DHCP は
port=0にした dnsmasq に分けます。 - hosts・host-record・cname などは data ファイルの
=・+・Cなどに置き換え、短い名前にはドメインを補います。SRV と AAAA は汎用レコードで書きます。 - 条件付き転送や遮断の設定はキャッシュDNS側に移し、DHCP で登録されていた名前は固定割り当てにして data に書きます。
- 移行前の答えを記録し、並行稼働で差分を比べてから、DHCP で配る DNS サーバーを切り替えます。