最新更新日 2002.07.01.


bind-9.2.0 にはセキュリティホールが発見されています。bind-9.2.1 を使う様にしましょう。ここで書いている内容はそのまま bind-9.2.1 にも当てはまりますのでご安心ください。

BIND9 を使おう〜BIND9 の新機能
 某所で似たようなタイトルを見たかもしれませんが、覚え書き程度にこっちにも書いておきます。ISC から bind-9.2.0 が出ました。このバージョンでは rndc 関連の設定が揃ってないと、起動はしますが、syslog で怒られるようになりました。この辺りに付いてちょっと書いていきたいと思います。

bind-9.2.0 のインストール
 ISC の bind9 を利用しますが、ISC の FTP サイトやそのミラーサイト(例えば ftp://ftp.kyushu-u.ac.jp/pub/Net/isc/bind9/9.2.0/ など)から bind-9.2.0.tar.gz を取得し、以下の要領でインストールします。

----------------
% ftp -a ftp://ftp.kyushu-u.ac.jp/pub/Net/isc/bind9/9.2.0/bind-9.2.0.tar.gz
% tar xvzfp bind-9.2.0.tar.gz
% cd bind-9.2.0
% ./configure --prefix=/usr/local/bind9 --enable-ipv6 --with-openssl=yes
% make
% su
# make install
----------------

 configure のオプションについてですが、今回は、FreeBSD に既に用意されている named を上書きするのではなく、新たに /usr/local/bind9 と言うディレクトリを作成し、そこにインストールするするようにしています。また、その時IPv6 を利用できるようにするオプションも当然指定します;-)。

 bind9 は OpenSSL を必要とするので --with-openssl を指定します。FreeBSD では標準で組み込まれているので yes と指定します。このオプションを指定しない場合は、internal な openssl を使います。後は make;make install して終わりです。

 FreeBSD の起動時に、named が既に起動するように /etc/rc.conf などで指定している場合には以下のように書き換えます。オプションは user bind で起動して、"-d 2" でデバッグレベルを 2 として ログを残す様に指定しています。

----------------
named_enable="YES"
named_program="/usr/local/bind9/sbin/named"
named_flags="-c /etc/namedb/named.conf -u bind -d 2"
----------------

 以上でインストールと起動の準備は終わりです。続いて基本的な named.conf の設定を見ていきましょう。

/etc/namedb/named.conf の設定
 基本的スタンツは以下の要領でしょうか。コメントを書き込んでおくので参考にしてください。また、各、ゾーンファイルの設定に付いては過去に書いているのでそちらを参考にしてください。

----------------
//
// named.conf
//
// #--- アクセスコントロールの設定 ---#
acl "allowed-hosts" {
        0.0.0.0;
        127.0.0.1;
        192.168.1.0/24;
        3ffe:505:2019:1500::/64;
        fe80::/64;
};

// #--- オプションの設定 ---#
options {
        directory       "/etc/namedb";
        pid-file        "/etc/namedb/named.pid";
        auth-nxdomain   no;

        listen-on-v6    { any; };   // IPv6 Ready
        allow-transfer  { allowed-hosts; };
        allow-query     { allowed-hosts; };
};

// #--- rndc 用の設定 ---#
controls {
      inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { "rndc-key"; };
      inet ::1       port 953 allow { ::1; }       keys { "rndc-key"; };
};

// #--- ログ出力の設定 ---#
logging {
        channel default_debug {

// /var/log/named.log と言うファイルに出力して 4 世代で管理してそのファ
// イルサイズが 3MByte になったら世代を新しくすると言う設定
                file            "/var/log/named.log" versions 4 size 3m;
                severity        dynamic;
                print-time      yes;
                print-category  yes;
        };
        category default {
                default_debug;
        };
        category xfer-in {
                default_debug;
        };
        category xfer-out {
                default_debug;
        };
};

// #--- ゾーンファイルのの設定 ---#
zone "." { type hint;
        file "root.cache";
};

zone "localhost" {
        type master;
        file "localhost.zone";
};

zone "0.0.127.in-addr.arpa" {
        type master;
        file "0.0.127.zone";
};

zone "1.168.192.in-addr.arpa" { 
        type slave;
        file "1.168.192.zone";
        masters { 192.168.1.53; };
};
zone "running-dog.net" { 
        type slave;
        file "running-dog.net.zone";

// IPv6 でゾーン転送している
        masters { 3ffe:505:2019:2000::53; };
};


// 3ffe:505:2019:1:/64
zone "1.0.0.0.9.1.0.2.5.0.5.0.e.f.f.3.IP6.INT" {
        type slave;
        file "1.0.0.0.9.1.0.2.5.0.5.0.e.f.f.3.IP6.zone";
        masters { 3ffe:505:2019:1::1; };
};
----------------

root.cache の準備
 全てのドメインを管理する基本となる DNS サーバ(ルートネームサーバ)が記述されたヒントファイルが必要となります。以前、このファイルは InterNIC や JPNIC の FTP サイトからダウンロードしていましたが、現在では dig と言うコマンドで生成することが可能です。

----------------
# /usr/local/bind9/bin/dig @A.ROOT-SERVERS.NET. > /etc/namedb/root.cache
----------------

 dig コマンドを実行しますが、オプションとして "@ルートサーバ名" を指定すると一覧が表示されます。これをファイルとして保存すれば root.cache が生成されます。ヒントファイルはルートサーバが増えたり減ったりする度に更新されているので定期的に上記のコマンドでアップデートする事をお勧めします。

named の起動
 通常マシンがブートした時には前述したように /etc/rc.conf から named が起動されますが、ゾーンファイルを変更した時などには named をリロードする必要があります。bind8 の頃は ndc と言うコマンドで start/stop/reload などを行っていましたが bind9 からはこの機能が拡張された rndc と言うコマンドが用意されています。そして、bind-9.1.3 の頃は rndc に関係するファイルが無くても特に問題なく起動していたのですが bind-9.2.0 からは

----------------
named[26243]: starting BIND 9.2.0 -c /etc/namedb/named.conf
named[26243]: none:0: open: /usr/local/bind9/etc/rndc.key: file not found
----------------

 こんな感じで syslog で怒られるようになってしまいました。結構うざったいのでこれを消すために rndc.key を生成しましょう。

 rndc コマンドは named との間で TCP により通信を行い処理をしますが、その間はセキュリティを保つために暗号化しています。そために鍵のペアを生成する必要がありますが、鍵を作成するための方法として、bind-9.2.0 からは rndc-confgen と言うコマンドが用意されるようになりました。しかし、dnssec-keygen でも生成は可能となっています。

----------------
# cd /usr/local/bind9
# mkdir etc
# cd etc
# /usr/local/bind9/sbin/rndc-confgen
----------------

 上記の様にコマンドを実行すればどはどはと出力します。なに?プロンプトが返っててこない?ふみふみ。FreeBSD 4 系では確かに返ってこないでしょうな・・。その原因は、/dev/random の乱数のエントロピーが足りないため待たされてしまいます。/etc/rc.conf に rand_irqs="0 1 2 3 4" などと指定して沢山の IRQ を書いて上げるか、rndcontrol -s コマンドを利用して IRQ を与えて上げればプロンプトが返ってくるようになることでしょう。

 そんなこんなで、rndc-confgen で出力された結果をもとに /usr/local/bind9/etc/rndc.key を作成します。そして、前述の named.conf の様に controls ステートメントの設定をして上げましょう。これで起動すると、上記のようなメッセージは出力されなくなることでしょう。

 そして、鍵は人に見られたらまずいので、/usr/local/bind9/etc/ を chmod 700 などしておきましょう。named を bind ユーザで起動する場合は各ファイルのオーナも変更しておきましょう。

----------------
# chown -R bind:bind /etc/namedb
# chown -R bind:bind /usr/local/bind9/etc/
# chmod 700 /usr/local/bind9/etc
# chmod 600 /usr/local/bind9/etc/*
# chown bind:bind /var/log/named.log
----------------

 尚、rndc コマンドはリモートの named に対しても対応しています。named.conf の controls ステートメントをちろっと変更して試してみてください。そして、起動した時には必ず syslog に何かしらのメッセージが出力されるはずなのでそちらでも確認しておきましょう。

リゾルバの設定とテスト
 DNS の設定が終わり、named の起動が完了したらリゾルバの設定と、正しく動作しているかテストする必要があります。/etc/resolv.conf は正しく設定しておきましょう。

 bind9 では基本的に nslookup コマンドは使わないようになりました。とはいえ、/usr/local/bind9/bin/nslookup は用意されています。しかし、実行すると以下のようなメッセージが出力されるようになりました。なので、今後は dig や host などといったコマンドを使うようにしましょう。

----------------
Note:  nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead.  Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
----------------

 ここでは dig について簡単な説明をします。/usr/local/bind9/bin/dig -h として実行するとその詳細が表示されますのでそれに従いオプションを指定します。とはいえ、解りづらいです(^^;;。

----------------
% /usr/local/bind9/bin/dig @localhost A www.icmpv6.org
; <<>> DiG 9.2.0 <<>> A www.icmpv6.org
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47503
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.icmpv6.org.                        IN      A

;; ANSWER SECTION:
www.icmpv6.org.         3600    IN      A       61.115.25.120

;; AUTHORITY SECTION:
icmpv6.org.             3600    IN      NS      ns.imgdive.com.
icmpv6.org.             3600    IN      NS      ns02.icmpv6.org.

;; ADDITIONAL SECTION:
ns02.icmpv6.org.        3600    IN      A       61.115.25.120
ns02.icmpv6.org.        3600    IN      AAAA    3ffe:505:2019:1::1

;; Query time: 18 msec
;; SERVER: 192.168.1.9#53(192.168.1.9)
;; WHEN: Thu Jan 31 14:29:19 2002
;; MSG SIZE  rcvd: 139
----------------

 以下はオプションとその説明です。結果を見ると、ADDITIONAL SECTION で表示されている DNS で持っている ANSWER SECTION のレコードが表示され正しく設定されている事が確認できます。AUTHORITY SECTION ゾーンを持っている DNS のリストです。

----------------
@localhost          先頭に"@"を付加し、ネームサーバを指定します
A/AAAA/PTR          query-typeを指定します。大文字でも小文字でも良いです
www.running-dog.net 調べたいホスト名を指定します
----------------

 IPv6 の逆引きを行う時には 以下の様にするとよいですが長くなり大変です。

----------------
% /usr/local/bind9/bin/dig @localhost PTR  \
    f.b.e.c.2.9.e.f.f.f.7.9.0.6.2.0.0.0.0.1.9.1.0.2.5.0.5.0.e.f.f.3.IP6.INT
----------------

 そんな時にはオプション付けて以下の様にすると非常にらくちんです。

----------------
% /usr/local/bind9/bin/dig @localhost -n -x 3ffe:505:2019:1000::1
----------------

View 機能
 bind-9.2.0 のソースを展開すると README ファイルが有りますが、その一番最初に bind9 での新機能について記述されています。ここでは、view に付いて書きつづってみたいと思います。

 view ステートメントを利用する事により、LAN 内用の設定と、外向け用の設定とに分けて指定することが可能となりました。named は、view ステートメントの各クラス内に指定した "match-clients" と、問い合わせのあった IP アドレスを比較し、どのクラスを利用するかを判断します。

 以下は named.conf の設定例ですが、ループバックアドレスのゾーンファイルの設定や、プライベートアドレスのゾーンファイルの設定は「view ステートメントの "internal" クラス」に指定しました。

 外部に公開してもよいグローバルアドレスが記述されている running-dog.net ドメインのゾーンファイルは running-dog.net.external.zone として「view ステートメントの "external" クラス」に指定します。

 running-dog.net ドメインのゾーンファイルは "internal" クラスと "external" クラスの両方にありますが、"internal" クラスに指定してあるゾーンファイルは LAN 内用のファイル。"external" クラスに指定してあるゾーンファイルは外向け用のファイルになります。

----------------
//
// named.conf
//
// #--- LAN 側のアクセスコントロールの設定 ---#
acl "allowed-hosts" {
        0.0.0.0;
        127.0.0.1;
        192.168.1.0/24;
        3ffe:505:2019:1500::/64;
        fe80::/64;
};

// #--- 外側のアクセスコントロールの設定 ---#
acl "allowed-hosts-external" {
        211.10.14.0/24;
        3ffe:505:2019:2500::/64;
};

// #--- オプションの設定 ---#
options {
        directory       "/etc/namedb";
        pid-file        "/etc/namedb/named.pid";
        auth-nxdomain   no;

        listen-on-v6    { any; };
        allow-transfer  { allowed-hosts; };
        allow-query     { allowed-hosts; };
};

// #---  LAN 側のゾーンファイルの設定 ---#
view "internal" {
        match-clients   { allowed-hosts; };
        allow-transfer  { allowed-hosts; };
        allow-query     { allowed-hosts; };
        recursion       yes;

        zone "." {
                type hint;
                file "root.cache";
        };

        zone "localhost" {
                type master;
                file "localhost.zone";
        };

        zone "0.0.127.in-addr.arpa" {
                type master;
                file "0.0.127.zone";
        };

        zone "1.168.192.in-addr.arpa" {
                type master;
                file "1.168.192.zone";
        };

        zone "running-dog.net" {
                type master;
                file "running-dog.net.internal.zone";
        };

        zone "0.0.5.1.9.1.0.2.5.0.5.0.e.f.f.3.IP6.INT" {
                type master;
                file "0.0.5.1.9.1.0.2.5.0.5.0.e.f.f.3.IP6.internal.zone";
        };
};

// #---  外側のゾーンファイルの設定 ---#
view "external" {
        match-clients   { any; };
        allow-query     { any; };
        allow-transfer  { allowed-hosts-external; };
        recursion no;

        zone "running-dog.net" {
                type master;
                file "running-dog.net.external.zone";
        };

        zone "0.0.5.1.9.1.0.2.5.0.5.0.e.f.f.3.IP6.INT" {
                type master;
                file "0.0.5.1.9.1.0.2.5.0.5.0.e.f.f.3.IP6.external.zone";
        };
};
----------------

 今回は、bind9 の新機能について駆け足で進んできましたがいかがだったでしょうか。bind-9.2.0 がリリースされ 9.1.3 とはちょっと変更になった部分もありましたが、bind8 に比べて充実した機能とセキュリティ的に見てもより高い安全性が考慮された bind9。これを機にお手元の DNS をバージョンアップしてみてはいかがでしょうか。



Copyright (c) 1997-2004 takachan@running-dog.net All Rights Reserved.