Solaris で DNS サーバ
【関連する外部ページ】
- BIND 9 ドキュメント (ISC): https://bind9.readthedocs.io/
- BIND 9 ダウンロード (ISC): https://www.isc.org/download/
- Oracle Solaris での DNS の管理: https://docs.oracle.com/cd/E23824_01/html/821-1455/dnsref-31.html
設定内容
設定内容は次の通りとする。
- rndc (Remote Name Daemon Controller): 使う
- rndc の鍵ファイル: /etc/rndc.key(アルゴリズムは hmac-sha256)
- ルートサーバに関する情報: BIND 9 に組み込まれたルートヒントを使う
- ローカルホストのゾーンファイル名: localhost.zone, named.local
- ゾーンファイルの配布における外部向きと内部向きの区別: する
- 内部向きのゾーンファイル名: data/db.zone, data/dbrev.rev
- 外部向きのゾーンファイル名: data/public.zone, data/public.rev
- 外部向きのゾーンファイルに記述するホスト: DNS サーバ兼 MX、Web サーバの 2 つのみ
- 統計情報など: data/cache_dump.db, data/named_stats.txt
- ログ出力ファイル: data/named.log, data/security.log
- 上記のファイルが置かれるディレクトリ: /var/named
事前に調べておく事項
- DNS サーバ兼 MX のホスト名
(以下、ホスト名は「dnsmail」のように書く)
- DNS サーバ兼 MX の IP アドレス (以下、「XXX.YYY.ZZZ.160」のように書く)
- Web サーバのホスト名
(以下、ホスト名は「www」のように書く)
- Web サーバの IP アドレス (以下、「XXX.YYY.ZZZ.167」のように書く)
- DNS サーバ兼 MX がある「内部」のネットワークアドレス
(以下、ネットワークアドレスは「XXX.YYY.ZZZ」のように書く)
- DNS ドメイン名 (NIS ドメイン名とは別物である)
(以下、DNS ドメイン名は「mydomain.hoge.com」と書く)
- 上流の DNS サーバの IP アドレス
(以下、上流の DNS サーバの IP アドレスは「AAA.BBB.CCC.10」と書く)
インストール
Solaris 11 では、BIND は IPS パッケージで提供される。 端末を開き、管理者権限で次のコマンドを実行する。
pkg install pkg:/service/network/dns/bind named -v
2026 年時点の ISC の安定版 (ESV) は BIND 9.20 系である。 パッケージのバージョンが古い場合は、次のコマンドで更新する。
pkg update pkg:/service/network/dns/bind
パッケージ版では、実行ファイルは /usr/sbin、SMF サービス名は svc:/network/dns/server:default である。 ソースからビルドした場合、実行ファイルは /usr/local/sbin に置かれる。
ユーザ named とグループ named の追加
パッケージ版では named ユーザが作成されるため、この作業は不要である。 ソースからビルドした場合は、次の手順で作成する。
/usr/sbin/groupadd -g 53 named /usr/sbin/useradd -u 53 -d /var/named -g named -s /bin/false named /usr/bin/passwd -N named
「passwd -N」により、パスワードによるログインができない状態 (shadow ファイルのパスワード欄が NP) になる。
ディレクトリの作成
# /var/run/named は named.pid ファイルが入る mkdir -p /var/run/named # /var/named は各種データファイルが入る (named.conf は /etc/named.conf に作る) mkdir -p /var/named/data chown named:named /var/run/named chown named:named /var/named chown named:named /var/named/data
仮のゾーンファイルの作成とチェック
まず、下記のゾーンファイルの簡単なサンプルを作る。
- /var/named/data/public.zone
- /var/named/data/public.rev
- /var/named/data/db.zone
- /var/named/data/dbrev.rev
正引き
/var/named/data/public.zone と /var/named/data/db.zone を仮に次のように設定する。 ドメイン名の末尾の「.」は必要である。
cd /var/named/data
vi public.zone
# 以下のように設定
----------------------------------------------------------------------------
$TTL 86400
@ IN SOA dnsmail.mydomain.hoge.com. root.mydomain.hoge.com. (
2026051601 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS dnsmail.mydomain.hoge.com.
IN MX 10 dnsmail.mydomain.hoge.com.
@ IN A XXX.YYY.ZZZ.160
dnsmail IN A XXX.YYY.ZZZ.160
www IN A XXX.YYY.ZZZ.167
----------------------------------------------------------------------------
cp public.zone db.zone
内部向きの db.zone には、グローバル IP を持つ機器の A レコードを追加していく。
逆引き
/var/named/data/public.rev と /var/named/data/dbrev.rev を仮に次のように設定する。
cd /var/named/data
vi public.rev
# 以下のように設定
----------------------------------------------------------------------------
$TTL 86400
@ IN SOA dnsmail.mydomain.hoge.com. root.mydomain.hoge.com. (
2026051601 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS dnsmail.mydomain.hoge.com.
160 IN PTR dnsmail.mydomain.hoge.com.
167 IN PTR www.mydomain.hoge.com.
----------------------------------------------------------------------------
cp public.rev dbrev.rev
データファイルのオーナとパーミッションの設定
chown named:named /var/named/data/* chmod 400 /var/named/data/public.zone chmod 400 /var/named/data/public.rev chmod 400 /var/named/data/db.zone chmod 400 /var/named/data/dbrev.rev
チェック
ネットワーク関係の設定ミス、named のインストールのミス、 public.zone と public.rev の記述ミスを下記の手順でチェックする。
この手順で、仮の DNS サーバが立ち上がる。この仮の DNS サーバは public.zone と public.rev を使うが、db.zone と dbrev.rev は使わない。
- /etc/resolv.conf のチェック
今設定を行っているマシンの IP アドレスが「nameserver」の行に正しく記述されていることを確認する。 端末で次のコマンドを実行する。
cat /etc/resolv.conf
- /etc/named.conf の作成
端末で次のコマンドを実行し、仮の named.conf を作る。
vi /etc/named.conf # 以下のように設定 ---------------------------------------------------------------------------- options { directory "/var/named"; pid-file "/var/run/named/named.pid"; }; // mydomain.hoge.com <-> XXX.YYY.ZZZ zone "mydomain.hoge.com" IN { type master; file "data/public.zone"; allow-query { any; }; }; zone "ZZZ.YYY.XXX.in-addr.arpa" IN { type master; file "data/public.rev"; allow-query { any; }; }; ---------------------------------------------------------------------------- - チェックツールで named.conf の内容をチェックする
エラーが出たら named.conf を書き直す。端末で次のコマンドを実行する。
/usr/sbin/named-checkconf /etc/named.conf
- チェックツールで public.zone と public.rev をチェックする
named-checkzone の第 1 引数はゾーン名である。 エラーが出たら public.zone、public.rev を書き直す。端末で次のコマンドを実行する。
/usr/sbin/named-checkzone mydomain.hoge.com /var/named/data/public.zone /usr/sbin/named-checkzone ZZZ.YYY.XXX.in-addr.arpa /var/named/data/public.rev
- DNS サーバの起動の試み
デバッグモードで起動し、エラーが出ないことを確認する。 エラーが出たら、関係する設定ファイル (ここでは named.conf, public.zone, public.rev) を見直す。 端末で次のコマンドを実行する。
pkill named /usr/sbin/named -g -u named -c /etc/named.conf -d 1
「-g」を付けると、フォアグラウンドで動作し、ログが端末に表示される。 確認が済んだら Ctrl-C で停止する。
named.conf の設定とチェック
- named.conf の設定上の留意事項
- options ブロックは 1 つだけ書く
- 「directory "/var/named";」でデータファイルの基準ディレクトリを指定する
- 「version none;」で BIND のバージョンを応答しないようにする
- allow-recursion: 外部からの再帰問い合わせ (recursive query) を拒否する
- allow-transfer: 外部からのゾーン転送要求 (ゾーン内のレコード一覧の取得) を拒否する
named.conf の options ブロックの中で次のように設定する。
options { (他の設定) allow-recursion { 127.0.0.1; XXX.YYY.ZZZ.0/24; }; (他の設定) };この設定により、外部からの再帰問い合わせが拒否され、 自分が管理しているゾーンの情報とキャッシュ済みの情報以外は返さなくなる。 つまり、組織の外から「組織の外のドメインを問い合わせる要求」が来たときに、再帰問い合わせを行わない。 組織の内から来た要求に対しては、再帰問い合わせを行う。
- dnssec-validation auto;: DNSSEC の検証を有効にする
- forwarders: 転送先を指定する。ルータが DNS の代理応答機能を持つときはそのアドレスを書く。 あるいは上流の DNS サーバの IP アドレスを書く
- view "internal" で内部向きのゾーン、view "external" で外部向きのゾーンを定める。 view を使う場合、すべてのゾーンをいずれかの view の中に書く
- zone "." (type hint): ルートサーバの情報。BIND 9 は組み込みのルートヒントを持つため、この記述は省略できる
- rndc の鍵を作成する
named.conf の中で鍵を参照するため、先に鍵ファイルを作る。端末で次のコマンドを実行する。
/usr/sbin/rndc-confgen -a -A hmac-sha256 chown named:named /etc/rndc.key chmod 400 /etc/rndc.key cat /etc/rndc.key
- named.conf を次のように設定する
cd /etc vi named.conf # 以下のように設定 # XXX.YYY.ZZZ, ZZZ.YYY.XXX -> DNSサーバ兼MXがある「内部」のネットワークアドレスのこと # AAA.BBB.CCC.10 -> 上流の DNS サーバの IP アドレスのこと # mydomain.hoge.com -> DNS ドメイン名のこと ---------------------------------------------------------------------------- // // named.conf // include "/etc/rndc.key"; options { directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; pid-file "/var/run/named/named.pid"; version none; dnssec-validation auto; allow-recursion { 127.0.0.1; XXX.YYY.ZZZ.0/24; }; allow-transfer { none; }; forwarders { AAA.BBB.CCC.10; }; }; controls { inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; }; }; // logging logging { channel namedlog { file "data/named.log" versions 3 size 5m; print-time yes; print-category yes; print-severity yes; severity info; }; channel securitylog { file "data/security.log" versions 3 size 5m; print-time yes; severity info; }; category default { default_syslog; namedlog; }; category security { default_syslog; securitylog; }; }; view "internal" { match-clients { XXX.YYY.ZZZ.0/24; 127.0.0.1; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; allow-update { none; }; }; // mydomain.hoge.com <-> XXX.YYY.ZZZ zone "mydomain.hoge.com" IN { type master; file "data/db.zone"; allow-update { none; }; }; zone "ZZZ.YYY.XXX.in-addr.arpa" IN { type master; file "data/dbrev.rev"; allow-update { none; }; }; }; view "external" { match-clients { any; }; recursion no; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; allow-update { none; }; }; // mydomain.hoge.com <-> XXX.YYY.ZZZ zone "mydomain.hoge.com" IN { type master; file "data/public.zone"; allow-query { any; }; }; zone "ZZZ.YYY.XXX.in-addr.arpa" IN { type master; file "data/public.rev"; allow-query { any; }; }; }; ---------------------------------------------------------------------------- - チェックツールで named.conf の内容をチェックする
エラーが出たら named.conf を書き直す。端末で次のコマンドを実行する。
/usr/sbin/named-checkconf /etc/named.conf
- チェックツールで db.zone と dbrev.rev をチェックする
エラーが出たら db.zone、dbrev.rev を書き直す。端末で次のコマンドを実行する。
/usr/sbin/named-checkzone mydomain.hoge.com /var/named/data/db.zone /usr/sbin/named-checkzone ZZZ.YYY.XXX.in-addr.arpa /var/named/data/dbrev.rev
- localhost.zone, named.local の作成
/var/named/localhost.zone と /var/named/named.local を作成し、 チェックツールでチェックする。端末で次のコマンドを実行する。
/usr/sbin/named-checkzone localhost /var/named/localhost.zone /usr/sbin/named-checkzone 0.0.127.in-addr.arpa /var/named/named.local
- 起動チェック
最初はデバッグモードで起動し、ログにエラーが出ていないことを確認する。 端末で次のコマンドを実行する。
pkill named /usr/sbin/named -g -u named -c /etc/named.conf -d 1
オプションの意味は次の通り。
- -g: フォアグラウンドで動作し、ログを端末に出力する
- -u: named の実行ユーザ (ここでは named にする)
- -c: named.conf の場所 (ここでは /etc/named.conf にする)
- -d: デバッグレベル
確認が済んだら Ctrl-C で停止する。
- SMF サービスとしての起動
デバッグモードでの確認が済んだら、SMF サービスとして起動する。端末で次のコマンドを実行する。
svcadm enable svc:/network/dns/server:default svcs -x svc:/network/dns/server:default cat /var/named/data/named.log
「cat /var/named/data/named.log」の結果を見て、エラーが出ていないことを確認する。
- rndc との通信ができていることのチェック
端末で次のコマンドを実行する。
rndc status # エラーが無く、「server is up and running」という行が出てくることを確認
- パケットフィルタの設定
53/UDP は通常の名前解決に使われ、53/TCP は応答が大きい場合の名前解決とゾーン転送に使われる。 Solaris 11.4 の Packet Filter (PF) で、外部に公開するポートを 53/UDP と 53/TCP に限定する。 設定ファイルは /etc/firewall/pf.conf である。設定後、端末で次のコマンドを実行する。
svcadm enable svc:/network/firewall:default pfctl -s rules
ゾーン転送の制限は、named.conf の allow-transfer でも行う。 セカンダリ DNS サーバがある場合は、そのアドレスのみを allow-transfer に列挙する。
rndc についての補足説明
rndc には次の 2 つのファイルが関係する。
- /etc/rndc.key: named と rndc が共有する鍵。named.conf から include して使う
- /etc/rndc.conf: rndc コマンド側の設定。rndc.key を使う場合は不要である
rndc.key を rndc-confgen で作り直した場合は、named を再起動する。端末で次のコマンドを実行する。
svcadm restart svc:/network/dns/server:default rndc status
演習項目
dig, host の使い方の練習
dig
- 下記の手順で、正引きをテストする
dig @<DNSサーバのIPアドレス> <調べたいホスト名>
- 下記の手順で、逆引きをテストする
dig @<DNSサーバのIPアドレス> -x <調べたいIPアドレス> ptr
- チェック項目
;; ->>HEADER<<- の部分で ・status: が NOERROR である status: はサーバからの応答の状態を表す NOERROR:DNS サーバが正常に応答した NXDOMAIN:問い合わせたドメインは存在しない SERVFAIL:DNS サーバが正しく応答しなかった ・flags: に qr, aa がある。内部マシンから dig をした場合は ra もある flags: には次の 5 つがある qr:クエリへの応答である aa:権威のある応答である tc:応答が長いため切り捨てられた ra:サーバが再帰問い合わせ可能である rd:再帰問い合わせを希望する ・ANSWER: が 1 以上である ANSWER: は問い合わせに対する応答の数を示す ;; ANSWER SECTION: がゾーンファイルに設定した通りである
- 外部向きの設定を確認する
外部のネットワークにあるマシンから dig を実行し、 public.zone に書いたホストのみが応答され、 再帰問い合わせが拒否される (status: REFUSED になる) ことを確認する。
dig @<DNSサーバのIPアドレス> www.mydomain.hoge.com dig @<DNSサーバのIPアドレス> www.example.com
host
簡単な確認には host コマンドを使う。端末で次のコマンドを実行する。
host <調べたいホスト名> <DNSサーバのIPアドレス> host <調べたいIPアドレス> <DNSサーバのIPアドレス>
ゾーンファイル db.zone, dbrev.rev のメンテナンス
グローバル IP を持つマシンを追加、削除するときの、 ゾーンファイル db.zone, dbrev.rev のメンテナンス手順は次の通り。
- ゾーンファイルに変更を加える前に、バックアップを取る
cd /var/named/data cp db.zone db.zone.back20260426 <-- その日の日付 cp dbrev.rev dbrev.rev.back20260426 <-- その日の日付
- db.zone の A レコードを追加、削除する
// A レコードの記述例 hostname IN A XXX.YYY.ZZZ.200
- dbrev.rev の PTR レコードを追加、削除する
// PTR レコードの記述例 200 IN PTR hostname.mydomain.hoge.com.
- SOA レコードのシリアル番号を更新する
シリアル番号は次のようにする。
2026042601 "更新した年月日 + その日の更新回数"
- チェックツールでゾーンファイルをチェックする。端末で次のコマンドを実行する
/usr/sbin/named-checkzone mydomain.hoge.com /var/named/data/db.zone /usr/sbin/named-checkzone ZZZ.YYY.XXX.in-addr.arpa /var/named/data/dbrev.rev
- ゾーンファイルの変更を反映させるため、設定を再読み込みする。端末で次のコマンドを実行する
rndc reload tail /var/named/data/named.log
NS レコードの記述
db.zone、public.zone などでの NS レコードは、末尾に「.」を付けた FQDN で書く。相対名で書くと、ゾーンのドメイン名が補われるため、意図しないホストを指すことがある。
(修正前) (修正後) IN NS hoge1 → IN NS hoge1.mydomain.hoge.com. IN NS hoge2 → IN NS hoge2.mydomain.hoge.com. IN NS hoge3 → IN NS hoge3.mydomain.hoge.com.
rndc による運用
- 設定ファイルとゾーンファイルを再読み込みする。キャッシュデータは保持される
rndc reload # ログファイルを見てエラーが無いことを確認する tail /var/named/data/named.log
- キャッシュをファイルにダンプする
出力先は named.conf の options 中の dump-file で定義する。 定義していない場合は、作業ディレクトリの named_dump.db に出力される。
rndc dumpdb # 出力結果を確認 cat /var/named/data/cache_dump.db
- キャッシュをすべて消去する
rndc flush # キャッシュをファイルに出力し、消去されたことを確認する rndc dumpdb cat /var/named/data/cache_dump.db
- サーバの統計情報をファイルにダンプする
出力先は named.conf の options 中の statistics-file で定義する。 定義していない場合は、作業ディレクトリの named.stats に出力される。
rndc stats # 出力結果を確認 cat /var/named/data/named_stats.txt
出力結果の主な項目の意味は次の通り。
success 問い合わせに成功したクエリ数 referral 問い合わせに対し委任先を返したクエリ数 nxrrset 問い合わせたレコード型が存在しなかったクエリ数 nxdomain 問い合わせたドメイン名やホスト名が存在しなかったクエリ数 recursion 再帰問い合わせを行ったクエリ数 failure エラーとなったクエリ数
本番設定への移行
以上の演習が済んだら、仮に設定したゾーンファイルを実際の内容に書き換える。 その後、named-checkconf と named-checkzone でチェックし、rndc reload で反映し、 dig による動作確認を再度行う。
- 参考 Web ページ: Solaris での DNS サーバテスト手順