DNSサーバ構築手順(BIND 9.10.1-P1ソースインストール + 内部向けDNSキャッシュサーバ構築)

はじめに
===

CentOS 6.6サーバにソースからBIND 9.10.1-P1をインストールし、内部向けのDNSキャッシュサーバ(フルサービスリゾルバ)を構築する手順です。

今回の例では、新しく構築したCentOS 6.6サーバ(BINDがインストールされていないサーバ)に対して、ソースファイルからBIND 9.10.1-P1をインストールする手順について記載致します。

今回構築するDNSサーバの用途
===

今回の例で、BIND 9.10.1-P1をインストールするCentOS 6.6サーバは、プライベートなネットワーク内のマシンやサーバからの名前解決でのみ利用する内部向けDNSキャッシュサーバ(フルサービスリゾルバ)として構築します。

なお、BIND 9.10.1-P1をソースからインストールして、内部向け権威DNSサーバを構築する手順については、以下をご参照下さい。

http://qiita.com/na0AaooQ/items/9ed548dd6db2a0c911c4

参考サイト
===

DNSキャッシュサーバ構築にあたり、以下のページを参考にさせて頂きました。

http://www.atmarkit.co.jp/ait/articles/0101/12/news003.html
https://www.suse.com/ja-jp/documentation/sles10/book_sle_reference/data/sec.dns.named.html
http://www.atmarkit.co.jp/ait/articles/0301/25/news004.html
http://www.atmarkit.co.jp/ait/articles/0311/18/news002.html
http://www.eis.co.jp/bind9_src_build_2/
http://www.eis.co.jp/bind9_src_build_3/
http://park1.wakwak.com/~ima/centos4_bind0001.html
http://jprs.jp/tech/notice/2013-01-07-d-root-ip-address-change.html

BIND 9.10.1-P1のソースファイル
===

今回の例では、ISCから以下のソースファイルをダウンロードして、BINDをインストールします。

ftp://ftp.isc.org/isc/bind9/9.10.1-P1/bind-9.10.1-P1.tar.gz

BIND 9.10.1-P1インストールする環境
===

BIND 9.10.1-P1をインストールするOSは以下になります。

・CentOS release 6.6 (2.6.32-504.3.3.el6.x86_64)

BIND 9.10.1-P1ソースインストール手順
===

新しくOSをインストールしたCentOS 6.6サーバに対して、以下に記載した手順で、BIND 9.10.1-P1をインストールして、DNSキャッシュサーバを構築します。
http://qiita.com/na0AaooQ/items/9ed548dd6db2a0c911c4

権威DNSサーバとDNSキャッシュサーバのインストール手順は共通の部分が多いので、まずは上記手順でBINDサーバをセットアップします。

DNSキャッシュサーバ独自の設定や手順については、後述致します。

BIND 9.10.1-P1によるDNSキャッシュサーバ構築手順
===

・named.confをDNSキャッシュサーバ用に変更します。

以下のようなnamed.confを作成します。

forwardersで指定している「192.51.100.6」は、以下で構築した内部向け権威DNSサーバのIPアドレスです。
http://qiita.com/na0AaooQ/items/9ed548dd6db2a0c911c4

```
[root@dns-bind-cache-server ~]# vi /var/named/chroot/etc/named.conf
```

```BIND:/var/named/chroot/etc/named.conf
Controls {
        inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};

include "/etc/rndc.key";

acl "internal-network" {
        localhost;
        127.0.0.1/32;
        198.51.100.0/24;
        192.0.2.0/24;
        198.51.100.10/32;
        198.51.100.11/32;
        198.51.100.100/32;
        198.51.100.101/32;
        192.51.100.6/32;
        192.51.100.7/32;
};

options {
        version "unknown";
        hostname "ns-cache-1.test.example.com";

        // /var/named/chrootを基点としてパスを指定する
        // /var/named/chroot/var/named のようなパスを指定する場合は/var/namedと指定する。
        directory "/var/named";
        dump-file "/data/cache_dump.db";
        statistics-file "/data/named_status.dat";
        pid-file "/var/run/named/named.pid";

        // DNS名前解決要求を受け付けるネットワークやマシンを制限する。
        // オープンリゾルバにしないよう制限をかける。
        listen-on port 53 {
                internal-network;
        };

        allow-query { internal-network; };

        // 権威DNSサーバとして構築する場合は再帰検索は受け付けないよう制限する
//      recursion no;
//      allow-recursion { none; };

        // DNSキャッシュサーバを構築する場合は再帰検索を受け付けるようにする
        // オープンリゾルバにしないよう制限をかける。
        recursion yes;
        allow-recursion { internal-network; };

        // DNSキャッシュサーバの場合はnoにする。
        notify no;

        // DNSキャッシュサーバ用設定(BINDサーバのメモリサイズやDNSクライアントからの同時接続数等を考慮して適宜調整する事)
        max-ncache-ttl      300;
        max-cache-ttl       3600;
        recursive-clients   300;
        cleaning-interval   60;
        lame-ttl            600;
//      max-cache-size      unlimited;
        max-cache-size      1024m;
        //

        max-transfer-time-in 60;
        transfer-format many-answers;
        transfers-in 10;
        transfers-per-ns 2;
        allow-transfer { none; };

        allow-update { none; };
};

logging {
        channel "log_default"{
                file "/var/log/named.log" versions 5 size 5m;
                print-time yes;
                severity info;
                print-category yes;
        };
        channel "alert" {
                file "/var/log/alert.log" versions 8 size 4m;
                severity  info;
                print-time yes;
                print-severity yes;
                print-category yes;
        };
        channel "query" {
                file "/var/log/query.log" versions 8 size 50m;
                severity  debug;
                print-time yes;
                print-severity yes;
                print-category yes;
        };

        category default {"log_default";};
        category security {"alert";};
        category queries {"query";};
        category lame-servers { null; };
};

zone "." IN {
        type hint;
        file "named.root";
};

zone "localhost." IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "localhost.localdomain." IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa." IN {
        type master;
        file "localhost.rev";
        allow-update { none; };
};

zone "1.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 "localhost.rev";
        allow-update { none; };
};

zone "0.in-addr.arpa." IN {
        type master;
        file "empty.rev";
        allow-update { none; };
};
zone "255.in-addr.arpaa." IN {
        type master;
        file "empty.rev";
        allow-update { none; };
};

zone "test.example.com." IN {
        type forward;
        forwarders { 192.51.100.6; 192.51.100.7; };
};

zone "100.51.192.in-addr.arpa." IN {
        type forward;
        forwarders { 192.51.100.6; 192.51.100.7; };
};
```

```
[root@dns-bind-cache-server ~]# cat /var/named/chroot/etc/named.conf
Controls {
        inet 127.0.0.1 allow { localhost; } keys { rndc-key; };
};

include "/etc/rndc.key";

acl "internal-network" {
        localhost;
        127.0.0.1/32;
        198.51.100.0/24;
        192.0.2.0/24;
        198.51.100.10/32;
        198.51.100.11/32;
        198.51.100.100/32;
        198.51.100.101/32;
        192.51.100.6/32;
        192.51.100.7/32;
};

options {
        version "unknown";
        hostname "ns-cache-1.test.example.com";

        // /var/named/chrootを基点としてパスを指定する
        // /var/named/chroot/var/named のようなパスを指定する場合は/var/namedと指定する。
        directory "/var/named";
        dump-file "/data/cache_dump.db";
        statistics-file "/data/named_status.dat";
        pid-file "/var/run/named/named.pid";

        // DNS名前解決要求を受け付けるネットワークやマシンを制限する。
        // オープンリゾルバにしないよう制限をかける。
        listen-on port 53 {
                internal-network;
        };

        allow-query { internal-network; };

        // 権威DNSサーバとして構築する場合は再帰検索は受け付けないよう制限する
//      recursion no;
//      allow-recursion { none; };

        // DNSキャッシュサーバを構築する場合は再帰検索を受け付けるようにする
        // オープンリゾルバにしないよう制限をかける。
        recursion yes;
        allow-recursion { internal-network; };

        // DNSキャッシュサーバの場合はnoにする。
        notify no;

        // DNSキャッシュサーバ用設定(BINDサーバのメモリサイズやDNSクライアントからの同時接続数等を考慮して適宜調整する事)
        max-ncache-ttl      300;
        max-cache-ttl       3600;
        recursive-clients   300;
        cleaning-interval   60;
        lame-ttl            600;
//      max-cache-size      unlimited;
        max-cache-size      1024m;
        //

        max-transfer-time-in 60;
        transfer-format many-answers;
        transfers-in 10;
        transfers-per-ns 2;
        allow-transfer { none; };

        allow-update { none; };
};

logging {
        channel "log_default"{
                file "/var/log/named.log" versions 5 size 5m;
                print-time yes;
                severity info;
                print-category yes;
        };
        channel "alert" {
                file "/var/log/alert.log" versions 8 size 4m;
                severity  info;
                print-time yes;
                print-severity yes;
                print-category yes;
        };
        channel "query" {
                file "/var/log/query.log" versions 8 size 50m;
                severity  debug;
                print-time yes;
                print-severity yes;
                print-category yes;
        };

        category default {"log_default";};
        category security {"alert";};
        category queries {"query";};
        category lame-servers { null; };
};

zone "." IN {
        type hint;
        file "named.root";
};

zone "localhost." IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "localhost.localdomain." IN {
        type master;
        file "localhost.zone";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa." IN {
        type master;
        file "localhost.rev";
        allow-update { none; };
};

zone "1.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 "localhost.rev";
        allow-update { none; };
};

zone "0.in-addr.arpa." IN {
        type master;
        file "empty.rev";
        allow-update { none; };
};
zone "255.in-addr.arpaa." IN {
        type master;
        file "empty.rev";
        allow-update { none; };
};

zone "test.example.com." IN {
        type forward;
        forwarders { 192.51.100.6; 192.51.100.7; };
};

zone "100.51.192.in-addr.arpa." IN {
        type forward;
        forwarders { 192.51.100.6; 192.51.100.7; };
};
[root@dns-bind-cache-server ~]#
```

・named.confの構文をチェックします。

```
[root@dns-bind-cache-server ~]# /usr/local/sbin/named-checkconf /var/named/chroot/etc/named.conf
[root@dns-bind-cache-server ~]#
```

・不要なゾーンファイルを削除します。

DNSキャッシュサーバから不要なゾーンファイルを削除します。
以下の権威DNSサーバ構築手順を参考にDNSキャッシュサーバを構築した場合、DNSキャッシュサーバとしては、不要なゾーンファイルが出来ていると思います。
http://qiita.com/na0AaooQ/items/9ed548dd6db2a0c911c4

不要なゾーンファイルを削除します。

```
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/var/named/100.51.192.in-addr.arpa.rev
-rw-r--r--. 1 bind bind 538 Jan 30 23:31 /var/named/chroot/var/named/100.51.192.in-addr.arpa.rev
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/var/named/test.example.com.zone
-rw-r--r--. 1 bind bind 689 Jan 30 23:29 /var/named/chroot/var/named/test.example.com.zone
[root@dns-bind-cache-server ~]#
```

```
[root@dns-bind-cache-server ~]# rm -f /var/named/chroot/var/named/100.51.192.in-addr.arpa.rev
[root@dns-bind-cache-server ~]# rm -f /var/named/chroot/var/named/test.example.com.zone
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/var/named/
total 16
-rw-r--r--. 1 bind bind 2172 Jan 30 23:16 named.root
drwxr-xr-x. 5 bind bind 4096 Jan 30 23:16 ..
drwxr-xr-x. 3 bind bind 4096 Jan 30 23:34 chroot
drwxr-xr-x. 3 bind bind 4096 Feb  1 05:07 .
[root@dns-bind-cache-server ~]#
```

・localhost用のzoneファイルを作成します。

recursionを有効化して再帰検索を行うキャッシュDNSサーバにおいては、localhost等の特殊なゾーンに対する名前解決がルートDNSサーバへ飛ばないよう、localhost等のzoneファイルを作成します。

詳細は以下をご参照下さい。
http://www.eis.co.jp/bind9_src_build_3/

```
[root@dns-bind-cache-server ~]# vi /var/named/chroot/var/named/localhost.zone
```

```BIND:localhost.zone
$TTL 1D
@       IN SOA  @ root.localhost. (
        2015012901      ; serial
        1D              ; refresh
        1H              ; retry
        1W              ; expire
        3H              ; minimum
        )
        IN  NS      @

        IN  A       127.0.0.1
        IN  AAAA    ::1
```

```
[root@dns-bind-cache-server ~]# cat /var/named/chroot/var/named/localhost.zone
$TTL 1D
@       IN SOA  @ root.localhost. (
        2015012901      ; serial
        1D              ; refresh
        1H              ; retry
        1W              ; expire
        3H              ; minimum
        )
        IN  NS      @

        IN  A       127.0.0.1
        IN  AAAA    ::1
[root@dns-bind-cache-server ~]#
```

```
[root@dns-bind-cache-server ~]# /usr/local/sbin/named-checkzone localhost /var/named/chroot/var/named/localhost.zone
zone localhost/IN: loaded serial 2015012901
OK
[root@dns-bind-cache-server ~]#
```

・127.0.0.1逆引き用のrevファイルを作成します。

```
[root@dns-bind-cache-server ~]# vi /var/named/chroot/var/named/localhost.rev
```

```BIND:localhost.rev
$TTL 1D
@       IN SOA  @ root.localhost. (
        2015012901      ; serial
        1D              ; refresh
        1H              ; retry
        1W              ; expire
        3H              ; minimum
        )
        IN  NS      localhost.

1       IN  PTR     localhost.
```

```
[root@dns-bind-cache-server ~]# cat /var/named/chroot/var/named/localhost.rev
$TTL 1D
@       IN SOA  @ root.localhost. (
        2015012901      ; serial
        1D              ; refresh
        1H              ; retry
        1W              ; expire
        3H              ; minimum
        )
        IN  NS      localhost.

1       IN  PTR     localhost.
[root@dns-bind-cache-server ~]#
```

```
[root@dns-bind-cache-server ~]# /usr/local/sbin/named-checkzone 0.0.127.in-addr.arpa /var/named/chroot/var/named/localhost.rev
zone 0.0.127.in-addr.arpa/IN: loaded serial 2015012901
OK
[root@dns-bind-cache-server ~]#
```

・255.x.x.xや0.x.x.x等に合致する逆引き用revファイルを作成します。

```
[root@dns-bind-cache-server ~]# vi /var/named/chroot/var/named/empty.rev
```

```BIND:empty.rev
$TTL 1D
@       IN SOA  @ root.localhost. (
        2015012901      ; serial
        1D              ; refresh
        1H              ; retry
        1W              ; expire
        3H              ; minimum
        )
        IN  NS      localhost.
```

```
[root@dns-bind-cache-server ~]# cat /var/named/chroot/var/named/empty.rev
$TTL 1D
@       IN SOA  @ root.localhost. (
        2015012901      ; serial
        1D              ; refresh
        1H              ; retry
        1W              ; expire
        3H              ; minimum
        )
        IN  NS      localhost.
[root@dns-bind-cache-server ~]#
```

```
[root@dns-bind-cache-server ~]# /usr/local/sbin/named-checkzone 255.in-addr.arpa /var/named/chroot/var/named/empty.rev
zone 255.in-addr.arpa/IN: loaded serial 2015012901
OK
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# /usr/local/sbin/named-checkzone 0.in-addr.arpa /var/named/chroot/var/named/empty.rev
zone 0.in-addr.arpa/IN: loaded serial 2015012901
OK
[root@dns-bind-cache-server ~]#
```

・ディレクトリのオーナーとグループ設定。

```
[root@dns-bind-cache-server ~]# chown -R bind:bind /var/named
[root@dns-bind-cache-server ~]#
```

```
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/var/named/
total 28
-rw-r--r--. 1 bind bind 2172 Jan 30 23:16 named.root
drwxr-xr-x. 5 bind bind 4096 Jan 30 23:16 ..
drwxr-xr-x. 3 bind bind 4096 Jan 30 23:34 chroot
-rw-r--r--. 1 bind bind  317 Feb  1 05:49 localhost.zone
-rw-r--r--. 1 bind bind  283 Feb  1 05:49 localhost.rev
-rw-r--r--. 1 bind bind  251 Feb  1 05:57 empty.rev
drwxr-xr-x. 3 bind bind 4096 Feb  1 05:58 .
[root@dns-bind-cache-server ~]#
```

・resolv.confをBINDサーバ自身に変更します。

resolv.confのnameserverの1つ目のサーバには、BINDサーバ(今回構築したDNSキャッシュサーバ)自身を指定します。

DNSキャッシュサーバの場合、再帰検索が可能ですので、resolv.confのnameserver行は1つだけでも、DNSキャッシュサーバとして動作致します。

必要に応じて、nameserver行を追加し、プロバイダ等が提供するDNSフルサービスリゾルバ(DNSキャッシュサーバ)のIPアドレスを追加します。今回の例では、resolv.confのnameserverは1つだけ指定する事にします。

```
[root@dns-bind-cache-server ~]# vi /etc/resolv.conf
search test.example.com
nameserver 127.0.0.1
```

```
[root@dns-bind-cache-server ~]# cat /etc/resolv.conf
search test.example.com
nameserver 127.0.0.1
[root@dns-bind-cache-server ~]#
```

・BINDサーバ上にhintファイル(最新のDNSルートサーバ一覧を記載したhintファイル)を更新するシェルスクリプトを作成します。

hintファイルを更新する場合、rndc reloadやBINDの再起動が必要になります。hintファイル更新時の詳細については、以下をご参照下さい。
http://jprs.jp/tech/notice/2013-01-07-d-root-ip-address-change.html

以下のようなhintファイル更新スクリプトを作成します。

※本番環境のDNSキャッシュサーバを運用する場合、hintファイルが取得できない場合や構文チェックでエラーが起きた場合の判定処理をもう少し強化した方がよいかもしれません。

```
[root@dns-bind-cache-server ~]# vi /usr/local/bin/update_dns_hint_file.sh
```

```BIND:update_dns_hint_file.sh
#!/bin/sh

root_dns_serer="a.root-servers.net"
hint_file="/var/named/chroot/var/named/named.root"

hostname
date

if [ -f ${hint_file} ] ; then

        mv ${hint_file} ${hint_file}.OLD

fi

/usr/local/bin/dig @${root_dns_serer} . ns > ${hint_file}

if [ -f ${hint_file} ] ; then

        chown bind:bind ${hint_file}

        ls -lrta ${hint_file}

        /usr/local/sbin/named-checkzone . ${hint_file}

        /usr/local/sbin/rndc reload

        ps awux | grep -v grep | grep named

fi

date
```

スクリプトに実行権限を付与します。

```
[root@dns-bind-cache-server ~]# chmod 754 /usr/local/bin/update_dns_hint_file.sh
[root@dns-bind-cache-server ~]# chown root:bind /usr/local/bin/update_dns_hint_file.sh
[root@dns-bind-cache-server ~]#
```

・BINDサーバのcrontabの設定。

DNSキャッシュサーバのcrontabに対して、ntpdateによる時刻同期、hintファイルを定期的に更新する処理を追加します。

```
[root@dns-bind-cache-server ~]# crontab -e
　(末尾に以下の処理を追加します)
*/5 * * * * /usr/sbin/ntpdate -s -b ntp.jst.mfeed.ad.jp
30  6 * * * /usr/local/bin/update_dns_hint_file.sh
[root@dns-bind-cache-server ~]#
```

```
[root@dns-bind-cache-server ~]# crontab -l
*/5 * * * * /usr/sbin/ntpdate -s -b ntp.jst.mfeed.ad.jp
30  6 * * * /usr/local/bin/update_dns_hint_file.sh
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# ll /var/named/chroot/var/named/named.root
-rw-r--r--. 1 bind bind 2196 Feb  1 06:30 /var/named/chroot/var/named/named.root
[root@dns-bind-cache-server ~]#
```

・BINDの起動テストを行います。

```
[root@dns-bind-cache-server ~]# hostname
dns-bind-cache-server
[root@dns-bind-cache-server ~]# chown -R bind:bind /var/named
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# /etc/init.d/named stop
Stopping named:                                            [  OK  ]
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# ps awux | grep -v grep | grep named
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# /etc/init.d/named checkconfig
named-checkconf -z -t /var/named/chroot /etc/named.conf
zone localhost/IN: loaded serial 2015012901
zone localhost.localdomain/IN: loaded serial 2015012901
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 2015012901
zone 1.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: loaded serial 2015012901
zone 0.in-addr.arpa/IN: loaded serial 2015012901
zone 255.in-addr.arpaa/IN: loaded serial 2015012901
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# ps awux | grep -v grep | grep named
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# /etc/init.d/named start
Starting named: named-checkconf -z -t /var/named/chroot /etc/named.conf
daemon /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
                                                           [  OK  ]
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# ps awux | grep -v grep | grep named
bind     10735  2.5  1.9 139604 11976 ?        Ssl  06:52   0:00 /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# /etc/init.d/named restart
Stopping named:                                            [  OK  ]
Starting named: named-checkconf -z -t /var/named/chroot /etc/named.conf
daemon /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
                                                           [  OK  ]
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# ps awux | grep -v grep | grep named
bind     10758  2.0  1.9 139604 11976 ?        Ssl  06:53   0:00 /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# /usr/local/sbin/rndc reload
server reload successful
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# /usr/local/sbin/rndc flush
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# ps awux | grep -v grep | grep named
bind     10758  0.3  2.5 139864 15444 ?        Ssl  06:53   0:00 /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
[root@dns-bind-cache-server ~]#
```


BIND動作確認
===

・構築したBINDサーバを指定して、DNSキャッシュサーバとして名前解決可能かテストします。

また、digの名前解決結果で、flagsに「aa」が表示されない事、「ra」が表示される事を確認します。digのflasgの詳細については以下サイトをご参照下さい。
http://d.hatena.ne.jp/japanrock_pg/20090410/1239355230

　aa: 回答したDNSサーバが、問い合わせたゾーンについて、権威を持っている場合に表示されるフラグ。
　ra: サーバが再帰的問い合わせをサポートしている場合に表示されるフラグ。

・構築したBINDサーバを指定して、正引き名前解決をテストします。

```
[root@dns-bind-cache-server ~]# hostname
dns-bind-cache-server
[root@dns-bind-cache-server ~]# cat /etc/resolv.conf
search test.example.com
nameserver 127.0.0.1
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# dig www.test.example.com @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> www.test.example.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46414
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.test.example.com.          IN      A

;; ANSWER SECTION:
www.test.example.com.   3556    IN      CNAME   host1.test.example.com.
host1.test.example.com. 3556    IN      A       192.51.100.9

;; AUTHORITY SECTION:
test.example.com.       3556    IN      NS      ns2.test.example.com.
test.example.com.       3556    IN      NS      ns1.test.example.com.

;; ADDITIONAL SECTION:
ns1.test.example.com.   3556    IN      A       192.51.100.6
ns2.test.example.com.   3556    IN      A       192.51.100.7

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 01 07:03:49 JST 2015
;; MSG SIZE  rcvd: 153

[root@dns-bind-cache-server ~]#
```

・構築したBINDサーバを指定して、逆引き名前解決をテストします。

```
[root@dns-bind-cache-server ~]# dig -x 192.51.100.9 @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> -x 192.51.100.9 @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24761
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;9.100.51.192.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
9.100.51.192.in-addr.arpa. 3563 IN      PTR     host1.test.example.com.

;; AUTHORITY SECTION:
100.51.192.in-addr.arpa. 3563   IN      NS      ns1.test.example.com.
100.51.192.in-addr.arpa. 3563   IN      NS      ns2.test.example.com.

;; ADDITIONAL SECTION:
ns1.test.example.com.   3547    IN      A       192.51.100.6
ns2.test.example.com.   3547    IN      A       192.51.100.7

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 01 07:03:58 JST 2015
;; MSG SIZE  rcvd: 158

[root@dns-bind-cache-server ~]#
```

・再帰検索によりwww.yahoo.com等の名前解決が可能であるかテストします。

```
[root@dns-bind-cache-server ~]# dig www.yahoo.com @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> www.yahoo.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31841
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 4, ADDITIONAL: 5

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.yahoo.com.                 IN      A

;; ANSWER SECTION:
www.yahoo.com.          298     IN      CNAME   fd-fp3.wg1.b.yahoo.com.
fd-fp3.wg1.b.yahoo.com. 58      IN      A       106.10.139.246

;; AUTHORITY SECTION:
wg1.b.yahoo.com.        3598    IN      NS      yf2.yahoo.com.
wg1.b.yahoo.com.        3598    IN      NS      yf3.a1.b.yahoo.net.
wg1.b.yahoo.com.        3598    IN      NS      yf1.yahoo.com.
wg1.b.yahoo.com.        3598    IN      NS      yf4.a1.b.yahoo.net.

;; ADDITIONAL SECTION:
yf1.yahoo.com.          3598    IN      A       68.142.254.15
yf2.yahoo.com.          3598    IN      A       68.180.130.15
yf3.a1.b.yahoo.net.     3599    IN      A       111.67.241.16
yf4.a1.b.yahoo.net.     3599    IN      A       111.67.241.16

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 01 07:07:01 JST 2015
;; MSG SIZE  rcvd: 235

[root@dns-bind-cache-server ~]#
```

・BINDサーバのnamed.confやiptablesにて、DNS名前解決要求の受付を許可したリモートマシンから名前解決可能かテストします。


```
c:\>ipconfig /flushdns

Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。

c:\>nslookup www.test.example.com [今回構築したDNSキャッシュサーバのIPアドレスを指定する]
サーバー:  ****************************
Address:  XXX.XXX.XXX.XXX

権限のない回答:
名前:    host1.test.example.com
Address:  192.51.100.9
Aliases:  www.test.example.com


c:\>nslookup 192.51.100.9 [今回構築したDNSキャッシュサーバのIPアドレスを指定する]
サーバー:  ****************************
Address:  XXX.XXX.XXX.XXX

名前:    host1.test.example.com
Address:  192.51.100.9
```

・今回構築したBINDサーバを指定した場合、DNSキャッシュサーバなので、権威を持たないゾーンの名前についても、再帰検索により名前解決可能な事を確認します。

```
c:\>ipconfig /flushdns

Windows IP 構成

DNS リゾルバー キャッシュは正常にフラッシュされました。

c:\>nslookup www.yahoo.com [今回構築したDNSキャッシュサーバのIPアドレスを指定する]
サーバー:  ****************************
Address:  XXX.XXX.XXX.XXX

権限のない回答:
名前:    fd-fp3.wg1.b.yahoo.com
Addresses:  2406:2000:e4:200::4001
          106.10.139.246
Aliases:  www.yahoo.com


c:\>nslookup www.google.co.jp [今回構築したDNSキャッシュサーバのIPアドレスを指定する]
サーバー:  ****************************
Address:  XXX.XXX.XXX.XXX

権限のない回答:
名前:    www.google.co.jp
Addresses:  2404:6800:4004:810::101f
          173.194.38.216
          173.194.38.223
          173.194.38.215
          173.194.38.207

c:\>nslookup 173.194.38.215 [今回構築したDNSキャッシュサーバのIPアドレスを指定する]
サーバー:  ****************************
Address:  XXX.XXX.XXX.XXX

名前:    nrt13s01-in-f23.1e100.net
Address:  173.194.38.215


c:\>
```

・起動したBINDのバージョンがBIND 9.10.1-P1である事を確認します。

```
[root@dns-bind-cache-server ~]# hostname
dns-bind-cache-server
[root@dns-bind-cache-server ~]# ps awux | grep -v grep | grep named
bind     11049  0.0  3.4 147928 20872 ?        Ssl  07:02   0:00 /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# /var/named/chroot/sbin/named -v
BIND 9.10.1-P1
[root@dns-bind-cache-server ~]#
```

・digコマンドではBINDのバージョン情報がunknownとして表示される事を確認します。

```
[root@dns-bind-cache-server ~]# dig +noall +ans @127.0.0.1 chaos txt version.bind
version.bind.           0       CH      TXT     "unknown"
[root@dns-bind-cache-server ~]#
```

ここまでの設定でDNSキャッシュサーバとして正引き、逆引きによる名前解決が動作するようになりました。

rndcコマンドによるBINDの操作 (DNSキャッシュダンプとDNSキャッシュクリア)
===

BINDサーバではrndcコマンドを利用して、namedプロセスをreloadしたり、namedの統計情報をファイルに出力する等の操作が可能です。

DNSキャッシュサーバのメモリ上のDNSキャッシュをダンプファイルへ出力したり、DNSキャッシュサーバのDNSキャッシュをクリアする事が可能です。

・namedがメモリ上にキャッシュしたDNSキャッシュをダンプファイルに出力します。

```
[root@dns-bind-cache-server ~]# /usr/local/sbin/rndc dumpdb
[root@dns-bind-cache-server ~]#
```

DNSキャッシュの内容が/var/named/chroot/data/cache_dump.dbファイルに出力されます。

```
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/data/cache_dump.db
-rw-r--r--. 1 bind bind 38207 Feb  1 07:21 /var/named/chroot/data/cache_dump.db
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# grep www.yahoo /var/named/chroot/data/cache_dump.db
www.yahoo.com.          293     CNAME   fd-fp3.wg1.b.yahoo.com.
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# grep www.test /var/named/chroot/data/cache_dump.db
www.test.example.com.   2483    CNAME   host1.test.example.com.
[root@dns-bind-cache-server ~]#
```

・namedがメモリ上にキャッシュしたDNSキャッシュをクリアします。

```
[root@dns-bind-cache-server ~]# /usr/local/sbin/rndc flush
[root@dns-bind-cache-server ~]#
```

以下のようにDNSキャッシュがクリアされます。

```
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/data/cache_dump.db
-rw-r--r--. 1 bind bind 38207 Feb  1 07:21 /var/named/chroot/data/cache_dump.db
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# /usr/local/sbin/rndc dumpdb
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# ls -lrta /var/named/chroot/data/cache_dump.db
-rw-r--r--. 1 bind bind 541 Feb  1 07:24 /var/named/chroot/data/cache_dump.db
[root@dns-bind-cache-server ~]#

[root@dns-bind-cache-server ~]# grep www.yahoo /var/named/chroot/data/cache_dump.db
[root@dns-bind-cache-server ~]#
[root@dns-bind-cache-server ~]# grep www.test /var/named/chroot/data/cache_dump.db
[root@dns-bind-cache-server ~]#
```

ここまでの設定でDNSキャッシュサーバとして一通り稼動するようになりました。

BINDサーバがオープンリゾルバになっていない事を確認する
===

・オープンリゾルバ確認サイトやコマンドで、今回構築したBINDサーバがオープンリゾルバになっていない事を確認します。

http://www.openresolver.jp/
https://www.jpcert.or.jp/pr/2013/pr130002.html#cli

以下のように「NOT open」と表示されていれば、オープンリゾルバは無効化されていますので、問題ありません。

```
[root@dns-bind-cache-server ~]# curl --location-trusted http://www.openresolver.jp/cli/check.html
Configured DNS server: [NOT open] [今回構築したDNSキャッシュサーバのIPアドレスが表示される](dns-bind-cache-server)
Source IP address: [NOT open] [今回構築したDNSキャッシュサーバのIPアドレスが表示される](dns-bind-cache-server)
[root@dns-bind-cache-server ~]#
```

DNSキャッシュサーバのDNSキャッシュポイズニングの脆弱性有無チェック
===

BINDでDNSキャッシュサーバを構築した場合、以下のサイトを参考にして、DNSキャッシュポイズニングの脆弱性有無をチェックします。

http://www.ipa.go.jp/security/vuln/documents/2008/200809_DNS.html
http://blog.cles.jp/item/2733

DNSキャッシュポイズニングの脆弱性チェックコマンドを実行する事で、以下の脆弱性の有無について、チェックする事が可能です。

　A. DNS問い合わせに使用するポート番号がランダム化されていない。
　B. DNS問い合わせに使用するIDがランダム化されていない。
　C. 外部からの再帰的なDNS問い合わせに対して回答してしまう。

DNSキャッシュポイズニングの脆弱性チェックコマンドを実行していきます。

・A. DNS問い合わせに使用するポート番号がランダム化されていない脆弱性の有無をチェックします。

構築したBINDサーバ上で、以下の脆弱性チェック用コマンドを実行します。
「GREAT」と表示されている場合は問題ありません。問題がある場合はGOODやPOORと表示されるそうです。

```
[root@dns-bind-cache-server ~]# dig -x dig +short porttest.dns-oarc.net TXT
porttest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
"[今回構築したDNSキャッシュサーバのIPアドレスが表示される] is GREAT: 26 queries in 3.1 seconds from 26 ports with std dev 17929"
[root@dns-bind-cache-server ~]#
```

・B. DNS問い合わせに使用するIDがランダム化されていない脆弱性の有無をチェックします。

構築したBINDサーバ上で、以下の脆弱性チェック用コマンドを実行します。
「GREAT」と表示されている場合は問題ありません。問題がある場合はGOODやPOORと表示されるそうです。

```
[root@dns-bind-cache-server ~]# dig +short txidtest.dns-oarc.net TXT
txidtest.y.x.w.v.u.t.s.r.q.p.o.n.m.l.k.j.i.h.g.f.e.d.c.b.a.pt.dns-oarc.net.
"[今回構築したDNSキャッシュサーバのIPアドレスが表示される] is GREAT: 26 queries in 3.2 seconds from 26 txids with std dev 18745"
[root@dns-bind-cache-server ~]#
```

・C. 外部からの再帰的なDNS問い合わせに対して回答してしまう脆弱性の有無をチェックします。

現状「IANA ― Cross-Pollination Scan」に、脆弱性チェックを行える画面が見つかりませんでした。
http://www.iana.org/

代わりに、前述の「BINDサーバがオープンリゾルバになっていない事を確認する」で、BINDサーバがオープンリゾルバになっていない事を確認しました。

問題なければ、BINDサーバの構築はひとまず完了です。

以上になります。