2026年6月14日

2026年6月14日

MaraDNS のインストール方法|ソースからビルドし、systemd で動かして最初のゾーンが応答するまで

MaraDNS は小さく設定の少ない DNS サーバーで、権威サーバーの maradns と、キャッシュと再帰問い合わせを担当する Deadwood の2つのプログラムに分かれています。ディストリビューションのパッケージが無い、または古いことが多いため、公式に配布されているソースからビルドし、systemd で動かすのが分かりやすい方法です。この記事では、ビルドとインストール、専用ユーザーの作成、mararc とゾーンファイルの最小構成、systemd のユニット、動作確認までを順に説明します。

内容は MaraDNS 3.5 系を前提にしています(2026年10月現在)。MaraDNS は長く続いているソフトウェアですが、近年の開発は不具合や脆弱性の修正が中心です。DNSSEC の署名には対応していないため、DNSSEC が必要なゾーンには NSD や Knot DNS などを選んでください。

始める前に確認すること

  • 用途:インターネットに公開するゾーンを配る(権威サーバー)のか、社内向けのキャッシュリゾルバーにするのかを決めます。権威サーバーなら maradns、リゾルバーなら Deadwood を使います。両方を使う場合は、別々の IP アドレスで待ち受けます。同じアドレスの53番ポートは1つのプログラムしか使えません。
  • 53番ポートの空き:ss -lunpt 'sport = :53' で、systemd-resolved や別の DNS サーバーが同じアドレスで待ち受けていないかを確認します。
  • 検証環境:初めて入れる場合は、本番のネームサーバーとして登録する前に、検証用のサーバーで最後まで手順を通します。

ソースからビルドしてインストールする

ビルドには C コンパイラと make が必要です。

# Debian / Ubuntu の例
sudo apt install build-essential

# RHEL 系の例
sudo dnf install gcc make

ソースは公式サイト(maradns.samiam.org)または作者が公開している GitHub のリポジトリから入手します。配布元で署名やハッシュ値が提供されている場合は、展開前に照合します。ファイル名の版番号は、その時点の最新版に置き換えてください。

tar xf maradns-3.5.XXXX.tar.xz
cd maradns-3.5.XXXX
./configure
make
sudo make install

make install が何をどこに置いたかは、出力に表示されます。版によってインストール先が異なることがあるため、終わったら実際の場所を確認しておきます。後の systemd のユニットで使います。

command -v maradns Deadwood askmara

既存の /etc/mararc がある環境では、インストールで上書きされないかを確認し、事前にバックアップを取ってください。

専用ユーザーとディレクトリを作る

MaraDNS は root で起動して53番ポートを開いた後、設定ファイルで指定したユーザー ID に権限を下げ、指定したディレクトリに閉じこもって(chroot して)動きます。ログインできない専用ユーザーを作り、ゾーンファイルを置くディレクトリを用意します。

sudo useradd --system --no-create-home --shell /usr/sbin/nologin maradns
id -u maradns
id -g maradns
sudo mkdir -p /etc/maradns
sudo chown root:root /etc/maradns
sudo chmod 755 /etc/maradns

ゾーンファイルは maradns が読めれば足り、書き込める必要はありません。ディレクトリとファイルの所有者を root にしておくと、万一プロセスが乗っ取られてもゾーンを書き換えられにくくなります。

mararc とゾーンファイルの最小構成

/etc/mararc は、Python に似た書き方の設定ファイルです。id -u maradns と id -g maradns で調べた番号を入れます(以下の 990 は例です)。

ipv4_bind_addresses = "192.0.2.1"
chroot_dir = "/etc/maradns"
maradns_uid = 990
maradns_gid = 990

csv2 = {}
csv2["example.com."] = "db.example.com"
  • **ipv4_bind_addresses** は待ち受けるアドレスです。0.0.0.0 ではなく、権威サーバーとして使うアドレスを書くと、他の DNS ソフトウェアとの衝突を避けられます。
  • **csv2 = {}** で一覧を作ってから、csv2["ゾーン名."] = "ファイル名" でゾーンを登録します。この行を忘れるとエラーになります。ゾーン名の末尾のドットも必要です。
  • ファイル名は chroot_dir からの相対パスです。この例では /etc/maradns/db.example.com を読みます。

ゾーンファイル /etc/maradns/db.example.com は csv2 という MaraDNS 独自の形式で書きます。

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.com. ~
ns1.example.com.  A    192.0.2.1 ~
ns2.example.com.  A    198.51.100.2 ~
example.com.      A    192.0.2.10 ~
www.example.com.  A    192.0.2.10 ~
example.com.      MX   10 mail.example.com. ~
mail.example.com. A    192.0.2.20 ~

行末の ~ はレコードの区切りです。1つのファイルの中で ~ を使うなら、すべてのレコードに付けます。名前は末尾のドットまで含めた完全な形で書くと、BIND 形式のように $ORIGIN の扱いで迷うことがありません。SOA と NS は書かなくても MaraDNS が補いますが、セカンダリと組み合わせる予定があるなら、シリアル番号を自分で管理できるよう明示しておきます。

systemd で動かす

MaraDNS には、プロセスを裏で動かしてログを syslog に送る duende という補助プログラムが付属していますが、systemd で管理する場合は、前面で動かして systemd にプロセスとログを任せる形が扱いやすくなります。パッケージや同梱のファイルにユニットが用意されている場合はそちらを使い、無ければ次のように作ります。ExecStart のパスは、先ほど command -v で確認した場所に合わせます。

# /etc/systemd/system/maradns.service
[Unit]
Description=MaraDNS authoritative DNS server
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/sbin/maradns -f /etc/mararc
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now maradns
systemctl status maradns
journalctl -u maradns -n 50

起動に失敗する場合、よくある原因は次のとおりです。

  1. 53番ポートが使われている:ログに bind の失敗が出ます。ss -lunp で使っているプロセスを確かめ、待ち受けるアドレスを分けます。
  2. mararc の書き間違い:csv2 = {} の抜け、引用符の閉じ忘れ、ゾーン名の末尾のドットの抜けが多いです。ログに行番号が出る場合はそこを確認します。
  3. ゾーンファイルの書き間違い:~ の付け忘れや、レコードの種類に合わない値です。どの行で止まったかがログに出るので、その前後を見ます。
  4. ファイルが見つからない:csv2 に書いたファイル名が chroot_dir からの相対パスになっているかを確認します。

動作確認

dig @192.0.2.1 www.example.com A +norec
dig @192.0.2.1 example.com MX +norec
askmara Awww.example.com. 192.0.2.1

dig の応答で status: NOERROR と、flags に aa(権威を持つ応答)が付いていれば、権威サーバーとして答えています。登録していない名前を問い合わせて NXDOMAIN が返ることも確認します。

外部から問い合わせを受けるには、ファイアウォールで UDP の53番ポートを開けます。DNS では TCP の53番ポートも使われます。MaraDNS では TCP の問い合わせとゾーン転送は同梱の zoneserver が担当する構成になるため、セカンダリと組み合わせる場合や TCP での問い合わせに応える場合は、zoneserver もあわせて設定します。

最後に、ドメインの登録事業者でネームサーバーをこのサーバーに向けます。切り替える前に TTL を短くしておき、外部の複数の地点から答えを確認すると、問題があったときに戻しやすくなります。

リゾルバーが必要な場合は Deadwood を別に動かす

社内向けのキャッシュリゾルバーが必要な場合は、Deadwood を別のアドレスで動かします。設定ファイルは /etc/dwood3rc です。

bind_address = "127.0.0.1"
recursive_acl = "127.0.0.1/32"
chroot_dir = "/etc/maradns"

recursive_acl で問い合わせを許す相手を自分のネットワークに限ります。インターネット全体に開いたリゾルバーは増幅攻撃に悪用されるため、権威サーバーと同じアドレスで公開しないでください。

まとめ

  • MaraDNS は権威サーバーの maradns と、リゾルバーの Deadwood に分かれています。両方使うなら別のアドレスで待ち受けます。
  • 公式のソースからビルドし、make install の出力でインストール先を確認します。
  • mararc では csv2 = {} の後にゾーンを登録し、ゾーンファイルは chroot_dir からの相対パスで指定します。
  • systemd で前面実行させ、dig +norec で aa フラグ付きの応答を確認してからネームサーバーを切り替えます。

お気軽にご相談ください

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