2026年6月13日

2026年6月13日

dnsmasq で複数ゾーンを管理する設定|ローカルドメイン・条件付き転送・権威モードの使い分け

dnsmasq は BIND や NSD のようにゾーンファイルを読み込むサーバーではなく、hosts 形式のデータや設定ファイルの行から答えを作る、キャッシュ付きの転送サーバーです。そのため「複数ゾーンを管理する」といっても、目的によって使う設定が変わります。社内の名前を答えるなら local と host-record、別の DNS サーバーが持つドメインへ振り分けるなら server=/ドメイン/、外部に権威サーバーとして答えるなら auth-zone です。この記事では、この3つを使い分けながら、ドメインごとに設定ファイルを分けて管理する方法を説明します。

内容は dnsmasq 2.8x〜2.9x 系を前提にしています(2026年10月現在)。オプションの細かな挙動は版によって変わることがあるため、dnsmasq --version で手元の版を確かめ、同じ版の man ページと照らし合わせてください。

設定をドメインごとのファイルに分ける

ドメインが増えたときに1つの dnsmasq.conf に書き足していくと、どの行がどのドメインのものか分からなくなります。conf-dir でディレクトリを読み込ませ、ドメインごとにファイルを分けます。

# /etc/dnsmasq.conf
conf-dir=/etc/dnsmasq.d/,*.conf

,*.conf を付けると、拡張子が .conf のファイルだけを読みます。エディタのバックアップファイルや、パッケージ更新で置かれる別名のファイルを誤って読み込むのを防げます。Debian 系のパッケージでは、起動スクリプト側で /etc/dnsmasq.d を読む設定になっている場合があるため、二重に読み込まないかも確認します。

ファイル名は 10-home.arpa.conf、20-corp.example.conf のように、ドメイン名が分かる形にしておくと管理が楽になります。

社内の名前を答える(ローカルドメイン)

社内やご家庭の機器に名前を付けて答える場合の例です。

# /etc/dnsmasq.d/10-home.arpa.conf
local=/home.arpa/
domain=home.arpa
expand-hosts

host-record=nas.home.arpa,192.168.1.10
host-record=printer.home.arpa,192.168.1.20
cname=files.home.arpa,nas.home.arpa
  • **local=/home.arpa/** は、このドメインの問い合わせを上流に転送せず、dnsmasq が持つデータだけで答えるという指定です。データにない名前は「存在しない」と返します。社内の名前が外部の DNS に漏れる問い合わせを減らせます。
  • **domain と expand-hosts** を組み合わせると、/etc/hosts に書いた短い名前(nas など)にドメインを付けた名前でも答えます。DHCP で配るドメイン名にもなります。
  • **host-record** は A(または AAAA)レコードと、逆引きの PTR レコードを一度に作ります。
  • **cname** は別名です。参照先は dnsmasq が自分で知っている名前(hosts や host-record、DHCP で登録された名前など)である必要があります。

ドメイン名には、家庭内なら home.arpa(RFC 8375 で家庭内ネットワーク向けに定められた名前)、社内なら自社で登録しているドメインのサブドメイン(例:internal.example.com)を使うのが安全です。.local はマルチキャスト DNS(mDNS)と衝突するため避けます。登録されていない架空のドメインは、将来誰かが同じ名前を登録すると問い合わせが外へ漏れる原因になります。

address= は「サブドメインすべて」に効く

address=/test.example/192.168.1.50

address= は、指定したドメインだけでなく、そのサブドメインすべて(a.test.example、b.c.test.example など)にも同じアドレスを返します。開発環境のワイルドカードには便利ですが、特定の1件だけを登録したいときに使うと、意図しない名前まで同じアドレスになります。1件ずつ登録するなら host-record を使います。また、address= では逆引きの PTR は作られません。

件数が多いときは hosts 形式のファイルに分ける

名前が数十件を超える場合は、設定ファイルの行ではなく hosts 形式のファイルに分けると、別の仕組みから自動で書き出しやすくなります。

addn-hosts=/etc/dnsmasq.hosts/home.arpa.hosts

hosts ファイルの変更は、dnsmasq に SIGHUP を送ると読み直されます。一方、dnsmasq.conf や conf-dir 内のファイルの変更は SIGHUP では反映されず、再起動が必要です。この違いを知らないと「設定を変えたのに反映されない」と迷う原因になります。

別の DNS サーバーへ振り分ける(条件付き転送)

社内の Active Directory や別の DNS サーバーが持つドメインだけを、そちらへ転送する例です。

# /etc/dnsmasq.d/20-corp.example.conf
server=/corp.example/10.0.0.53
server=/corp.example/10.0.0.54
rev-server=10.0.0.0/16,10.0.0.53
  • **server=/ドメイン/アドレス** は、そのドメインとサブドメインの問い合わせだけを指定の DNS サーバーへ送ります。同じドメインに複数書けば、どちらかが応答しない場合にも名前解決を続けられます。
  • **rev-server** は、指定したネットワークの逆引きを転送します。10.0.0.0/16 の逆引きゾーン名を自分で書く必要がありません。

より長い(具体的な)ドメインの指定が優先されます。たとえば local=/corp.example/ と server=/dev.corp.example/10.0.1.10 を組み合わせると、dev.corp.example だけは転送し、残りは dnsmasq 自身で答える、という設定ができます。

私設アドレスの逆引きを上流へ出さない bogus-priv を使っている場合、rev-server や server= で転送したい私設アドレスの逆引きが期待どおりに転送されているかを、dig -x 10.0.0.10 @127.0.0.1 で確認してください。組み合わせたときの挙動は版によって変わったことがあります。

権威サーバーとして外部に答える(権威モード)

dnsmasq には、限られた範囲で権威 DNS サーバーとして答える機能もあります。内容はゾーンファイルではなく、host-record や hosts、DHCP の情報から作られます。

# /etc/dnsmasq.d/30-auth.conf
auth-server=ns1.example.com,eth0
auth-zone=example.com,192.0.2.0/24
auth-zone=example.net
auth-soa=2026101801,hostmaster.example.com
auth-sec-servers=ns2.example.com
auth-peer=198.51.100.2

host-record=www.example.com,192.0.2.10
host-record=www.example.net,192.0.2.11
  • **auth-server** は、このサーバー自身の名前(NS レコードに載る名前)と、権威モードで答えるインターフェースです。
  • **auth-zone** は、権威として答えるゾーンです。複数行書けば複数のゾーンになります。アドレスの範囲を付けると、その範囲のアドレスだけをゾーンに含め、範囲に対応する逆引きゾーンも答えます。
  • **auth-soa は SOA の値、auth-sec-servers はセカンダリの名前、auth-peer** はゾーン転送を許す相手です。

権威モードは小規模な用途向けです。MX や TXT などのレコードを多く持つゾーン、DNSSEC の署名が必要なゾーン、頻繁に変更するゾーンは、NSD や Knot DNS などの権威サーバーに任せたほうが管理しやすくなります。インターネットに公開する場合は、リゾルバーとしての機能(再帰問い合わせ)を外部に開かないよう、待ち受けるインターフェースと応答する相手を確認します。

変更の反映と確認

# 文法の確認
dnsmasq --test

# 設定ファイルを変えたら再起動
systemctl restart dnsmasq

# hosts 形式のファイルだけ変えたなら読み直し
systemctl reload dnsmasq   # ユニットが対応していない場合は pkill -HUP dnsmasq

# ゾーンごとに確認
dig @127.0.0.1 nas.home.arpa A
dig @127.0.0.1 -x 192.168.1.10
dig @127.0.0.1 intranet.corp.example A
dig @192.0.2.1 www.example.com A +norec

権威モードの確認では +norec を付け、応答に aa(権威を持つ応答)のフラグが立っているかを見ます。思ったとおりに答えない場合は、一時的に log-queries を有効にすると、問い合わせをどこへ転送したかがログに出ます。問い合わせごとにログを書くため、確認が終わったら元に戻します。

変更前の準備

  • /etc/dnsmasq.conf と /etc/dnsmasq.d/ 以下、hosts 形式のファイルをバックアップします。
  • dnsmasq を DHCP サーバーとしても使っている場合、再起動で短時間 DHCP の応答が止まります。利用の少ない時間帯に行います。
  • 新しいドメインのファイルは検証環境か、利用者の少ない端末で確かめてから本番に入れます。

まとめ

  • 社内の名前は local=/ドメイン/ と host-record、別のサーバーが持つドメインは server=/ドメイン/ と rev-server、外部への権威応答は auth-zone を使います。
  • conf-dir=/etc/dnsmasq.d/,*.conf でドメインごとにファイルを分けると、増減を管理しやすくなります。
  • address= はサブドメインすべてに効き、PTR を作りません。1件ずつなら host-record を使います。
  • 設定ファイルの変更は再起動、hosts 形式のファイルの変更は SIGHUP で反映します。

お気軽にご相談ください

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