mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

CentOS 6.5 - DNS サーバ(BIND)構築!

[ サーバ構築 ] [ CentOS, DNS, Linux ]

こんばんは。

前回は CentOS 6.5 サーバにファイアウォール iptables の構築を行いました。
今回は DNS サーバ BIND の構築を行います。

0. 前提条件

  • CentOS 6.5(x86_64) を Minimal で最小インストールしている。
  • クライントマシンは Linux Mint 14(64bit) を想定。
  • セカンダリネームサーバは構築しない。
  • 使用しているルータは DNSSEC 非対応。
  • PPPoE 環境ではない。
  • IPv6 は使用しない。
  • グローバル IP アドレスは固定。(aaa.bbb.ccc.ddd と仮定)
  • ドメイン名は “mk-mode.com”
  • ローカルネットワークは “192.168.11.0/24”
  • サーバマシンのローカル IP アドレスは “192.168.11.102”
  • 主に「CentOSで自宅サーバー構築」を参考にしている。
    (実際は、過去にこのサイトを参考にして作業した際に記録していたものを参照している)

1. BIND インストール

DNS サーバである BIND と chroot 化ツールを以下のようにしてインストールする。

1
# yum -y install bind bind-chroot

2. chroot 化スクリプト作成

BIND を chroot 化するためのスクリプトを以下のように作成する。

bind-chroot-admin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh

# bind-chroot install check
rpm -q bind-chroot > /dev/null 2>&1
[ $? -ne 0 ] && echo bind-chroot not install && exit 1

# bind-chroot enabled
sed -i '/^ROOTDIR=/d' /etc/sysconfig/named
echo ROOTDIR=/var/named/chroot >> /etc/sysconfig/named

# file copy
filelist=`mktemp`
rpm -ql bind|grep ^/etc >> ${filelist}
rpm -ql bind|grep ^/var >> ${filelist}
for file in `cat ${filelist}`
do
  # directory make
  if [ -d ${file} ]; then
      DIRNAME=/var/named/chroot${file}
      [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
  fi
  # file copy
  if [ -f ${file} ]; then
      DIRNAME=/var/named/chroot`dirname ${file}`
      [ ! -d ${DIRNAME} ] && mkdir -p ${DIRNAME}
      /bin/cp -a ${file} ${DIRNAME}
  fi
done
rm -f ${filelist}

chown named:named /var/named/chroot/var/named/data
chmod 770 /var/named/chroot/var/named/data
chown named:named /var/named/chroot/var/named/dynamic

exit

3. chroot 化スクリプト実行

作成した chroot 化スクリプトを実行する。

1
# sh bind-chroot-admin

4. BIND 設定ファイル編集

/var/named/chroot/etc/named.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
options {
        #listen-on port 53 { 127.0.0.1; };          # <= コメントアウト
        #listen-on-v6 port 53 { ::1; };             # <= コメントアウト
        version         "unknown";                  # <= 追加(bind バージョン情報非表示)
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; localnets; };  # <= 変更(ローカルホスト、ローカルネットからの問合せのみ許可)
        recursion yes;
        empty-zones-enable no;   # <= 追加(起動時の空ゾーンエラーログの出力無効化)

        dnssec-enable no;        # <= 変更(DNSSEC 非対応なので)
        dnssec-validation no;    # <= 変更(        〃         )
        #dnssec-lookaside auto;  # <= コメントアウト(        〃         )

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";
        forwarders{            # <= 追加
                192.168.11.1;  # <= 追加(ルータの IP アドレス)
        };                     # <= 追加

        managed-keys-directory "/var/named/dynamic";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
        category lame-servers { null; };  # <= 追加(エラーログの出力制御)
};

view "internal" {                           # <= 追加
        match-clients { localnets; };       # <= 追加
        match-destinations { localnets; };  # <= 追加

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

        include "/etc/named.rfc1912.zones";
        include "/etc/named.root.key";
        include "/etc/named.mk-mode.com.zone";  # <= 追加
};                                                # <= 追加

view "external" {                                   # <= 追加(固定 IP 環境なので)
        match-clients { any; };                     # <= 追加(固定 IP 環境なので)
        match-destinations { any; };                # <= 追加(固定 IP 環境なので)
        recursion no;                               # <= 追加(固定 IP 環境なので)
        include "/etc/named.mk-mode.com.zone.wan";  # <= 追加(固定 IP 環境なので)
};                                                  # <= 追加(固定 IP 環境なので)

5. 内部向けゾーン定義ファイル作成

内部向けゾーン定義ファイルを以下のように作成する。

/var/named/chroot/etc/named.mk-mode.com.zone
1
2
3
4
5
6
7
8
zone "mk-mode.com" {
        type master;
        file "mk-mode.com.db";
};
zone "11.168.192.in-addr.arpa" {
        type master;
        file "11.168.192.in-addr.arpa.db";
};

6. 外部向けゾーン定義ファイル作成

固定 IP 環境なので、外部向けゾーン定義ファイルを作成する。

/var/named/chroot/etc/named.mk-mode.com.zone.wan
1
2
3
4
5
6
7
8
9
10
zone "mk-mode.com" {
        type master;
        file "mk-mode.com.db.wan";
        allow-query { any; };
};
zone "ccc.bbb.aaa.in-addr.arpa" {
        type master;
        file "ccc.bbb.aaa.in-addr.arpa.db";
        allow-query { any; };
};

7. IPv4 のみ有効化

IPv6 は使用しないので、余計なエラーログを出力しないよう IPv4 のみ有効にする。

/etc/sysconfig/named
1
OPTIONS="-4"  # <= 最終行へ追加

8. ルートゾーン最新化

世界に13台しかないルートゾーン “named.ca” を最新化しておく。

1
# dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca

9. ルートゾーン最新化スクリプト作成

ルートゾーンを自動で最新化するためのスクリプトを以下のように作成する。

named.root_update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

new=`mktemp`
errors=`mktemp`

dig . ns @198.41.0.4 +bufsize=1024 > $new 2> $errors

if [ $? -eq 0 ]; then
    sort_new=`mktemp`
    sort_old=`mktemp`
    diff_out=`mktemp`
    sort $new > $sort_new
    sort /var/named/chroot/var/named/named.ca > $sort_old
    diff --ignore-matching-lines=^\; $sort_new $sort_old > $diff_out
    if [ $? -ne 0 ]; then
        (
         echo '-------------------- old named.root --------------------'
         cat /var/named/chroot/var/named/named.ca
         echo
         echo '-------------------- new named.root --------------------'
         cat $new
         echo '---------------------- difference ----------------------'
         cat $diff_out
        ) | mail -s 'named.root updated' root
        cp -f $new /var/named/chroot/var/named/named.ca
        chown named. /var/named/chroot/var/named/named.ca
        chmod 644 /var/named/chroot/var/named/named.ca
        /etc/rc.d/init.d/named restart > /dev/null
    fi
    rm -f $sort_new $sort_old $diff_out
else
    cat $errors | mail -s 'named.root update check error' root
fi
rm -f $new $errors

10. ルートゾーン最新化スクリプト権限設定

作成したルートゾーン最新化スクリプトに実行権限を付与する。

1
# chmod 700 named.root_update

11. ルートゾーン最新化スクリプト自動実行設定

ルートゾーン最新化スクリプトが毎月自動で実行されるよう cron ディレクトリへ移動する。

1
# mv named.root_update /etc/cron.monthly/

12. 内部向け正引きゾーンデータベース作成

内部のドメイン名から IP アドレスを引くための正引きゾーンデータベースを以下のように作成する。(当方の例)

/var/named/chroot/var/named/mk-mode.com.db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$TTL    86400
@       IN      SOA     mk-mode.com.  root.mk-mode.com.(
                                      2013120801; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
         IN NS    mk-mode.com.
         IN MX 10 mk-mode.com.
@        IN A     192.168.11.102
*        IN A     192.168.11.102
sd11g5   IN A     192.168.11.2
noah     IN A     192.168.11.3
kuro-box IN A     192.168.11.4
terrano  IN A     192.168.11.11
st62k    IN A     192.168.11.12
p183     IN A     192.168.11.13
vmware   IN A     192.168.11.101
vbox     IN A     192.168.11.102

13. 内部向け逆引きゾーンデータベース作成

内部の IP アドレスからドメイン名を引くための逆引きゾーンデータベースを以下のように作成する。(当方の例)

/var/named/chroot/var/named/11.168.192.in-addr.arpa.db
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$TTL    86400
@       IN      SOA     mk-mode.com.  root.mk-mode.com.(
                                      2013120801 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS    mk-mode.com.
102           IN      PTR   mk-mode.com.
2             IN      PTR   sd11g5.mk-mode.com.
3             IN      PTR   noah.mk-mode.com.
4             IN      PTR   kuro-box.mk-mode.com.
11            IN      PTR   terrano.mk-mode.com.
12            IN      PTR   st62k.mk-mode.com.
13            IN      PTR   p183.mk-mode.com.
101           IN      PTR   vmware.mk-mode.com.
102           IN      PTR   vbox.mk-mode.com.

14. 外部向け正引きゾーンデータベース作成

外部のドメイン名から IP アドレスを引くための正引きゾーンデータベースを以下のように作成する。(当方の例)

/var/named/chroot/var/named/mk-mode.com.db.wan
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$TTL    86400
@       IN      SOA     ns1.mk-mode.com.  root.mk-mode.com.(
                                      2013120801 ; Serial
                                      7200       ; Refresh
                                      7200       ; Retry
                                      2419200    ; Expire
                                      86400 )    ; Minimum
        IN NS    ns1.mk-mode.com.
        IN MX 10 mk-mode.com.
ns1     IN A     aaa.bbb.ccc.ddd
@       IN A     aaa.bbb.ccc.ddd
www     IN A     aaa.bbb.ccc.ddd
ftp     IN A     aaa.bbb.ccc.ddd
mail    IN A     aaa.bbb.ccc.ddd
mk-mode.com. IN TXT "v=spf1 ip4:aaa.bbb.ccc.ddd ~all"

15. 外部向け逆引きゾーンデータベース作成

外部の IP アドレスからドメイン名を引くための逆引きゾーンデータベースを以下のように作成する。(当方の例)

/var/named/chroot/var/named/ccc.bbb.aaa.in-addr.arpa.db
1
2
3
4
5
6
7
8
9
10
$TTL    86400
@       IN      SOA     mk-mode.com. root.mk-mode.com.(
                        2013120801      ; serial
                        3600            ; refresh (1 hour)
                        900             ; retry (15 minutes)
                        604800          ; expire (1 week)
                        86400           ; negative (1 day)
)
        IN      NS              mk-mode.com.
ddd     IN      PTR             mk-mode.com.

16. BIND 起動

BIND を以下のようにして起動する。

1
2
3
# /etc/rc.d/init.d/named start
Generating /etc/rndc.key:                                  [  OK  ]
namedを起動中:                                             [  OK  ]

起動に失敗する場合は、設定に誤りがある可能性が高いのでよく見直す。
ゾーンデータベースファイルを編集した場合はシリアル番号(日付+2桁数字)をカウントアップすること(重要)。

17. BIND 自動起動設定

マシン起動時に自動で BIND が起動するよう設定する。

1
2
# chkconfig named on
# chkconfig --list named  # <= 2,3,4,5 が "on" であることを確認

18. 問い合わせ先 DNS サーバ設定

初期設定時に DNS の IP アドレスをルータの IP アドレスに設定していたが、BIND(サーバマシン)の IP アドレスに変更する。

/etc/sysconfig/network-scripts/ifcfg-eth0
1
DNS1=127.0.0.1  # <= ルータの IP アドレスから自身(ローカル)IP アドレスに変更

19. BIND 再起動

DNS サーバ設定変更を有効化するために、BIND を再起動する。

1
2
3
# /etc/rc.d/init.d/network restart
named を停止中: .                                          [  OK  ]
named を起動中:                                            [  OK  ]

20. 動作確認

ローカルの Linux マシンからの内部正引きテスト。
“ANSWER SECTION” で IP アドレスが返却されていることを確認する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# dig mk-mode.com

; <<>> DiG 9.8.1-P1 <<>> mk-mode.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14521
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;mk-mode.com.                   IN      A

;; ANSWER SECTION:
mk-mode.com.            86400   IN      A       192.168.11.102

;; AUTHORITY SECTION:
mk-mode.com.            86400   IN      NS      mk-mode.com.

;; Query time: 1 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Dec  8 15:26:19 2013
;; MSG SIZE  rcvd: 59

ローカルの Linux マシンからの内部逆引きテスト。
“ANSWER SECTION” でホスト名が返却されていることを確認する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# dig -x 192.168.11.102

; <<>> DiG 9.8.1-P1 <<>> -x 192.168.11.102
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25821
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;102.11.168.192.in-addr.arpa.   IN      PTR

;; ANSWER SECTION:
102.11.168.192.in-addr.arpa. 86400 IN   PTR     vbox.mk-mode.com.
102.11.168.192.in-addr.arpa. 86400 IN   PTR     mk-mode.com.

;; AUTHORITY SECTION:
11.168.192.in-addr.arpa. 86400  IN      NS      mk-mode.com.

;; ADDITIONAL SECTION:
mk-mode.com.            86400   IN      A       192.168.11.102

;; Query time: 0 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Dec  8 15:28:25 2013
;; MSG SIZE  rcvd: 119

ローカルの Linux マシンからの外部正引きテスト。
“ANSWER SECTION” で IP アドレスが返却されていることを確認する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# dig www.isc.org

; <<>> DiG 9.8.1-P1 <<>> www.isc.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50478
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 3

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

;; ANSWER SECTION:
www.isc.org.            60      IN      A       149.20.64.69

;; AUTHORITY SECTION:
isc.org.                4849    IN      NS      ord.sns-pb.isc.org.
isc.org.                4849    IN      NS      sfba.sns-pb.isc.org.
isc.org.                4849    IN      NS      ams.sns-pb.isc.org.
isc.org.                4849    IN      NS      ns.isc.afilias-nst.info.

;; ADDITIONAL SECTION:
sfba.sns-pb.isc.org.    55229   IN      A       149.20.64.3
ord.sns-pb.isc.org.     55229   IN      A       199.6.0.30
ams.sns-pb.isc.org.     2912    IN      A       199.6.1.30

;; Query time: 2712 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Dec  8 15:29:36 2013
;; MSG SIZE  rcvd: 192

ローカルの Linux マシンからの外部逆引きテスト。
“ANSWER SECTION” でホスト名が返却されていることを確認する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# dig -x 149.20.64.69

; <<>> DiG 9.8.1-P1 <<>> -x 149.20.64.69
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54586
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;69.64.20.149.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
69.64.20.149.in-addr.arpa. 3600 IN      PTR     banana.isc.org.

;; AUTHORITY SECTION:
64.20.149.in-addr.arpa. 3600    IN      NS      ord.sns-pb.isc.org.
64.20.149.in-addr.arpa. 3600    IN      NS      sfba.sns-pb.isc.org.
64.20.149.in-addr.arpa. 3600    IN      NS      ams.sns-pb.isc.org.

;; ADDITIONAL SECTION:
ams.sns-pb.isc.org.     2859    IN      A       199.6.1.30
sfba.sns-pb.isc.org.    55176   IN      A       149.20.64.3
ord.sns-pb.isc.org.     55176   IN      A       199.6.0.30

;; Query time: 198 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Dec  8 15:30:29 2013
;; MSG SIZE  rcvd: 181

参考サイト


次回は、 FTP サーバ vsftpd の構築について紹介する予定です。

以上。

Comments