2026年6月9日

2026年6月9日

MaraDNS で複数ゾーンを管理する設定|mararc の csv2 にゾーンを並べ、追加・確認・転送まで

MaraDNS で複数のドメインを扱うには、設定ファイル mararc の csv2 という辞書に「ゾーン名とゾーンファイルの組」を1行ずつ並べます。ゾーンファイルはドメインごとに分けるのが基本ですが、同じ内容でよいドメインは % を使った共通のファイルにまとめられます。この記事では、複数ゾーンの設定例、ゾーンの追加と削除の手順、起動前後の確認方法、セカンダリへの転送の設定までを説明します。

内容は MaraDNS 3.x 系を前提にしています(2026年10月現在)。MaraDNS は更新の頻度が高くない小さなプロジェクトで、ディストリビューションによってはパッケージが提供されていないこともあります。設定項目は手元の版の man mararc と man csv2 で確かめてください。

MaraDNS の構成を確認する

MaraDNS 2.0 以降は、権威 DNS を担う maradns と、再帰検索とキャッシュを担う Deadwood が別のプログラムになっています。この記事で扱うのは、ゾーンを持って外部からの問い合わせに答える maradns 側です。同じサーバーで Deadwood も動かす場合は、両者が別の IP アドレスで待ち受けるように分けます。権威 DNS を公開しつつ、再帰検索まで外部に開いてしまうと、第三者に悪用されるおそれがあります。

複数ゾーンの設定で知っておきたい MaraDNS の特徴は次の3つです。

  • ゾーンの一覧は mararc に書き、ゾーンファイルの場所は chroot_dir からの相対パスで指定する
  • ゾーンファイルは BIND 形式ではなく、MaraDNS 独自の csv2 形式で書く
  • ゾーンファイルを変更しても自動では読み直されず、反映には maradns の再起動が要る

mararc に複数のゾーンを並べる

/etc/mararc の例です。ゾーン名は末尾のドットまで含めて書きます。

# maradns が待ち受ける IP アドレス(公開用のアドレスに置き換える)
ipv4_bind_addresses = "192.0.2.53"

# ゾーンファイルを置くディレクトリ。csv2 のファイル名はここからの相対パス
chroot_dir = "/etc/maradns"

# ゾーンの一覧
csv2 = {}
csv2["example.com."] = "db.example.com"
csv2["example.net."] = "db.example.net"

# 同じ内容でよいドメインは共通のファイルを指す
csv2["example.org."] = "db.parked"
csv2["example.info."] = "db.parked"

# ゾーン転送を許可する相手(セカンダリの IP)
zone_transfer_acl = "198.51.100.2"

csv2 = {} は辞書の初期化で、ゾーンを追加する行より前に1回だけ書きます。ゾーンの行を書き足すときにこの行まで複製すると、それより前に書いたゾーンが消えた状態になるので注意してください。

ゾーンファイルの名前はドメイン名を含めておくと、ファイルとゾーンの対応が一目で分かります。

ドメインごとのゾーンファイルを書く

/etc/maradns/db.example.com の例です。csv2 形式では、1行に「名前 種類 データ」を書き、最後に ~ を付けます。種類を省略して IP アドレスだけを書くと A レコードとして扱われます。

example.com. SOA ns1.example.com. hostmaster@example.com. 2026101801 7200 3600 604800 1800 ~
example.com. NS ns1.example.com. ~
example.com. NS ns2.example.net. ~
ns1.example.com. 192.0.2.53 ~
example.com. 192.0.2.10 ~
www.example.com. 192.0.2.10 ~
www.example.com. AAAA 2001:db8::10 ~
example.com. MX 10 mail.example.com. ~
mail.example.com. 192.0.2.25 ~
example.com. TXT 'v=spf1 mx -all' ~
api.example.com. +300 192.0.2.11 ~

書き方のポイントは次のとおりです。

  • **~ の扱い**:最初のレコードと2つ目のレコードの間に ~ があると、そのファイルは ~ 区切りとして読まれます。混在させず、全行の末尾に付けるか、まったく使わないかのどちらかに揃えます
  • TTL:+300 のように、種類の前に + 付きの秒数で書きます
  • SOA と NS:省略すると MaraDNS が自動で作りますが、セカンダリへの転送や外部のチェックツールとの整合を考えると、明示しておくほうが扱いやすくなります
  • 名前の末尾のドット:完全修飾名で書き、末尾のドットを付けます

ほかのドメインも同じ形でファイルを作ります。シリアル番号はゾーンごとに管理し、内容を変えたゾーンのシリアルを増やします。セカンダリはこの番号の増加を見て転送の要否を判断します。

同じ内容のドメインを1つのファイルにまとめる

予約だけしているドメインや、すべて同じ Web サーバーに向けるドメインが多い場合、ドメインごとにファイルを作ると管理が大変になります。csv2 形式では、名前の末尾に % を書くと、そのゾーンの名前に置き換えられます。これを使うと、複数のゾーンから同じファイルを指せます。

/etc/maradns/db.parked の例です。

% SOA ns1.example.com. hostmaster@example.com. 2026101801 7200 3600 604800 1800 ~
% NS ns1.example.com. ~
% 192.0.2.80 ~
www.% 192.0.2.80 ~

mararc で example.org. と example.info. がこのファイルを指していれば、www.example.org. と www.example.info. のどちらにも 192.0.2.80 が返ります。共通ファイルを変えると、指しているすべてのゾーンが同時に変わるので、個別の設定が必要になったドメインは専用のファイルに切り出します。% の扱いは版によって細かな差があり得るため、手順の最後に紹介する確認方法で、各ゾーンの答えを1つずつ確かめてください。

ゾーンを追加・削除する手順

ゾーンの追加は、次の順で行います。作業前に mararc とゾーンファイルのディレクトリをバックアップしておきます。

sudo cp -a /etc/mararc /etc/mararc.$(date +%Y%m%d)
sudo cp -a /etc/maradns /root/maradns-backup-$(date +%Y%m%d)

# 1. ゾーンファイルを作る
sudo vi /etc/maradns/db.example.jp

# 2. mararc の csv2 にゾーンを1行追加する
#    csv2["example.jp."] = "db.example.jp"
sudo vi /etc/mararc

# 3. 再起動して反映する(サービス名は導入方法によって異なる)
sudo systemctl restart maradns
journalctl -u maradns -n 30

MaraDNS は、mararc やゾーンファイルに文法の誤りがあると、エラーを出して起動しません。つまり、ゾーンを1つ追加しただけのつもりでも、書き間違いがあると全ゾーンの応答が止まります。ネームサーバーが複数ある構成なら1台ずつ再起動し、1台目の応答を確かめてから次に進みます。

ゾーンの削除は、mararc の該当行を消して再起動します。ゾーンファイルはすぐに消さず、しばらく残しておくと戻すのが簡単です。ドメインを手放す場合は、レジストラ側の NS 設定を先に変えてから MaraDNS のゾーンを消す順にすると、問い合わせに答えられない時間を作らずに済みます。

扱うゾーンやレコードの数が多くなって起動に失敗する場合は、メモリの割り当て上限を決める max_mem の設定も確認します。

起動後に各ゾーンの答えを確かめる

再起動したら、ゾーンごとに SOA と主要なレコードを問い合わせます。MaraDNS には askmara という確認用のコマンドがあり、問い合わせの種類を名前の前に1文字で付けて使います。

askmara Awww.example.com. 192.0.2.53
askmara Awww.example.org. 192.0.2.53

# dig でも確認できる。aa フラグが付いていれば権威を持った応答
dig +norec @192.0.2.53 example.net SOA
dig +norec @192.0.2.53 example.info NS

すべてのゾーンを一度に確かめるには、mararc からゾーン名を取り出して SOA を問い合わせるのが手早い方法です。

grep -oE 'csv2\["[^"]+"\]' /etc/mararc | sed -E 's/csv2\["(.*)"\]/\1/' |
while read -r zone; do
  soa=$(dig +norec +short @192.0.2.53 "$zone" SOA)
  printf '%-20s %s\n' "$zone" "${soa:-応答なし}"
done

SOA が返らないゾーンがあれば、ファイル名の綴りと chroot_dir からの相対パス、ゾーン名の末尾のドットを見直します。

セカンダリへゾーンを転送する

MaraDNS では、ゾーン転送(AXFR)は maradns 本体ではなく、別のプログラムである zoneserver が担当します。mararc の zone_transfer_acl に許可する相手の IP を書き、zoneserver を起動しておくと、セカンダリ(BIND や NSD など)がゾーンを取りに来られます。

注意したいのは、プライマリで更新したことをセカンダリにすぐ知らせる NOTIFY を、MaraDNS が送らない点です。そのため、セカンダリは SOA の refresh の間隔で確認しに来るまで更新を取り込みません。更新を早く反映したい場合は、SOA の refresh を短めにするか、セカンダリ側で手動の再転送を実行します。セカンダリの設定では、ゾーンを追加するたびにセカンダリ側にも同じゾーンを追加する必要があるので、作業手順に組み込んでおきます。

まとめ

  • 複数ゾーンは mararc の csv2 辞書に「ゾーン名とファイル名」を並べて設定します。csv2 = {} は最初に1回だけ書きます。
  • ゾーンファイルは csv2 形式で、~ の使い方を揃え、SOA と NS は明示しておくと扱いやすくなります。
  • 同じ内容のドメインは % を使った共通ファイルにまとめられますが、各ゾーンの答えは個別に確かめます。
  • 反映には再起動が要り、文法の誤りがあると全ゾーンが止まるため、バックアップを取り、1台ずつ再起動します。
  • 転送は zoneserver が担い、NOTIFY は送られないので、セカンダリの反映は SOA の refresh 間隔に左右されます。

お気軽にご相談ください

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