Solaris で DNS サーバ

Solaris 11 上で BIND 9 を動かし、順引きと逆引きを行えるようにする。 外部向きと内部向きを区別し、内向きにはグローバル IP を持つすべての機器についての問い合わせに応じ、 外部向きには DNS サーバ兼 MX と Web サーバについてのみ問い合わせに応じるように設定する。 rndc (Remote Name Daemon Controller) の設定も行う。動作確認まで行う。

関連する外部ページ

設定内容

設定内容は次の通りとする。

事前に調べておく事項

  1. DNS サーバ兼 MX のホスト名

    (以下、ホスト名は「dnsmail」のように書く)

  2. DNS サーバ兼 MX の IP アドレス (以下、「XXX.YYY.ZZZ.160」のように書く)
  3. Web サーバのホスト名

    (以下、ホスト名は「www」のように書く)

  4. Web サーバの IP アドレス (以下、「XXX.YYY.ZZZ.167」のように書く)
  5. DNS サーバ兼 MX がある「内部」のネットワークアドレス

    (以下、ネットワークアドレスは「XXX.YYY.ZZZ」のように書く)

  6. DNS ドメイン名 (NIS ドメイン名とは別物である)

    (以下、DNS ドメイン名は「mydomain.hoge.com」と書く)

  7. 上流の 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

仮のゾーンファイルの作成とチェック

ここでの手順では、仮のゾーンファイル public.zone, public.rev, db.zone, dbrev.rev を作る。 次に、named.conf を設定して public.zone, public.rev を使うようにする。 その後、実際に DNS サーバを起動して簡単なチェックまでを行う。 db.zone, dbrev.rev を使う設定は後の節で行う。

まず、下記のゾーンファイルの簡単なサンプルを作る。

  1. /var/named/data/public.zone
  2. /var/named/data/public.rev
  3. /var/named/data/db.zone
  4. /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 は使わない。

  1. /etc/resolv.conf のチェック

    今設定を行っているマシンの IP アドレスが「nameserver」の行に正しく記述されていることを確認する。 端末で次のコマンドを実行する。

    cat /etc/resolv.conf
    
  2. /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; };
    };
    ----------------------------------------------------------------------------
    
  3. チェックツールで named.conf の内容をチェックする

    エラーが出たら named.conf を書き直す。端末で次のコマンドを実行する。

    /usr/sbin/named-checkconf /etc/named.conf
    
  4. チェックツールで 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
    
  5. 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 を設定して、先ほど作った 4 つのゾーンファイル public.zone, public.rev, db.zone, dbrev.rev をすべて使うようにする。 ここでも、実際に DNS サーバを起動して簡単なチェックまでを行う。
  1. named.conf の設定上の留意事項
    1. options ブロックは 1 つだけ書く
    2. 「directory "/var/named";」でデータファイルの基準ディレクトリを指定する
    3. 「version none;」で BIND のバージョンを応答しないようにする
    4. allow-recursion: 外部からの再帰問い合わせ (recursive query) を拒否する
    5. allow-transfer: 外部からのゾーン転送要求 (ゾーン内のレコード一覧の取得) を拒否する

      named.conf の options ブロックの中で次のように設定する。

      options {
         (他の設定)
         allow-recursion { 127.0.0.1;
                           XXX.YYY.ZZZ.0/24;
         };
         (他の設定)
      };
      

      この設定により、外部からの再帰問い合わせが拒否され、 自分が管理しているゾーンの情報とキャッシュ済みの情報以外は返さなくなる。 つまり、組織の外から「組織の外のドメインを問い合わせる要求」が来たときに、再帰問い合わせを行わない。 組織の内から来た要求に対しては、再帰問い合わせを行う。

    6. dnssec-validation auto;: DNSSEC の検証を有効にする
    7. forwarders: 転送先を指定する。ルータが DNS の代理応答機能を持つときはそのアドレスを書く。 あるいは上流の DNS サーバの IP アドレスを書く
    8. view "internal" で内部向きのゾーン、view "external" で外部向きのゾーンを定める。 view を使う場合、すべてのゾーンをいずれかの view の中に書く
    9. zone "." (type hint): ルートサーバの情報。BIND 9 は組み込みのルートヒントを持つため、この記述は省略できる
  2. 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
    
  3. 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; };
        };
    };
    ----------------------------------------------------------------------------
    
  4. チェックツールで named.conf の内容をチェックする

    エラーが出たら named.conf を書き直す。端末で次のコマンドを実行する。

    /usr/sbin/named-checkconf /etc/named.conf
    
  5. チェックツールで 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
    
  6. 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
    
  7. 起動チェック

    最初はデバッグモードで起動し、ログにエラーが出ていないことを確認する。 端末で次のコマンドを実行する。

    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 で停止する。

  8. 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」の結果を見て、エラーが出ていないことを確認する。

  9. rndc との通信ができていることのチェック

    端末で次のコマンドを実行する。

    rndc status
      # エラーが無く、「server is up and running」という行が出てくることを確認
    
  10. パケットフィルタの設定

    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 つのファイルが関係する。

rndc.key を rndc-confgen で作り直した場合は、named を再起動する。端末で次のコマンドを実行する。

svcadm restart svc:/network/dns/server:default
rndc status

演習項目

dig, host の使い方の練習

dig

  1. 下記の手順で、正引きをテストする
    dig @<DNSサーバのIPアドレス> <調べたいホスト名>
    
  2. 下記の手順で、逆引きをテストする
    dig @<DNSサーバのIPアドレス> -x <調べたいIPアドレス> ptr
    
  3. チェック項目
    ;; ->>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: がゾーンファイルに設定した通りである
    
  4. 外部向きの設定を確認する

    外部のネットワークにあるマシンから 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 のメンテナンス手順は次の通り。

  1. ゾーンファイルに変更を加える前に、バックアップを取る
    cd /var/named/data
    cp db.zone db.zone.back20260426       <-- その日の日付
    cp dbrev.rev dbrev.rev.back20260426   <-- その日の日付
    
  2. db.zone の A レコードを追加、削除する
    // A レコードの記述例
    hostname    IN    A    XXX.YYY.ZZZ.200
    
  3. dbrev.rev の PTR レコードを追加、削除する
    // PTR レコードの記述例
    200         IN    PTR  hostname.mydomain.hoge.com.
    
  4. SOA レコードのシリアル番号を更新する

    シリアル番号は次のようにする。

     2026042601
     "更新した年月日 + その日の更新回数"
    
  5. チェックツールでゾーンファイルをチェックする。端末で次のコマンドを実行する
    /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
    
  6. ゾーンファイルの変更を反映させるため、設定を再読み込みする。端末で次のコマンドを実行する
    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 による運用

  1. 設定ファイルとゾーンファイルを再読み込みする。キャッシュデータは保持される
    rndc reload
      # ログファイルを見てエラーが無いことを確認する
    tail /var/named/data/named.log
    
  2. キャッシュをファイルにダンプする

    出力先は named.conf の options 中の dump-file で定義する。 定義していない場合は、作業ディレクトリの named_dump.db に出力される。

    rndc dumpdb
      # 出力結果を確認
    cat /var/named/data/cache_dump.db
    
  3. キャッシュをすべて消去する
    rndc flush
      # キャッシュをファイルに出力し、消去されたことを確認する
    rndc dumpdb
    cat /var/named/data/cache_dump.db
    
  4. サーバの統計情報をファイルにダンプする

    出力先は 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 による動作確認を再度行う。