2026年6月16日
2026年6月16日
MaraDNS から TinyDNS へ移行する手順|csv2 ゾーンを data 形式に変換して切り替える
MaraDNS から TinyDNS(djbdns の権威DNS)への移行は、MaraDNS の csv2 形式のゾーンを tinydns の data 形式に変換し、新しいサーバーで同じ答えが返ることを確かめてから、ネームサーバーを切り替える流れで進めます。変換は、MaraDNS の zoneserver からゾーン転送(AXFR)で取り出し、djbdns 付属の axfr-get に data 形式で書き出させる方法がもっとも手堅いです。この記事では、役割の対応づけ、変換の2つの方法、レコードごとの注意点、応答の突き合わせ、切り替えまでを説明します。
移行の前に確認しておきたいこと
MaraDNS は開発者による保守リリースが続いている一方、djbdns 本体は 1.05 以降の公式な更新がなく、IPv6 などはディストリビューションのパッチ版や派生版に頼っています(2026年10月現在)。既存の djbdns の環境に揃えたい、といった理由があるなら移行する意味がありますが、新しい機能や長期の保守を求めるなら、NSD や Knot DNS も選択肢に入れて比べてください。
どちらを選ぶにしても、作業前に mararc とゾーンファイル一式のバックアップを取り、検証用のサーバーで試してから本番を切り替えます。
手順1:MaraDNS と djbdns の役割を対応づける
MaraDNS も djbdns も、役割ごとに別のプログラムに分かれています。どれを移すのかを先に決めます。
- maradns(権威DNS、UDP) → tinydns。この記事の主な対象です。
- zoneserver(TCP の問い合わせとゾーン転送) → axfrdns。tinydns は UDP でしか答えないため、大きな応答を TCP で返す必要がある場合や、セカンダリへゾーン転送する場合は axfrdns も用意します。
- Deadwood(キャッシュサーバー) → dnscache。キャッシュサーバーも移す場合は、権威DNSとは別のアドレスで動かします。
mararc の csv2["ゾーン名."] = "ファイル名" の行を一覧にすると、移すゾーンの数と、それぞれのゾーンファイルの場所が分かります。
手順2:ゾーンを data 形式に変換する
方法A:zoneserver から axfr-get で取り出す(おすすめ)
MaraDNS の zoneserver が動いているなら、djbdns 付属の axfr-get でゾーン転送を受け、そのまま data 形式で書き出せます。MaraDNS 自身がゾーンを解釈した結果を受け取るので、csv2 の書式を自分で読み違えるおそれが減ります。
まず、MaraDNS 側の mararc で、作業用ホストからのゾーン転送を許可します(作業が終わったら戻します)。
# mararc(zoneserver が参照する設定)
zone_transfer_acl = "192.0.2.50/32"
zoneserver を再起動してから、作業用ホストで次のように実行します。tcpclient は ucspi-tcp に含まれるコマンドです。
# 192.0.2.1 = MaraDNS(zoneserver)のアドレス
tcpclient 192.0.2.1 53 axfr-get example.com data.example.com data.example.com.tmp
成功すると data.example.com に、Z(SOA)、&(NS)、+(A)、@(MX)、C(CNAME)、'(TXT)などの行が書き出されます。tinydns-data が直接扱えない型は、: で始まる汎用形式(型番号と8進数のデータ)で書かれます。ゾーンごとにファイルを作り、最後に1つの data ファイルにまとめます。
方法B:csv2 ファイルを書き換える
zoneserver を動かせない場合は、csv2 の各行を data 形式に書き換えます。主な対応は次のとおりです。
# MaraDNS(csv2)
example.com. SOA ns1.example.com. hostmaster@example.com. 2026101801 7200 3600 604800 1800
example.com. NS ns1.example.com.
www.example.com. +3600 A 192.0.2.10
example.com. MX 10 mail.example.com.
example.com. TXT 'v=spf1 mx -all'
# TinyDNS(data)
Zexample.com:ns1.example.com:hostmaster.example.com:2026101801:7200:3600:604800:1800:86400
&example.com::ns1.example.com:86400
+www.example.com:192.0.2.10:3600
@example.com::mail.example.com:10:86400
'example.com:v=spf1 mx -all:86400
書き換えるときにつまずきやすいのは次の点です。
- 名前の末尾のドット:csv2 では名前の末尾にドットを付けますが、data 形式では付けません。
- TTL の位置:csv2 では
+3600のように名前の後ろに書き、data 形式では行の後ろの欄に書きます。csv2 で TTL を省略していたレコードは、MaraDNS の既定値で答えていたので、移行後も同じ値になるよう明示します。 - **
%による省略**:csv2 では%がゾーン名の代わりに使われていることがあります。書き換える前に、実際のゾーン名に展開します。 - TXT の特殊な文字:data 形式では
:が区切り記号なので、TXT の中のコロンは\072のような8進数で書きます。 - AAAA:パッチの当たっていない tinydns-data には AAAA の専用の行がなく、汎用形式の
:名前:28:16バイトの8進数:TTLで書きます。使っている djbdns の版が IPv6 用の行に対応しているかを確認してください。 - **
.の行を使う場合**:data 形式の.行は SOA・NS・ネームサーバーの A をまとめて作る便利な書き方ですが、3つ目の欄にドットのない名前を書くとa.ns.example.comのような名前が自動で作られます。元の NS の名前を変えたくない場合は、Zと&で個別に書くほうが安全です。
変換後に data.cdb を作る
tinydns のサービスを作成したら(tinydns-conf で作るのが一般的です)、root/data に変換結果を置いて data.cdb を作ります。
cd /service/tinydns/root # 環境に合わせて読み替え
cat /path/to/data.example.com /path/to/data.example.net > data
make
make が文法エラーで止まった場合は、表示された行を直します。data.cdb は作成に成功したときだけ置き換わるので、失敗しても以前の内容のまま動き続けます。
手順3:新旧の応答を突き合わせる
切り替える前に、MaraDNS(192.0.2.1)と TinyDNS(192.0.2.53)に同じ問い合わせを送り、答えを比べます。
# names.txt には「名前 型」を1行ずつ書く
while read -r name type; do
a=$(dig +short +norec @192.0.2.1 "$name" "$type" | sort)
b=$(dig +short +norec @192.0.2.53 "$name" "$type" | sort)
[ "$a" = "$b" ] || echo "DIFF: $name $type"
done < names.txt
+short では TTL が比較されないので、主要なレコードは dig の通常の出力で TTL も目で確認します。差が出やすいのは、TTL の既定値、存在しない名前への応答、ワイルドカード、NS の名前です。
手順4:切り替えと撤収
- TTL を下げる:数日前に MaraDNS 側で NS と主要なレコードの TTL を短くし、元の TTL が切れるのを待ちます。MaraDNS はゾーンファイルの変更を起動時に読み込むため、変更後は MaraDNS を再起動します。
- 切り替える:同じ IP アドレスで MaraDNS を止めて tinydns を起動するか、登録事業者(親ゾーン)の NS とグルーレコードを新しいサーバーに向けます。
- 並行稼働:NS を変えた場合は、親ゾーンの TTL が切れるまで MaraDNS を同じ内容のまま動かし続け、この間はレコードを変更しません。
- 撤収:旧サーバーへの問い合わせが途絶えたことをログで確認してから MaraDNS を止め、作業用に許可した
zone_transfer_aclも元に戻します。mararc と csv2 ファイルはしばらく保管しておきます。
移行後は、レコードを変えるたびに data を編集して make を実行する運用に変わります。tinydns は再起動なしで新しい data.cdb を読むので、MaraDNS のような再起動は要りません。
まとめ
- maradns は tinydns、zoneserver は axfrdns、Deadwood は dnscache に対応します。移す役割を先に決めます。
- 変換は、zoneserver から
axfr-getで data 形式を受け取る方法が手堅く、csv2 を書き換える場合は末尾のドット・TTL・%・TXT の8進数・AAAA に注意します。 - 新旧のサーバーに同じ問い合わせを送って差分をなくし、TTL を下げてから切り替え、旧サーバーはしばらく並行稼働させます。
- djbdns は本体の更新が止まっているため、移行の目的によっては NSD や Knot DNS も比べて選びます。