トップ  > サーバ設定:運用  > 各アプリケーションのインストール  > DNSサーバ構築(BIND)-CentOS 6.0

DNSサーバ構築(BIND)-CentOS 6.0  (最終更新日:2011/07/23)

DNSサーバ(BIND)はrx-93dff.netというドメイン名からIPアドレスを返したり、その逆をしたりします。

内部からサーバにアクセスする際、ドメイン名でアクセス出来ないと何かと不便なので、内部向けのみのDNSサーバを構築します。(hostsファイルに記述すれば同様の機能が実現できますがせっかくなので)

BINDインストール

[root@sv ~]# yum install bind bind-chroot ← bind,bind-chrootインストール

BIND設定

1.chroot化
[root@sv ~]# vi bind-chroot-admin ← bind-chroot-adminスクリプト作成
ここから----------
#!/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
----------ここまで

[root@sv ~]# sh bind-chroot-admin ← bind-chroot-adminスクリプト実行

[root@sv ~]# rm -f bind-chroot-admin ← bind-chroot-adminスクリプト削除
2.BIND設定
[root@sv ~]# vi /var/named/chroot/etc/named.conf ← BIND設定ファイル編集
//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//

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;

	dnssec-enable yes;
	dnssec-validation yes;
	dnssec-lookaside auto;

	/* Path to ISC DLV key */
	bindkeys-file "/etc/named.iscdlv.key";
	forwarders{
		xxx.xxx.xxx.xxx; ← ルータ経由の接続場合、IPアドレスを指定
		xxx.xxx.xxx.xxx; ← PPPoE等で直接接続の場合、BIGLOBEから通知されたDNSサーバ(プライマリ)のIPアドレスを指定
		xxx.xxx.xxx.xxx; ← PPPoE等で直接接続の場合、BIGLOBEから通知されたDNSサーバ(セカンダリ)のIPアドレスを指定
	};
};

※forwardersには、このDNSサーバで名前解決ができなかった場合に問合せにいくDNSサーバを指定する。不明な場合、設定しなくても動作はします。(実は設定しない方がレスポンスが良かったりします…)

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
	category lame-servers { null; }; ← 追加(error (connection refused) resolvingというエラーログの出力抑止)
};

view "internal" {
	match-clients { localnets; };
	match-destinations { localnets; }; ← 追加

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

include "/etc/named.rfc1912.zones";
include "/etc/named.rx-93dff.net.zone";
}; ← 追加

[root@sv ~]# vi /var/named/chroot/etc/named.rx-93dff.net.zone ← rx-93dff.netの内部向けゾーン定義ファイル作成
ここから----------
zone "rx-93dff.net" {
        type master;
        file "rx-93dff.net.db";
};
zone "0.168.192.in-addr.arpa" {
        type master;
        file "0.168.192.in-addr.arpa.db";
};
----------ここまで

[root@sv ~]# echo OPTIONS="-4" >> /etc/sysconfig/named ← IPv4のみ有効にする(error (network unreachable) resolvingというエラーログの出力抑止)
2.ルートゾーン最適化

ルートゾーンは世界に13台あるトップレベルドメインを管理するDNSサーバのIPアドレスを管理しているファイルで、最新化しておきます。

[root@sv ~]# dig . ns @198.41.0.4 > /var/named/chroot/var/named/named.ca ← ルートゾーン(named.ca)最新化
3.ルートゾーン自動更新

月に一度ルートゾーンの最新をチェックし、更新されていた場合更新及び、BINDの再起動をするようにします。(更新されていた場合差分情報がroot宛にメールされます)

[root@sv ~]# vi named.root_update ← ルートゾーン最新化スクリプト作成
ここから----------
#!/bin/bash

new=`mktemp`
errors=`mktemp`

dig . ns @198.41.0.4 > $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
----------ここまで

[root@sv ~]# chmod 700 named.root_update ← ルートゾーン最新化スクリプトへ実行権限付加

[root@sv ~]# mv named.root_update /etc/cron.monthly/ ← ルートゾーン最新化スクリプトを毎月自動実行されるディレクトリへ移動
4.内部向け正引きゾーンデータベース作成
[root@sv ~]# vi /var/named/chroot/var/named/rx-93dff.net.db ← 正引きゾーンデータベース作成
ここから----------
$TTL    86400
@       IN      SOA     rx-93dff.net.  root.rx-93dff.net.(
                                      2011070720 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN NS    rx-93dff.net.
        IN MX 10 rx-93dff.net.
@       IN A     192.168.0.100 ← サーバのIPアドレスを指定(rx-93dff.net用)
*       IN A     192.168.0.100 ← サーバのIPアドレスを指定(*.rx-93dff.net用)
----------ここまで
5.内部向け逆引きゾーンデータベース)作成
[root@sv ~]# vi /var/named/chroot/var/named/0.168.192.in-addr.arpa.db ← 逆引きゾーンデータベース作成
ここから----------
$TTL    86400
@       IN      SOA     rx-93dff.net.  root.rx-93dff.net.(
                                      2011070701 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS    rx-93dff.net.
100     IN      PTR   rx-93dff.net. ← サーバのIPアドレス4オクテット目(192.168.0.100)とドメイン名を指定
----------ここまで

BIND起動

1.BIND起動
[root@sv ~]# /etc/rc.d/init.d/named start ← BIND起動
named を起動中:                                            [  OK  ]

[root@sv ~]# chkconfig named on ← BINDサーバ自動起動設定

[root@sv ~]# chkconfig --list named ← BINDサーバ自動起動設定確認
named           0:off   1:off   2:on    3:on    4:on    5:on    6:off

DNS設定

1.サーバ自身の問い合わせ先DNSサーバを自分自身へ設定
[root@sv ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 ← ネットワークの設定ファイル編集(ifcfg-eth0は環境により変化)
DEVICE="eth0"
BOOTPROTO="static"
BROADCAST="192.168.0.255"
DNS1="192.168.0.254"
	↓
DNS1="127.0.0.1" ← サーバ自身を問い合わせ先DNSサーバにする
GATEWAY="192.168.0.254"
HWADDR="00:00:00:00:00:00"
IPADDR="192.168.0.100"
NETMASK="255.255.255.0"
NM_CONTROLLED="no"
ONBOOT="yes"
2.クライアントがDHCPの場合

DHCPサーバの設定を変更する。

3.クライアントが固定IPの場合

優先DNSをサーバのIPアドレスにする。

4.設定反映

サーバ→クライアントの順で再起動をし、設定を反映させます。

動作確認

1.Windowsの場合
C:\>nslookup ← nslookup起動
既定のサーバー:  rx-93dff.net
Address:  192.168.0.100

> rx-93dff.net ← サーバの正引きテスト
サーバー:  rx-93dff.net
Address:  192.168.0.100

名前:    rx-93dff.net
Address:  192.168.0.100 ← IPアドレスが返ってきた

> 192.168.0.100 ← サーバの逆引きテスト
サーバー:  rx-93dff.net
Address:  192.168.0.100

名前:    rx-93dff.net ← ドメイン名が返ってきた
Address:  192.168.0.100

> www.isc.org ← 外部ドメインの正引きテスト
サーバー:  rx-93dff.net
Address:  192.168.0.100

権限のない回答:
名前:    www.isc.org
Address:  149.20.64.42 ← IPアドレスが返ってきた

> 149.20.64.42 ← 外部ドメインの逆引きテスト
サーバー:  rx-93dff.net
Address:  192.168.0.100

名前:    www.isc.org ← ドメイン名が返ってきた
Address:  149.20.64.42

> exit ← 終了

C:\
2.Linuxの場合
[root@sv ~]# dig rx-93dff.net ← サーバの正引きテスト

; <<>> DiG 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 <<>> rx-93dff.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5515
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;rx-93dff.net.                  IN      A

;; ANSWER SECTION:
rx-93dff.net.           86400   IN      A       192.168.0.100 ← IPアドレスが返ってきた

;; AUTHORITY SECTION:
rx-93dff.net.           86400   IN      NS      rx-93dff.net.

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 20 23:49:17 2011
;; MSG SIZE  rcvd: 60

[root@sv ~]# dig -x 192.168.0.100 ← サーバの逆引きテスト

; <<>> DiG 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 <<>> -x 192.168.0.100
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60377
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

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

;; ANSWER SECTION:
100.0.168.192.in-addr.arpa. 86400 IN    PTR     rx-93dff.net. ← ドメイン名が返ってきた

;; AUTHORITY SECTION:
0.168.192.in-addr.arpa. 86400   IN      NS      rx-93dff.net.

;; ADDITIONAL SECTION:
rx-93dff.net.           86400   IN      A       192.168.0.100

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 20 23:49:28 2011
;; MSG SIZE  rcvd: 100

[root@sv ~]# dig www.isc.org ← 外部ドメインの正引きテスト

; <<>> DiG 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 <<>> www.isc.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 982
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0

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

;; ANSWER SECTION:
www.isc.org.            600     IN      A       149.20.64.42 ← IPアドレスが返ってきた

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

;; Query time: 452 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 20 23:49:35 2011
;; MSG SIZE  rcvd: 144

[root@sv ~]# dig -x 149.20.64.42 ← 外部ドメインの逆引きテスト

; <<>> DiG 9.7.0-P2-RedHat-9.7.0-5.P2.el6_0.1 <<>> -x 149.20.64.42
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17717
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0

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

;; ANSWER SECTION:
42.64.20.149.in-addr.arpa. 3600 IN      PTR     www.isc.org. ← ドメイン名が返ってきた

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

;; Query time: 1384 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 20 23:49:47 2011
;; MSG SIZE  rcvd: 130