金子邦彦研究室インストールSolarisSolaris で DNS サーバ

Solaris で DNS サーバ

Solaris 上で DNS サーバを動かし, 順引き、逆引きを行なえる ようにします。

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

関連する外部ページ】: http://www.atmarkit.co.jp/flinux/index/indexfiles/index-linux.html

参考にした Web ページ: http://www.fkimura.com/bind9-3.html(現存しない)

関連する外部ページ】: http://www.asahi-net.or.jp/~aa4t-nngk/bind93.html

設定内容

設定内容は次の通り、案を定める

事前に調べておく事項

  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 で bind バージョンアップ」の Web ページなどを参考に、最新の bind をインストールします。

ユーザ bind とグループ bind の追加

次の手順で作成する.

/usr/sbin/groupadd -g 53 named
/usr/sbin/useradd -u 53 -d /var/named -g named  named

その後、vipw で bind ユーザについては、パスワードなし、シェルなしに設 定

ディレクトリの作成

  # /var/run/named は named.pid ファイルが入る
mkdir /var/run/named
  # /var/named は各種データファイルファイルが入る (named.conf は
  # /etc/named.conf に作る)
mkdir /var/named
mkdir /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, db.name を作りま す。次に、named.conf を設定して、public.zone, public.rev を使うように します。その後、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。db.zone, db.name を使うような設定は後回しです。

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

  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.(
                                      2006051601 ; 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
hohoge  IN A     AAA.BBB.CCC.10
----------------------------------------------------------------------------
cp public.zone db.zone

逆引き

/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.(
                                      2006051601 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS    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 のチェック

    cat /etc/resolv.conf で、今設定を行なっているマシンの IP アドレスが、 「nameserver」の行に、正しく記述されていることを確認.

    cat /etc/resolv.conf
    
  2. /etc/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/local/sbin/named-checkconf /etc/named.conf
    
  4. チェックツールで, public.zone, public.rev をチェック

    エラーが出たら、public.zone, public.rev を書き直す。

    /usr/local/sbin/named-checkzone localhost /var/named/data/public.zone
    /usr/local/sbin/named-checkzone 127.0.0.1 /var/named/data/public.rev
    /usr/local/sbin/named-checkzone dnsmail /var/named/data/public.zone
    /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.160 /var/named/data/public.rev
    /usr/local/sbin/named-checkzone www /var/named/data/public.zone
    /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.167 /var/named/data/public.rev
    
  5. DNS サーバの起動の試み

    DNS サーバ起動時にエラーが出たら、関係する設定ファイル (ここでは、named.conf, public.zone, public.rev) を見直すとともに、「cat /var/adm/messages | grep named 」で エラーメッセージを確認

    pkill named
    /usr/sbin/named -u named -c /etc/named.conf -d 1
    cat /var/adm/messages | grep named
    

named.conf の設定とチェック

ここでの手順では、named.conf を設定して、先ほど作った仮のゾーンファイ ル public.zone, public.rev, db.zone, db.name を4つとも使うようにします。 ここでも、実際に DNS サーバを起動して、ごく簡単なチェックまでを 行ないます。

  1. named.conf の設定上の留意事項

    設定ファイル /etc/named.conf の注意事項

    1. options 内の記述
      options 行は複数書けない書けないことに注意.
    2. 「directory "/var/named";」
    3. 「version "unknown";」 bind のバージョンの非表示
    4. allow-recursion: 外部からの recursive query を抑止するように設定.
    5. allow-transfer: 外部からのゾーンリクエストパケット(DNS が管理し ているサーバの一覧の取得)を抑止するうううううように設定。

      named.conf ファイルの options 設定の中で

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

      のように設定する. 外部からのrecursive query が抑止され、自分が提供しているドメイン、およ び既に キャッシュされている情報以外は返さないようになる. つまり、組織の外から「組織の外を検索するような要求」が来 たときに、recursive query の実行を抑止する。 なお、組織の内を検索するような要求に対しては recursive query は関係な い。

    6. forwarders: フォーワード先 (ルータが代理 DNS サーバの機能を持つと きはそれを書く. あるいは、上流の DNS サーバの IP アドレスを書く)
      • view "internal" で、内部向きのゾーンファイル配布を定め、 view "external" で、外部向きのゾーンファイル配布を定める。
      • ZONE "." : キャッシュサーバ用の設定
  2. named.conf を次のように設定する

    cd /etc
    vi named.conf
      # 以下のように設定
      # XXX.YYY.ZZZ, ZZZ.YYY.XXX -> DNSサーバ兼MXがある「内部」のネットワークアドレスのこと
      # AAA.BBB.CCC -> 上流の DNS サーバがあるネットワークアドレスのこと
      # mydomain.hoge.com -> DNS ドメイン名のこと
    ----------------------------------------------------------------------------
    //
    // named.conf
    //
    
    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 "unknown";
        allow-recursion {
            127.0.0.1;
            AAA.BBB.CCC.10/24;
        };
        allow-transfer {
            127.0.0.1;
            AAA.BBB.CCC.10/24;
        };
        forwarders {
            AAA.BBB.CCC.10;
        };
        /*
         * If there is a firewall between you and nameservers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
         // query-source address * port 53;
    };
    
    //
    // a caching only nameserver config
    //
    controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
    };
    
    // logging
    logging {
        channel namedlog {
        file "data/named.log";
        print-time yes;
        print-category yes;
        print-severity yes;
        severity info;
        };
        channel securitylog {
        file "data/security.log";
        print-time yes;
        };
        category default {
            default_syslog;
        namedlog;
        default_debug;
        };
        category security {
            default_syslog;
        securitylog;
        };
    };
    
    view "internal" {
        match-clients {
            XXX.YYY.ZZZ.0/24;
            127.0.0.1;
        };
    
    // 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; };     
        };
    
    include "/etc/rndc.key";
    };
    
    view "external" {
        match-clients {
            any;
        };
    
        zone "." IN {
            type hint;
            file "named.ca";
        };
    
        zone "localdomain" IN {
            type master;
            file "localdomain.zone";
            allow-update { none; };
        };
    
        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; };
        };
    
        zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
                type master;
            file "named.ip6.local";
            allow-update { none; };
        };
    
        zone "255.in-addr.arpa" IN {
            type master;
            file "named.broadcast";
            allow-update { none; };
        };
        
        zone "0.in-addr.arpa" IN {
            type master;
            file "named.zero";
            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; };     
        };
        include "/etc/rndc.key";
    };
    ----------------------------------------------------------------------------
    
  3. チェックツールを使って、named.conf ファイルの内容をチェック

    エラーが出たら、named.conf を書き直す。

    /usr/local/sbin/named-checkconf /etc/named.conf
    
  4. チェックツールで, db.zone, dbrev.rev をチェック

    public.zone, public.rev のチェックは済んでいるので、 db.zone, dbrev.rev のチェックを念のために行なう。 エラーが出たら、db.zone, dbrev.rev を書き直す。

    /usr/local/sbin/named-checkzone localhost /var/named/data/db.zone
    /usr/local/sbin/named-checkzone 127.0.0.1 /var/named/data/dbrev.rev
    /usr/local/sbin/named-checkzone dnsmail /var/named/data/db.zone
    /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.160 /var/named/data/dbrev.rev
    /usr/local/sbin/named-checkzone www /var/named/data/db.zone
    /usr/local/sbin/named-checkzone XXX.YYY.ZZZ.167 /var/named/data/dbrev.rev
    
  5. named.cache, localhost.zone, localhost.rev の設定
  6. 起動チェック

    起動チェックのために、最初は、デバッグモードで起動してみる. (起動の前に named の停止を行ないます).

    pkill named
    /usr/sbin/named -u named -c /etc/named.conf -d 1
    cat /var/adm/messages | grep named
    cat /var/named/data/named.log
    
    「cat /var/named/data/named.log」の結果ログが出てきますので、エラー が出ていないことを十分に確認してください。

    参考:

  7. rndc との通信ができていることのチェック
    rndc status
      # エラーが無く、「server is up and running」という行が出てくることを確認
    
  8. /etc/hosts.allow の設定

    TCP wrapper の設定ファイルである /etc/hosts.allow を確認します。

    53/UDP は通常の名前解決に使われ、53/TCP はゾーン転送(プライマリ、セカ ンダリ間)にのみ使われます。 53/TCP のアクセス のアクセスは、XXX.YYY.ZZZ.* のみを許すように設定します。 例えば、次のように設定します。 (ネットワークアドレスの末尾に付ける「.」は忘れないようにしましょう)。

    named: 127.0.0.1
    named: XXX.YYY.ZZZ.
    

rndc についての補足説明

rndc には次の2つの設定ファイルが関係する。 bind のインストールの時点で、次の2つのファイルはすでに作られている。 そのまま使う

演習項目

nslookup, dig の使い方の練習

nslookup

  1. 下記の手順で、ゾーンファイルに記述したホスト名とIPとの対応をテストする
    # nslookup               <--nslookupを起動
    > server <DNSサーバのIPアドレス>   <--問い合わせるDNSサーバを指定
    
    //正引きのテスト方法
    > <ホスト名>                          <--db.zoneに記述したホスト名
    Server:        <DNSサーバのIPアドレス>
    Address:    <DNSサーバのIPアドレス>#<ポート番号>
    
    Name:    <ゾーンファイルに記述したホスト名>
    Address: <対応するIPアドレス>          <--db.zoneに記述したIPが返れば良い
    
  2. 下記の手順で、逆引きをテストする
    > <IPアドレス>                        <--dbrev.revに記述したIP
    Server:        DNSサーバのIPアドレス
    Address:    DNSサーバのIPアドレス#ポート番号
    
    <IPアドレスの逆順>.in-addr.arpa    name=<対応するホスト名>    <--dbrev.revに記述
    したホスト名がFQDN形式で返れば良い
    

nslookup は exit で終了する。

dig

  1. 下記の手順で、正引きをテストする
    dig @<DNSサーバのIPアドレスr> <調べたいホスト名>
    
  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:がゾーンファイルに設定した通りであるかどうか
    

ゾーンファイル db.zone, dbrev.rev のメンテナンス

ゾーンファイルdb.zone, dbrev.revのメンテナンス手順は以下の通り (グローバルIPを持つマシンの追加・削除する場合)。

  1. ゾーンファイルに変更を加える前に、バックアップを取っておく
    # cd /var/named/data
    # cp db.zone db.zone.back060426    <--その日の日付
    # cp dbrev.rev dbrev.rev.back060426  <--その日の日付
    
  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レコードのシリアル番号を更新する. シリアル番号は
     2006042601
     "更新した年月日+その日の更新回数"
    
    のようにする.
  5. ゾーンファイルの変更を反映させるためにnamedの再起動を行う
    # kill -HUP `cat /var/named/chroot/var/run/named/named.pid`
    

rndc 関係

  1. 設定ファイルとゾーンファイルを再読み込みする  ただしキャッシュデータは保持される
    rndc reload
      # ログファイルを見てエラーが無いことを確認する
    tail /var/named/data/named.log
    
  2. キャッシュをファイルにダンプする  出力先はnamed.confのoptions中のdump-fileで定義する  出力先を定義していない場合はワークディレクトリの cache_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.cache, localhost.zone, localhost.rev のチェック

    /usr/named/localhost.rev, /usr/named/localhost.zone, /usr/named/root.cache の3つのファイルの確認は、nslookup を使う。

    % nslookup
    > server dnsserver
    > 127.0.0.1
    
    Name:    localhost
    Address:    127.0.0.1
    
    > localhost
    
    Name:    localhost
    Address:    127.0.0.1
    
    > 198.41.0.4
    
    Name:    a.root-servers.net
    Address 198.41.0.4
    
    > a.root-servers.net
    
    Name:    a.root-servers.net
    Address 198.41.0.4
    
    > exit
    

    198.41.0.4 とは、/usr/named/root.cache に書いてあった IPaddress のひと つである。 期待通りの結果を得られた。

内部向けのゾーンファイルと、外部向けのゾーンファイルが正しく動いていることを bind のコマンドで確認

この項目は「後回し」とする

db.zone, public.zone などでの NSレコードは次のように書くこと(セキュリティ上の理由)

  (修正前)      (修正後)
  IN NS hoge1  → IN NS hoge1.db.is.kyushu-u.ac.jp.
  IN NS hoge2 → IN NS hoge2.db.is.kyushu-u.ac.jp.
  IN NS hoge3 → IN NS hoge3.db.is.kyushu-u.ac.jp.

以上の演習が済んだら、仮に設定されたゾーンファイルを本格的なものに書き換える。その後、DNS 管理コマ ンドについての練習及び DNS サーバの動作確認を再度行なう。

(参考) rndc.conf, rndc.key

Solaris で rndc.conf, rndc.key を自前で書きたい時の手順である。

/usr/local/sbin/rndc-confgen -a
cat /etc/rndc.key
cd /var/tmp
/usr/local/sbin/dnssec-keygen -a hmac-md5 -b 256 -n HOST `hostname` > /var/tmp/id
cat /vat/tmp/id
echo "cat "`cat id`".private" > /var/tmp/id.sh
rm -f /var/tmp/id
rm -rf /etc/rndc.conf
echo "options {" > /etc/rndc.conf
echo "  default-server 127.0.0.1;" >> /etc/rndc.conf
echo "  default-key "\"`hostname`\"";" >> /etc/rndc.conf
echo "}" >> /etc/rndc.conf
echo "server 127.0.0.1{" >> /etc/rndc.conf
echo "  key "\"`hostname`\"";"  >> /etc/rndc.conf
echo "];" >> /etc/rndc.conf
echo "key "\"`hostname`\"" {"  >> /etc/rndc.conf
echo "  algorithm hmac-md5;"  >> /etc/rndc.conf
echo "  secret"\"`sh id.sh | grep Key | sed 's/Key: //g'`\"";"  >> /etc/rndc.conf
echo "};"  >> /etc/rndc.conf
chmod 600 /etc/rndc.conf
chmod 600 /etc/rndc.key
rm -f /var/tmp/*.key
rm -f /var/tmp/*.private