Linux
CentOS
dns
bind

DNSサーバ構築手順(BIND 9.10.1-P1で外部向け権威DNSサーバ構築 + お名前.comで取得したドメインの権威DNSサーバにする)

More than 1 year has passed since last update.

はじめに

CentOS 6.6サーバにソースからBIND 9.10.1-P1をインストールし、外部向けの権威DNSサーバ(DNSコンテンツサーバ)を構築する手順です。

「お名前.com」で取得したドメインの権威DNSサーバとして、インターネット上のマシンから名前解決出来るように設定するところまで記載致します。

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

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

今回の例で、BIND 9.10.1-P1をインストールするCentOS 6.6サーバは、インターネットに公開する外部向け権威DNSサーバとして構築します。

お名前.comで独自ドメインを取得し、BINDサーバ上に取得したドメイン用の正引きゾーンファイルを作成します。

お名前.comで取得したドメインの権威DNSサーバ(NSレコード)について、今回構築したBINDサーバへ切り替る事で、構築したBINDサーバにドメインのDNS管理を権限委譲します。

※最近は会社でも、個人的にも、権威DNSサーバとして「Amazon Route53」を利用する事が多いのですが、諸事情により、BINDで外部向け権威DNSサーバを構築する事になり、備忘を兼ねて手順をまとめてみました。

例示用のドメイン名やゾーン名について

本ページにおいて、お名前.comで取得したドメイン名については、実際に設定したドメイン名ではなく、例示用の「example.net」と記載させて頂きます。
BINDサーバに作成するnamed.confやゾーンファイルの設定例でも「example.net」と記載させて頂きます。
(実際にBINDサーバを構築する際は、named.confやゾーンファイル内に、お名前.comで取得したドメイン名を記述します)

今回構築する権威DNSサーバの構成例

外部向けの権威DNSサーバとして構築しますので、権威DNSサーバのマスタサーバ、権威DNSサーバからゾーン転送によりゾーンデータを反映するスレーブサーバの計2台を構築します。
スレーブサーバはセカンダリサーバと呼ばれる事もありますが、本ページではスレーブサーバと表記させて頂きます。

また、構築したBINDサーバには、実際にはグローバルIPアドレスを付与しておりますが、本ページでは、RFC 6890で定義された以下の例示用IPアドレスで記載させて頂きます。

構築するDNSサーバの種類 構築したBINDサーバのNSレコード名 BINDサーバのホスト名 BINDサーバに割り当てたグローバルIPアドレス
権威DNSサーバ(マスタサーバ) ns1.example.net. external-dns-bind-server-master-001 203.0.113.10
権威DNSサーバ(スレーブサーバ) ns2.example.net. external-dns-bind-server-slave-001 203.0.113.20

なお、大規模なサイトの権威DNSサーバを構築する場合、プロバイダ等が提供する外部のDNSスレーブサーバ(セカンダリサーバ)を利用する、スレーブサーバの台数を増やす、BINDサーバの性能最適化に向けたパラメータチューニング等が必要になるかと思います。

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)

参考サイト

・権威DNSサーバのmasterのnamed.confについては、以下のページを参考にさせて頂きました。
http://www.oss-d.net/bind/9.7/ex_zone
http://jprs.jp/tech/notice/2013-04-18-fixing-bind-openresolver.html

・権威DNSサーバのslaveのnamed.confについては、以下のページを参考にさせて頂きました。
http://banikojp.blogspot.jp/2013/07/bind.html
http://mountainbigroad.jp/fc5/bind_slave.html

・権威DNSサーバのmasterサーバとslaveサーバ間のゾーン転送について、以下のページを参考にさせて頂きました。
http://www.atmarkit.co.jp/ait/articles/0305/10/news001_2.html
http://www5.ocn.ne.jp/~m-shin/dns/bind9-notify.html
http://snowland.net/nucleus/item/3616/category/7

・ゾーン転送がうまく行われない場合の対応については、以下のページを参考にさせて頂きました。
http://www.atmarkit.co.jp/ait/articles/0305/10/news001.html
 「TCPの53番ポートが経路の途中でフィルタリングされていないか」

・構築した権威DNSサーバがオープンリゾルバになっていない事のテストとして、以下のページを参考にさせて頂きました。
http://www.openresolver.jp/
https://www.jpcert.or.jp/pr/2013/pr130002.html#cli

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

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

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

外部向け権威DNSサーバ独自の設定や手順については、後述致します。

BIND 9.10.1-P1による外部向け権威DNSサーバ構築手順(マスタサーバ側)

・外部向け権威DNSサーバ(マスタサーバ)にnamed.confを作成します。

外部向け権威DNSサーバ(マスタサーバ)に以下のようなnamed.confを作成します。

[root@external-dns-bind-server-master-001 ~]# vi /var/named/chroot/etc/named.conf
/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.10/32;
        198.51.100.11/32;
        198.51.100.100/32;
        198.51.100.101/32;
};

options {
        version "unknown";
        hostname "ns1.example.net.";

        // /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名前解決要求を受け付けるネットワークやマシンを制限する。
        // 外部向け権威DNSサーバとして公開するので53番ポートの受付は開放する。
        listen-on port 53 {
                any;
        };

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

        // DNSキャッシュサーバを構築する場合は再帰検索を受け付けるようにする
//      recursion yes;
//      allow-recursion { 127.0.0.1; };
        //

        notify yes;
        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";
};

///// 権威DNSサーバ masterサーバ側の設定
// onamae.com setting user domain
zone "example.net." IN {
        type master;
        file "example.net.zone";
        notify yes;
        allow-query { any; };
        allow-update { none; };

        ///// 権威DNSサーバのmasterからslaveへゾーン転送する設定
        // master(external-dns-bind-server-master-001 203.0.113.10)
        // slave(external-dns-bind-server-slave-001 203.0.113.20)
        //
        // ゾーン転送はTCP53番ポートを使用する為、iptablesでmasterとslaveサーバ間のTCP53番ポートの通信を許可する事。

        // external-dns-bind-server-slave-001 203.0.113.20
        // onamae.com 2nd.dnsv.jp 210.172.129.81
        also-notify {
                203.0.113.20;
                210.172.129.81;
        };

        // external-dns-bind-server-slave-001 203.0.113.20
        // onamae.com 2nd.dnsv.jp 210.172.129.81
        allow-transfer {
                203.0.113.20;
                210.172.129.81;
        };
        /////

};
/////
[root@external-dns-bind-server-master-001 ~]# 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.10/32;
        198.51.100.11/32;
        198.51.100.100/32;
        198.51.100.101/32;
};

options {
        version "unknown";
        hostname "ns1.example.net.";

        // /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名前解決要求を受け付けるネットワークやマシンを制限する。
        // 外部向け権威DNSサーバとして公開するので53番ポートの受付は開放する。
        listen-on port 53 {
                any;
        };

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

        // DNSキャッシュサーバを構築する場合は再帰検索を受け付けるようにする
//      recursion yes;
//      allow-recursion { 127.0.0.1; };
        //

        notify yes;
        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";
};

///// 権威DNSサーバ masterサーバ側の設定
// onamae.com setting user domain
zone "example.net." IN {
        type master;
        file "example.net.zone";
        notify yes;
        allow-query { any; };
        allow-update { none; };

        ///// 権威DNSサーバのmasterからslaveへゾーン転送する設定
        // master(external-dns-bind-server-master-001 203.0.113.10)
        // slave(external-dns-bind-server-slave-001 203.0.113.20)
        //
        // ゾーン転送はTCP53番ポートを使用する為、iptablesでmasterとslaveサーバ間のTCP53番ポートの通信を許可する事。

        // external-dns-bind-server-slave-001 203.0.113.20
        // onamae.com 2nd.dnsv.jp 210.172.129.81
        also-notify {
                203.0.113.20;
                210.172.129.81;
        };

        // external-dns-bind-server-slave-001 203.0.113.20
        // onamae.com 2nd.dnsv.jp 210.172.129.81
        allow-transfer {
                203.0.113.20;
                210.172.129.81;
        };
        /////

};
/////
[root@external-dns-bind-server-master-001 ~]#

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

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

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

外部向け権威DNSサーバ(マスタサーバ)に以下のようなzoneファイルを作成します。お名前.comで取得したドメイン用のzoneファイルとなります。

[root@external-dns-bind-server-master-001 ~]# vi /var/named/chroot/var/named/example.net.zone
/var/named/chroot/var/named/example.net.zone
$ORIGIN example.net.
$TTL 900       ; 15 min.
@ IN SOA ns1.example.net. postmaster.example.net. (
        2015020110  ; serial
        3600        ; refresh (1 hour)
        1200        ; retry (20 min.)
        1209600     ; expire (2 weeks)
        900         ; minimum (15 min.)
        )
;;
@       IN  NS      ns1.example.net.
@       IN  NS      ns2.example.net.
@       IN  MX      10 mail.example.net.
@       IN  TXT     "v=spf1 mx ~all"    ; TXT
@       IN  SPF     "v=spf1 mx ~all"    ; SPF

;; external-dns-bind-server-master-001
ns1     IN  A       203.0.113.10

;; external-dns-bind-server-slave-001
ns2     IN  A       203.0.113.20

;; mail-server-001
mail    IN  A       203.0.113.30

;; web-server-001
web-001 IN  A       203.0.113.40
web-002 IN  A       203.0.113.41
web-003 IN  A       203.0.113.42
web-004 IN  A       203.0.113.43
www     IN  CNAME   web-001
[root@external-dns-bind-server-master-001 ~]# cat /var/named/chroot/var/named/example.net.zone
$ORIGIN example.net.
$TTL 900       ; 15 min.
@ IN SOA ns1.example.net. postmaster.example.net. (
        2015020110  ; serial
        3600        ; refresh (1 hour)
        1200        ; retry (20 min.)
        1209600     ; expire (2 weeks)
        900         ; minimum (15 min.)
        )
;;
@       IN  NS      ns1.example.net.
@       IN  NS      ns2.example.net.
@       IN  MX      10 mail.example.net.
@       IN  TXT     "v=spf1 mx ~all"    ; TXT
@       IN  SPF     "v=spf1 mx ~all"    ; SPF

;; external-dns-bind-server-master-001
ns1     IN  A       203.0.113.10

;; external-dns-bind-server-slave-001
ns2     IN  A       203.0.113.20

;; mail-server-001
mail    IN  A       203.0.113.30

;; web-server-001
web-001 IN  A       203.0.113.40
web-002 IN  A       203.0.113.41
web-003 IN  A       203.0.113.42
web-004 IN  A       203.0.113.43
www     IN  CNAME   web-001
[root@external-dns-bind-server-master-001 ~]#

・zoneファイルの構文をチェックします。

[root@external-dns-bind-server-master-001 ~]# /usr/local/sbin/named-checkzone example.net /var/named/chroot/var/named/example.net.zone
zone example.net/IN: loaded serial 2015020110
OK
[root@external-dns-bind-server-master-001 ~]#

・不要なzoneファイルが残っていない事を確認します。

[root@external-dns-bind-server-master-001 ~]# ls -lrta /var/named/chroot/var/named/
total 24
-rw-r--r--. 1 bind bind 2196 Jan 29 01:47 named.root
drwxr-xr-x. 5 bind bind 4096 Jan 29 02:37 ..
drwxr-xr-x. 3 bind bind 4096 Jan 29 03:08 chroot
drwxr-xr-x. 2 bind bind 4096 Feb  2 01:07 BACKUP
-rw-r--r--. 1 bind bind  897 Feb  2 03:04 example.net.zone
drwxr-xr-x. 4 bind bind 4096 Feb  2 03:05 .
[root@external-dns-bind-server-master-001 ~]#

・外部向け権威DNSサーバ(マスタサーバ)のiptablesでTCP53番ポートの通信を許可します。

外部向け権威DNSサーバ(マスタサーバ)とスレーブサーバ間のゾーン転送の為、iptablesでTCP53番ポートの通信を許可します。

[root@external-dns-bind-server-master-001 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##### ICMPを受け付けないようにする
##-A INPUT -p icmp -j ACCEPT
#####
##
##### ローカルインターフェースの通信は許可する
-A INPUT -i lo -j ACCEPT
#####
##
##### BINDサーバに対するssh接続を許可するマシンやネットワークを指定する
##-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -s 198.51.100.10/32 --dport 22 -j ACCEPT
#####
##
##### BINDサーバに対するDNS通信(UDP53番ポート)を許可するマシンやネットワークを指定する
##-A INPUT -m state --state NEW -m udp -p udp -s 198.51.100.10/32 --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
#####
##
##### BINDサーバ(masterサーバとslaveサーバ間)のゾーン転送通信(TCP53番ポート)を許可するマシンを指定する
## master(external-dns-bind-server-master-001 203.0.113.10)
## slave(external-dns-bind-server-slave-001 203.0.113.20)
-A INPUT -m state --state NEW -m tcp -p tcp -s 203.0.113.20/32 --dport 53 -j ACCEPT
#####
##
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

・iptablesに設定した内容を有効化します。

[root@external-dns-bind-server-master-001 ~]# /etc/init.d/iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
[root@external-dns-bind-server-master-001 ~]#

・iptablesが有効になっている事を確認します。

[root@external-dns-bind-server-master-001 ~]# iptables -L

・namedを再起動します。

[root@external-dns-bind-server-master-001 ~]# cat /etc/resolv.conf
search example.net
nameserver 127.0.0.1
nameserver [プロバイダ等が提供するフルサービスリゾルバのIPアドレスを指定する]
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-master-001 ~]# /etc/init.d/named checkconfig
named-checkconf -z -t /var/named/chroot /etc/named.conf
zone example.net/IN: loaded serial 2015020110
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-master-001 ~]# /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@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-master-001 ~]# ps awux | grep -v grep | grep named
bind      1351  0.0  1.9 139864 11864 ?        Ssl  04:05   0:00 /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-master-001 ~]#

・名前解決をテストします。

[root@external-dns-bind-server-master-001 ~]# dig www.example.net @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> www.example.net @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10357
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available

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

;; ANSWER SECTION:
www.example.net.       900     IN      CNAME   web-001.example.net.
web-001.example.net.   900     IN      A       203.0.113.40

;; AUTHORITY SECTION:
example.net.           900     IN      NS      ns1.example.net.
example.net.           900     IN      NS      ns2.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:06:32 JST 2015
;; MSG SIZE  rcvd: 151

[root@external-dns-bind-server-master-001 ~]#

[root@external-dns-bind-server-master-001 ~]# dig example.net NS @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> example.net NS @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16778
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.net.                  IN      NS

;; ANSWER SECTION:
example.net.           900     IN      NS      ns2.example.net.
example.net.           900     IN      NS      ns1.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:06:46 JST 2015
;; MSG SIZE  rcvd: 109

[root@external-dns-bind-server-master-001 ~]# 

[root@external-dns-bind-server-master-001 ~]# dig example.net SOA @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> example.net SOA @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18963
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.net.                  IN      SOA

;; ANSWER SECTION:
example.net.           900     IN      SOA     ns1.example.net. postmaster.example.net. 2015020110 3600 1200 1209600 900

;; AUTHORITY SECTION:
example.net.           900     IN      NS      ns1.example.net.
example.net.           900     IN      NS      ns2.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:06:50 JST 2015
;; MSG SIZE  rcvd: 156

[root@external-dns-bind-server-master-001 ~]#

BIND 9.10.1-P1による外部向け権威DNSサーバ構築手順(スレーブサーバ側)

・外部向け権威DNSサーバ(スレーブサーバ)にnamed.confを作成します。

外部向け権威DNSサーバ(スレーブサーバ)に以下のようなnamed.confを作成します。

[root@external-dns-bind-server-slave-001 ~]# vi /var/named/chroot/etc/named.conf
/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.10/32;
        198.51.100.11/32;
        198.51.100.100/32;
        198.51.100.101/32;
};

options {
        version "unknown";
        hostname "ns2.example.net.";

        // /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 {
                any;
        };

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

        // DNSキャッシュサーバを構築する場合は再帰検索を受け付けるようにする
//      recursion yes;
//      allow-recursion { 127.0.0.1; };
        //

        notify yes;
        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";
};

///// 権威DNSサーバ slaveサーバの設定
// onamae.com setting user domain
zone "example.net." IN {
        type slave;
        file "example.net-slave.zone";
        allow-query { any; };

        ///// 権威DNSサーバのmasterからslaveへゾーン転送する設定
        // master(external-dns-bind-server-master-001 203.0.113.10)
        // slave(external-dns-bind-server-slave-001 203.0.113.20)
        //
        // ゾーン転送はTCP53番ポートを使用する為、iptablesでmasterとslaveサーバ間のTCP53番ポートの通信を許可する事。

        // external-dns-bind-server-master-001 203.0.113.10
        masters {
                203.0.113.10;
        };
        /////

};
/////
[root@external-dns-bind-server-slave-001 ~]# 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.10/32;
        198.51.100.11/32;
        198.51.100.100/32;
        198.51.100.101/32;
};

options {
        version "unknown";
        hostname "ns2.example.net.";

        // /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 {
                any;
        };

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

        // DNSキャッシュサーバを構築する場合は再帰検索を受け付けるようにする
//      recursion yes;
//      allow-recursion { 127.0.0.1; };
        //

        notify yes;
        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";
};

///// 権威DNSサーバ slaveサーバの設定
// onamae.com setting user domain
zone "example.net." IN {
        type slave;
        file "example.net-slave.zone";
        allow-query { any; };

        ///// 権威DNSサーバのmasterからslaveへゾーン転送する設定
        // master(external-dns-bind-server-master-001 203.0.113.10)
        // slave(external-dns-bind-server-slave-001 203.0.113.20)
        //
        // ゾーン転送はTCP53番ポートを使用する為、iptablesでmasterとslaveサーバ間のTCP53番ポートの通信を許可する事。

        // external-dns-bind-server-master-001 203.0.113.10
        masters {
                203.0.113.10;
        };
        /////

};
/////
[root@external-dns-bind-server-slave-001 ~]# 

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

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

・zoneファイルを削除します。

外部向け権威DNSサーバ(スレーブサーバ)にはゾーン転送によりマスタサーバのzoneファイルがコピーされます。

外部向け権威DNSサーバ(スレーブサーバ)のzoneファイルは一度削除します。

[root@external-dns-bind-server-slave-001 ~]# rm -f /var/named/chroot/var/named/example.net.zone

・不要なzoneファイルが残っていない事を確認します。

[root@external-dns-bind-server-slave-001 ~]# ls -lrta /var/named/chroot/var/named/
total 24
-rw-r--r--. 1 bind bind 2196 Jan 29 01:47 named.root
drwxr-xr-x. 5 bind bind 4096 Jan 29 02:37 ..
drwxr-xr-x. 3 bind bind 4096 Jan 29 03:08 chroot
drwxr-xr-x. 2 bind bind 4096 Feb  2 00:51 BACKUP
drwxr-xr-x. 4 bind bind 4096 Feb  2 03:05 .
[root@external-dns-bind-server-slave-001 ~]#

・外部向け権威DNSサーバ(スレーブサーバ)のiptablesでTCP53番ポートの通信を許可します。

外部向け権威DNSサーバ(スレーブサーバ)とマスタサーバ間のゾーン転送の為、iptablesでTCP53番ポートの通信を許可します。

[root@external-dns-bind-server-slave-001 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##### ICMPを受け付けないようにする
##-A INPUT -p icmp -j ACCEPT
#####
##
##### ローカルインターフェースの通信は許可する
-A INPUT -i lo -j ACCEPT
#####
##
##### BINDサーバに対するssh接続を許可するマシンやネットワークを指定する
##-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -s 198.51.100.10/32 --dport 22 -j ACCEPT
#####
##
##### BINDサーバに対するDNS通信(UDP53番ポート)を許可するマシンやネットワークを指定する
##-A INPUT -m state --state NEW -m udp -p udp -s 198.51.100.10/32 --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
#####
##
##### BINDサーバ(masterサーバとslaveサーバ間)のゾーン転送通信(TCP53番ポート)を許可するマシンを指定する
## master(external-dns-bind-server-master-001 203.0.113.10)
## slave(external-dns-bind-server-slave-001 203.0.113.20)
-A INPUT -m state --state NEW -m tcp -p tcp -s 203.0.113.10/32 --dport 53 -j ACCEPT
#####
##
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

・iptablesに設定した内容を有効化します。

[root@external-dns-bind-server-slave-001 ~]# /etc/init.d/iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
[root@external-dns-bind-server-slave-001 ~]#

・iptablesが有効になっている事を確認します。

[root@external-dns-bind-server-slave-001 ~]# iptables -L

・namedを再起動します。

[root@external-dns-bind-server-slave-001 ~]# cat /etc/resolv.conf
search example.net
nameserver 127.0.0.1
nameserver [プロバイダ等が提供するフルサービスリゾルバのIPアドレスを指定する]
[root@external-dns-bind-server-slave-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# /etc/init.d/named checkconfig
named-checkconf -z -t /var/named/chroot /etc/named.conf
[root@external-dns-bind-server-slave-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# /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@external-dns-bind-server-slave-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# ps awux | grep -v grep | grep named
bind      1286  0.1  1.9 139864 11872 ?        Ssl  04:15   0:00 /var/named/chroot/sbin/named -u bind -4 -t /var/named/chroot -c /etc/named.conf
[root@external-dns-bind-server-slave-001 ~]#

・ゾーン転送によって、マスタサーバ側のzoneファイルがスレーブサーバにも自動で作成されている事を確認します。

[root@external-dns-bind-server-slave-001 ~]# ls -lrta /var/named/chroot/var/named/
total 24
-rw-r--r--. 1 bind bind 2196 Jan 29 01:47 named.root
drwxr-xr-x. 5 bind bind 4096 Jan 29 02:37 ..
drwxr-xr-x. 3 bind bind 4096 Jan 29 03:08 chroot
drwxr-xr-x. 2 bind bind 4096 Feb  2 00:51 BACKUP
-rw-r--r--. 1 bind bind  743 Feb  2 03:55 example.net-slave.zone
drwxr-xr-x. 4 bind bind 4096 Feb  2 04:15 .
[root@external-dns-bind-server-slave-001 ~]#

・名前解決をテストします。

[root@external-dns-bind-server-slave-001 ~]# dig www.example.net @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> www.example.net @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44353
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available

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

;; ANSWER SECTION:
www.example.net.       900     IN      CNAME   web-001.example.net.
web-001.example.net.   900     IN      A       203.0.113.40

;; AUTHORITY SECTION:
example.net.           900     IN      NS      ns1.example.net.
example.net.           900     IN      NS      ns2.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:18:48 JST 2015
;; MSG SIZE  rcvd: 151

[root@external-dns-bind-server-slave-001 ~]#

[root@external-dns-bind-server-slave-001 ~]# dig example.net NS @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> example.net NS @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29018
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.net.                  IN      NS

;; ANSWER SECTION:
example.net.           900     IN      NS      ns2.example.net.
example.net.           900     IN      NS      ns1.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:18:56 JST 2015
;; MSG SIZE  rcvd: 109

[root@external-dns-bind-server-slave-001 ~]#

[root@external-dns-bind-server-slave-001 ~]# dig example.net SOA @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> example.net SOA @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34380
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.net.                  IN      SOA

;; ANSWER SECTION:
example.net.           900     IN      SOA     ns1.example.net. postmaster.example.net. 2015020110 3600 1200 1209600 900

;; AUTHORITY SECTION:
example.net.           900     IN      NS      ns2.example.net.
example.net.           900     IN      NS      ns1.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:19:02 JST 2015
;; MSG SIZE  rcvd: 156

[root@external-dns-bind-server-slave-001 ~]#

[root@external-dns-bind-server-slave-001 ~]# dig web-002.example.net @127.0.0.1

; <<>> DiG 9.10.1-P1 <<>> web-002.example.net @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54281
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web-002.example.net.          IN      A

;; ANSWER SECTION:
web-002.example.net.   900     IN      A       203.0.113.41

;; AUTHORITY SECTION:
example.net.           900     IN      NS      ns2.example.net.
example.net.           900     IN      NS      ns1.example.net.

;; ADDITIONAL SECTION:
ns1.example.net.       900     IN      A       203.0.113.10
ns2.example.net.       900     IN      A       203.0.113.20

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Feb 02 04:19:23 JST 2015
;; MSG SIZE  rcvd: 133

[root@external-dns-bind-server-slave-001 ~]#

BINDバージョン情報の隠蔽確認

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

[root@external-dns-bind-server-master-001 ~]# hostname
external-dns-bind-server-master-001
[root@external-dns-bind-server-master-001 ~]# /var/named/chroot/sbin/named -v
BIND 9.10.1-P1
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# hostname
external-dns-bind-server-slave-001
[root@external-dns-bind-server-slave-001 ~]# /var/named/chroot/sbin/named -v
BIND 9.10.1-P1
[root@external-dns-bind-server-slave-001 ~]#

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

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

お名前.com管理画面でドメインのNSレコード切り替え(権威DNSサーバをBINDサーバへ変更する)

・お名前.comの管理画面で、お名前.comで取得した独自ドメイン(example.net)のNSレコードとして、今回構築したBINDサーバ2台(今回の例ではns1.example.netとns2.example.net)を追加します。

WS000009.JPG

WS000010.JPG

WS000011.JPG

WS000012.JPG

・お名前.comの管理画面で、独自ドメイン(example.net)のNSレコードについて、お名前.comのデフォルトの権威DNSサーバから今回構築したBINDサーバへ切り替えます。

  第一DNS XXXXXX1.onamae.com → ns1.example.net
  第ニDNS XXXXXX2.onamae.com → ns2.example.net

WS000016.JPG

WS000017.JPG

WS000018.JPG

WS000019.JPG

WS000020.JPG

WS000021.JPG

BIND動作確認

・インターネット上のマシンから、今回構築したBINDサーバのzoneファイル(example.net)に登録した名前を解決出来るかテストします。

[user@example-CentOS ~]$ dig example.net NS

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.35.amzn1 <<>> example.net NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29866
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;example.net.                  IN      NS

;; ANSWER SECTION:
example.net.           867     IN      NS      ns1.example.net.
example.net.           867     IN      NS      ns2.example.net.

;; Query time: 0 msec
;; SERVER: XXX.XX.XX.XX#53(XXX.XX.XX.XX)
;; WHEN: Mon Feb  2 05:47:08 2015
;; MSG SIZE  rcvd: 66

[user@example-CentOS ~]$

[user@example-CentOS ~]$ dig web-002.example.net

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.35.amzn1 <<>> web-002.example.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17245
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;web-002.example.net.          IN      A

;; ANSWER SECTION:
web-002.example.net.   774     IN      A       203.0.113.41

;; Query time: 0 msec
;; SERVER: XXX.XX.XX.XX#53(XXX.XX.XX.XX)
;; WHEN: Mon Feb  2 05:47:38 2015
;; MSG SIZE  rcvd: 54

[user@example-CentOS ~]$
c:\>ipconfig /flushdns

Windows IP 構成

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

c:\>nslookup www.example.net
サーバー:  UnKnown
Address:  XXX.XXX.XXX.XXX

権限のない回答:
名前:    web-001.example.net
Address:  203.0.113.40
Aliases:  www.example.net


c:\>nslookup web-004.example.net
サーバー:  UnKnown
Address:  XXX.XXX.XXX.XXX

権限のない回答:
名前:    web-004.example.net
Address:  203.0.113.43


c:\>nslookup mail.example.net
サーバー:  UnKnown
Address:  XXX.XXX.XXX.XXX

権限のない回答:
名前:    mail.example.net
Address:  203.0.113.30


c:\>

・インターネット上のマシンから、BINDサーバに登録しているAレコードにアクセス出来るかテストします。

http://www.example.net/

FQDNでアクセスした結果、名前解決が行われて、Aレコードで指定しているWebサーバ上のページの内容表示される事を確認出来ました。名前解決出来る事を確認出来ました。

WS000024.JPG

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

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

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

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

[root@external-dns-bind-server-master-001 ~]# curl --location-trusted http://www.openresolver.jp/cli/check.html
Configured DNS server: [NOT open] XXX.XXX.XXX.XXX(**********************)
Source IP address: [NOT open] 203.0.113.10(**********************)
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# curl --location-trusted http://www.openresolver.jp/cli/check.html
Configured DNS server: [NOT open] XXX.XXX.XXX.XXX(**********************)
Source IP address: [NOT open] 203.0.113.20(**********************)
[root@external-dns-bind-server-slave-001 ~]#

ここまでの設定で、今回構築したBINDサーバが「お名前.com」で取得したドメインの権威DNSサーバとして、名前解決の応答を返すところまで動作するようになりました。

BINDサーバに追加インストールするパッケージ

以下はBINDサーバを稼動させる上では、必須ではありませんが、負荷確認に便利なsysstat(sarコマンド)をインストールします。

[root@external-dns-bind-server-master-001 ~]# yum -y install sysstat

[root@external-dns-bind-server-slave-001 ~]# yum -y install sysstat

BINDサーバの不要サービス停止

以下の手順を参考にして、外部向け権威DNSサーバを構築した場合、既に不要サービスは停止済みかと思いますが、外部に公開するサーバの為、再度不要サービスが無効になっている事を確認します。

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

[root@external-dns-bind-server-slave-001 ~]# chkconfig --list
acpid           0:off   1:off   2:off   3:off   4:off   5:off   6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
ip6tables       0:off   1:off   2:on    3:on    4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
named           0:off   1:off   2:on    3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netfs           0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpdate         0:off   1:off   2:off   3:off   4:off   5:off   6:off
postfix         0:off   1:off   2:off   3:off   4:off   5:off   6:off
rdisc           0:off   1:off   2:off   3:off   4:off   5:off   6:off
restorecond     0:off   1:off   2:off   3:off   4:off   5:off   6:off
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off
saslauthd       0:off   1:off   2:off   3:off   4:off   5:off   6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sysstat         0:off   1:on    2:on    3:on    4:on    5:on    6:off
udev-post       0:off   1:on    2:off   3:off   4:off   5:off   6:off
[root@external-dns-bind-server-slave-001 ~]#

[root@external-dns-bind-server-slave-001 ~]# chkconfig --list | awk '{printf "%s\t\t%s\n", $1,$5}' | grep 3:on
auditd          3:on
crond           3:on
ip6tables               3:on
iptables                3:on
named           3:on
network         3:on
rsyslog         3:on
sshd            3:on
sysstat         3:on
[root@external-dns-bind-server-slave-001 ~]#
[root@external-dns-bind-server-master-001 ~]# hostname
external-dns-bind-server-master-001
[root@external-dns-bind-server-master-001 ~]# chkconfig --list
acpid           0:off   1:off   2:off   3:off   4:off   5:off   6:off
auditd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off
ip6tables       0:off   1:off   2:on    3:on    4:on    5:on    6:off
iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off
named           0:off   1:off   2:on    3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
netfs           0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
ntpdate         0:off   1:off   2:off   3:off   4:off   5:off   6:off
postfix         0:off   1:off   2:off   3:off   4:off   5:off   6:off
rdisc           0:off   1:off   2:off   3:off   4:off   5:off   6:off
restorecond     0:off   1:off   2:off   3:off   4:off   5:off   6:off
rsyslog         0:off   1:off   2:on    3:on    4:on    5:on    6:off
saslauthd       0:off   1:off   2:off   3:off   4:off   5:off   6:off
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
sysstat         0:off   1:on    2:on    3:on    4:on    5:on    6:off
udev-post       0:off   1:on    2:off   3:off   4:off   5:off   6:off
[root@external-dns-bind-server-master-001 ~]#

[root@external-dns-bind-server-master-001 ~]# chkconfig --list | awk '{printf "%s\t\t%s\n", $1,$5}' | grep 3:on
auditd          3:on
crond           3:on
ip6tables               3:on
iptables                3:on
named           3:on
network         3:on
rsyslog         3:on
sshd            3:on
sysstat         3:on
[root@external-dns-bind-server-master-001 ~]#

BINDサーバに不要なポートが開いていないかテストする

構築したBINDサーバに対して、nmapコマンドでポートスキャンをかけて、ssh(TCPポート22)やdomain(UDPポート53番)以外のポートが開いていない事をチェックします。

BINDサーバ側のiptablesで、nmapを実行するマシンからの全ポートの通信を一時的に許可します。

・TCPポートスキャンの例

以下はBINDサーバ(今回の例では203.0.113.10)に対して、TCP1~65535番までポートスキャンをかける例です。filteredと表示されたポートは閉じています。

[root@portscan-client ~]# nmap -sT -P0 -p 1-65535 203.0.113.10
Starting Nmap 5.51 ( http://nmap.org ) at 2015-02-02 20:22 JST
Nmap scan report for external-dns-bind-server-master-001 (203.0.113.10)

Host is up (0.27s latency).
PORT   STATE    SERVICE
1/tcp  filtered tcpmux
2/tcp  filtered compressnet
3/tcp  filtered compressnet
4/tcp  filtered unknown
 (省略)
20/tcp filtered ftp-data
21/tcp filtered ftp
 (省略)
53/tcp filtered domain
 (省略)

・UDPポートスキャンの例

以下はBINDサーバに対して、UDP1~65535番までポートスキャンをかける例です。opneと表示されたポートは開いています。

[root@portscan-client ~]# nmap -sU -P0 -p 1-65535 203.0.113.10

Starting Nmap 5.51 ( http://nmap.org ) at 2015-02-02 20:26 JST
Nmap scan report for external-dns-bind-server-master-001 (203.0.113.10)
Host is up (0.0026s latency).
PORT   STATE    SERVICE
1/udp  filtered tcpmux
2/udp  filtered compressnet
3/udp  filtered compressnet
 (省略)
20/udp filtered ftp-data
21/udp filtered ftp
 (省略)
53/udp open  domain
 (省略)

・開いているポートのサービスのバージョン情報を表示する例。

BINDのバージョン情報は隠蔽されている事を確認します。

[root@portscan-client ~]# nmap -sV -P0 -p 22-53 203.0.113.10

Starting Nmap 5.51 ( http://nmap.org ) at 2015-02-02 20:33 JST
Nmap scan report for external-dns-bind-server-master-001 (203.0.113.10)
Host is up (0.0053s latency).
Not shown: 30 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.3 (protocol 2.0)
53/tcp open  domain  ISC BIND unknown

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.11 seconds
[root@portscan-server ~]#

・ポートが開いている場合の例。

ちなみに、BINDサーバ構築中のiptablesを設定する前の段階で、BINDサーバにポートスキャンをかけると以下のように開いているポートが表示されます。

[root@portscan-client ~]# nmap -sT -P0 -p 1-65535 203.0.113.10

Starting Nmap 5.51 ( http://nmap.org ) at 2015-02-02 20:07 JST
Nmap scan report for external-dns-bind-server-master-001 (203.0.113.10)
Host is up (0.0054s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE
22/tcp open  ssh
53/tcp open  domain

Nmap done: 1 IP address (1 host up) scanned in 3.17 seconds
[root@portscan-client ~]#
[root@portscan-client ~]# nmap -sV -P0 -p 1-65535 203.0.113.10

Starting Nmap 5.51 ( http://nmap.org ) at 2015-02-02 20:09 JST
Nmap scan report for external-dns-bind-server-master-001 (203.0.113.10)
Host is up (0.0060s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 5.3 (protocol 2.0)
53/tcp open  domain  ISC BIND unknown

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.97 seconds
[root@portscan-client ~]#

ポートスキャンの確認が終わったら、BINDサーバ側のiptablesの設定を元通りにして、一時的に追加したnmap実行マシンからの通信許可を無効化します。

権威DNSサーバの再帰検索の無効化確認

・今回構築したBINDサーバを指定して再帰検索出来ない事を確認します。権威DNSサーバやコンテンツサーバとして構築したBINDサーバがDNSキャッシュサーバ(フルサービスリゾルバ)として動作していない事を確認します。

[root@external-dns-bind-server-master-001 ~]# 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: REFUSED, id: 62977
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

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

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Feb 05 00:20:56 JST 2015
;; MSG SIZE  rcvd: 42

[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# 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: REFUSED, id: 37587
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

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

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Feb 05 00:21:36 JST 2015
;; MSG SIZE  rcvd: 42

[root@external-dns-bind-server-slave-001 ~]#

・リモートマシンから今回構築したBINDサーバを指定した場合、権威を持たないゾーンの名前解決出来ない事、再帰検索出来ない事を確認します。

C:\>ipconfig /flushdns

Windows IP 構成

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

C:\>nslookup web-002.example.net 203.0.113.10
サーバー:  UnKnown
Address:  203.0.113.10

名前:    web-002.example.net
Address:  203.0.113.41


C:\>nslookup www.yahoo.com 203.0.113.10
サーバー:  UnKnown
Address:  203.0.113.10

*** UnKnown が www.yahoo.com を見つけられません: Query refused

C:\>
C:\>ipconfig /flushdns

Windows IP 構成

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

C:\>nslookup web-002.example.net 203.0.113.20
サーバー:  UnKnown
Address:  203.0.113.20

名前:    web-002.example.net
Address:  203.0.113.41


C:\>nslookup www.yahoo.com 203.0.113.20
サーバー:  UnKnown
Address:  203.0.113.20

*** UnKnown が www.yahoo.com を見つけられません: Query refused

C:\>

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

今回構築したのは権威DNSサーバではありますが、DNSキャッシュサーバの機能が有効になっていないかチェックします。権威DNSサーバとして構築したのに、意図せずDNSキャッシュサーバの機能が有効になっていて、再帰検索による名前解決が動作するようになっていたり、オープンリゾルバとして応答を返す状態になってしまっている場合、DNSキャッシュポイズニングの影響を受ける可能性があります。

今回構築した権威DNSサーバで、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サーバ上で、以下の脆弱性チェック用コマンドを実行します。
以下のように何も表示されない事を確認します。DNSキャッシュサーバの機能が無効化されている場合、以下のように何も表示されません。権威DNSサーバの場合、何も表示されなければ問題ありません。

[root@external-dns-bind-server-master-001 ~]# dig -x dig +short porttest.dns-oarc.net TXT
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# dig -x dig +short porttest.dns-oarc.net TXT
[root@external-dns-bind-server-slave-001 ~]#

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

構築したBINDサーバ上で、以下の脆弱性チェック用コマンドを実行します。
以下のように何も表示されない事を確認します。DNSキャッシュサーバの機能が無効化されている場合、以下のように何も表示されません。権威DNSサーバの場合、何も表示されなければ問題ありません。

[root@external-dns-bind-server-master-001 ~]# dig +short txidtest.dns-oarc.net TXT
[root@external-dns-bind-server-master-001 ~]#
[root@external-dns-bind-server-slave-001 ~]# dig +short txidtest.dns-oarc.net TXT
[root@external-dns-bind-server-slave-001 ~]#

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

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

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

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

以上になります。