2026年6月9日
2026年6月9日
NSD で複数ゾーンを管理する設定|pattern と nsd-control addzone で増減を楽にする
NSD で多くのゾーンを扱うときは、ゾーンごとに同じ設定を繰り返し書くのではなく、共通の設定を pattern にまとめ、各ゾーンはその pattern を参照するだけにするのが基本です。さらに nsd-control addzone を使うと、nsd.conf を編集せず、再起動もせずにゾーンを追加・削除できます。この記事では、ディレクトリの設計、pattern の書き方、ゾーンの追加と削除、更新の反映、つまずきやすい点を順に説明します。
内容は NSD 4.x 系を前提にしています(2026年10月現在)。設定項目やコマンドは版によって追加・変更されることがあるため、nsd -v で手元の版を確かめ、同梱の nsd.conf(5) のマニュアルと照らし合わせてください。
ディレクトリと命名規則を先に決める
ゾーンが増えてから並べ方を変えるのは手間がかかります。最初に次の規則を決めておきます。
- ゾーンファイルの置き場所:例として
/etc/nsd/zones/(パッケージによって既定の場所が異なります) - ファイル名:
ゾーン名.zone(例:example.com.zone) - 権限:nsd プロセスが読めること。ゾーン転送で受け取るセカンダリ用のゾーンは、書き込める必要もあります
ファイル名をゾーン名から機械的に決められるようにしておくと、後述する pattern の %s で1行にまとめられます。
基本の nsd.conf
プライマリとして複数ゾーンを配り、セカンダリへ転送する例です。秘密値はダミーです。
server:
ip-address: 192.0.2.1
zonesdir: "/etc/nsd/zones"
remote-control:
control-enable: yes
control-interface: 127.0.0.1
key:
name: "xfr-key"
algorithm: hmac-sha256
secret: "your-base64-secret"
pattern:
name: "primary-common"
zonefile: "%s.zone"
notify: 198.51.100.2 xfr-key
provide-xfr: 198.51.100.2 xfr-key
zone:
name: "example.com"
include-pattern: "primary-common"
zone:
name: "example.net"
include-pattern: "primary-common"
ポイントは次のとおりです。
patternには、ゾーン以外の共通設定(ゾーンファイルの場所、NOTIFY 先、転送の許可)を書きます。zonefileの%sはゾーン名に置き換わります。zonesdirからの相対パスとして扱われるため、この例では/etc/nsd/zones/example.com.zoneを読みます。ゾーンが数千になる場合は、ゾーン名の1文字目に置き換わる%1などを使って"%1/%s.zone"のように階層を分けると、1つのディレクトリにファイルが集中しません。provide-xfrはゾーン転送を許す相手、notifyは更新時に知らせる相手です。どちらも IP と TSIG 鍵の組で書きます。鍵をNOKEYにすると IP だけの許可になりますが、送信元の偽装や設定ミスに弱くなるため、鍵を使うのが一般的です。
設定を書いたら、文法を確認してから反映します。
nsd-checkconf /etc/nsd/nsd.conf
nsd-checkzone example.com /etc/nsd/zones/example.com.zone
systemctl restart nsd
nsd-checkconf は何も表示せずに終われば問題なしです。
セカンダリ用の pattern も分けておく
同じ NSD で、別のプライマリから受け取るゾーンも扱う場合は、用途ごとに pattern を分けます。
pattern:
name: "secondary-from-hidden"
zonefile: "secondary/%s.zone"
request-xfr: 192.0.2.100 xfr-key
allow-notify: 192.0.2.100 xfr-key
request-xfr は「どこからゾーンを取得するか」、allow-notify は「どこからの NOTIFY を受け入れるか」です。受け取ったゾーンは zonefile の場所に書き出されるため、ディレクトリを分けておくと、手で編集するゾーンと自動で更新されるゾーンを取り違えずに済みます。
pattern は別の pattern を include-pattern で取り込めます。たとえば鍵や NOTIFY 先だけを共通の pattern にし、用途別の pattern がそれを取り込む形にすると、セカンダリを1台追加するときに1か所の修正で全ゾーンに反映できます。
nsd-control でゾーンを追加・削除する
nsd.conf にゾーンを書き足すと、反映のために設定の再読み込みや再起動が必要になります。ゾーンの増減が多い場合は、nsd-control を使うほうが手間が少なくなります。
初回だけ、nsd-control が NSD と通信するための鍵と証明書を作ります。
nsd-control-setup
ゾーンの追加は、ゾーン名と使う pattern を指定します。
# 先にゾーンファイルを置き、文法を確認しておく
nsd-checkzone example.org /etc/nsd/zones/example.org.zone
nsd-control addzone example.org primary-common
nsd-control zonestatus example.org
削除は次のとおりです。
nsd-control delzone example.org
ここで知っておきたいのは、addzone で追加したゾーンは nsd.conf ではなく、NSD が管理するゾーン一覧ファイル(zonelistfile で指定。既定の場所はビルドによって異なります)に記録されることです。そのため次の点に注意します。
- 同じゾーンを両方に書かない:nsd.conf に書いたゾーンを addzone でも追加すると、どちらの設定が使われているのか分かりにくくなります。どちらで管理するかをゾーンの種類ごとに決めます。
- pattern は nsd.conf に必要:addzone で指定する pattern は nsd.conf に定義されている必要があります。pattern を消すと、それを使っているゾーンが読み込めなくなります。
- バックアップの対象に含める:nsd.conf だけを保存しても、addzone で足したゾーンの一覧は戻せません。ゾーン一覧ファイルもバックアップの対象にします。
ゾーンを更新したときの反映
ゾーンファイルを編集したら、SOA のシリアル番号を上げてから、そのゾーンだけ読み直します。
nsd-checkzone example.com /etc/nsd/zones/example.com.zone
nsd-control reload example.com
reload にゾーン名を付けないと、変更のあったゾーンファイルをまとめて読み直します。シリアルを上げ忘れると、NSD 自身は新しい内容で答えても、セカンダリは「更新なし」と判断して古い内容を配り続けます。複数のサーバーで答えが食い違う原因として最も多いものです。
pattern の内容(NOTIFY 先や転送の許可)を変えたときは、nsd-control reconfig で設定を読み直せます。ただし、待ち受けるアドレスの変更など一部の項目は再起動しないと反映されないため、変更後に意図どおり動いているかを確認します。
ゾーンが増えたときの確認ポイント
- メモリ:NSD はゾーンをメモリに展開して応答します。ゾーンの数と大きさに応じてメモリが増えるため、
nsd-memでおおよその使用量を見積もってから追加します。 - 状態の一覧:
nsd-control zonestatusをゾーン名なしで実行すると、全ゾーンの状態をまとめて確認できます。セカンダリのゾーンで転送に失敗し続けているものがないかを定期的に見ます。 - ログ:読み込みに失敗したゾーンは、ログ(
journalctl -u nsdなど)に記録されます。文法の誤りがあっても、そのゾーンの新しい内容が反映されないだけで、ほかのゾーンは動き続けることが多いため、気付きにくい点に注意します。 - 登録事業者側の設定:ゾーンを NSD に追加しても、ドメインの登録事業者でネームサーバーをこのサーバーに向けない限り、外部からの問い合わせは来ません。
ゾーンの一覧そのものをセカンダリへ自動で伝えたい場合は、カタログゾーン(RFC 9432)という仕組みがあります。NSD の新しい版では対応が進んでいますが、版ごとの対応範囲を確認してから検討してください。
変更前の準備
- nsd.conf、ゾーンファイル、ゾーン一覧ファイルをバックアップします。
- 新しい pattern やゾーンは、検証環境で
nsd-checkconfとnsd-checkzoneを通してから本番に入れます。 - 本番に反映したら、
dig @192.0.2.1 example.org SOAで応答とシリアルを確認し、セカンダリでも同じシリアルが返るかを見ます。
まとめ
- 共通の設定は pattern にまとめ、ゾーンは
include-patternで参照するだけにします。 zonefile: "%s.zone"のようにゾーン名からファイル名を決めると、設定が短く保てます。- ゾーンの増減が多いときは
nsd-control addzoneとdelzoneを使い、ゾーン一覧ファイルもバックアップに含めます。 - 更新時はシリアルを上げ、
nsd-checkzoneを通してからnsd-control reloadで反映します。