提供: すだちWiki
移動先: 案内検索

DNSサーバー構築(BIND)(CentOS6)

メインページCentOS 6 で自宅サーバー構築DNSサーバー構築(BIND)(CentOS6)

名前解決を行ってくれる DNS (Domain Name System) サーバーを構築します。

BINDインストール

[root@host2 ~]# yum -y install bind bind-chroot

BIND設定

chroot化

[root@host2 ~]# 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@host2 ~]# sh bind-chroot-admin ← bind-chroot-adminスクリプト実行

BIND設定

[root@host3 ~]# vi /var/named/chroot/etc/named.conf
//
// 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; }; ← コメント化(サーバーの全インターフェースの53番ポートをリスンする)
        listen-on-v6 port 53 { none; }; ← 変更(IPv6を使わない場合)
        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; }; ← 問い合わせを許可する範囲 ( 内部ネットワーク等を指定 )
        allow-transfer { localhost; localnets; }; ← ゾーン情報の転送を許可する範囲 ( セカンダリDNSがいればその場所/範囲 )

        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; ← PPPoE接続環境の場合はプロバイダから通知されたDNSサーバー(プライマリ)のIPアドレスを指定
                xxx.xxx.xxx.xxx; ← PPPoE接続環境の場合はプロバイダから通知されたDNSサーバー(セカンダリ)のIPアドレスを指定
        };
        #managed-keys-directory "/var/named/dynamic";
};

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.root.key";
        include "/etc/named.sudachi.jp.zone";
};

# 外部向けの定義を記述している※固定IPアドレス環境の場合のみ
view "external" {
        match-clients { any; };
        match-destinations { any; };
        recursion no;
        include "/etc/named.sudachi.jp.zone.wan";
};

ゾーン定義ファイル作成

[root@host2 ~]# vi /var/named/chroot/etc/named.sudachi.jp.zone ← sudachi.jpの内部向けゾーン定義ファイル作成
zone "sudachi.jp" {
        type master;
        file "sudachi.jp.db";
};
zone "1.168.192.in-addr.arpa" {
        type master;
        file "1.168.192.in-addr.arpa.db";
};

sudachi.jpの外部向けゾーン定義ファイル作成※固定IPアドレス環境の場合のみ
[root@host2 ~]# vi /var/named/chroot/etc/named.sudachi.jp.zone.wan
zone "sudachi.jp" {
        type master;
        file "sudachi.jp.db.wan";
        allow-query { any; };
        allow-transfer {
                XXX.XXX.XXX.XX; ← このゾーン情報の転送先として(セカンダリネームサーバーのIPアドレス)を追加
        };
        notify yes; ← このゾーン情報変更時は即座に上記セカンダリへ反映させる
};

ルートゾーン最新化

ルートゾーンは世界に13台しかないトップレベルドメインを管理するDNSサーバーのIPアドレスを管理しているファイルで、めったに更新されることはないが、念のため最新化しておく。

[root@host2 ~]# dig . ns @198.41.0.4 +bufsize=1024 > /var/named/chroot/var/named/named.ca

ルートゾーン自動更新

1ヶ月に一度、ルートゾーンが最新かチェックし、更新されていればルートゾーンの最新化及び、BINDの再起動を自動的に行うようにする。

[root@host2 ~]# vi named.root_update ← ルートゾーン最新化スクリプト作成
#!/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

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

[root@host2 ~]# mv named.root_update /etc/cron.monthly/ ← ルートゾーン最新化スクリプトを毎月自動実行されるディレクトリへ移動

内部向け正引きゾーンデータベース(ドメイン名⇒IPアドレス)作成

[root@host2 ~]# vi /var/named/chroot/var/named/sudachi.jp.db ← 正引きゾーンデータベース作成
$TTL    86400
@       IN      SOA     sudachi.jp.  root.sudachi.jp.(
                                      2011061901 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN NS    sudachi.jp.
        IN MX 10 sudachi.jp.
@       IN A     192.168.1.2 ← サーバーのプライベートIPアドレスを指定(sudachi.jp用)
*       IN A     192.168.1.2 ← サーバーのプライベートIPアドレスを指定(*.sudachi.jp用)

内部向け逆引きゾーンデータベース(IPアドレス⇒ドメイン名)作成

[root@host2 ~]# vi /var/named/chroot/var/named/1.168.192.in-addr.arpa.db ← 逆引きゾーンデータベース作成
$TTL    86400
@       IN      SOA     sudachi.jp.     root.sudachi.jp.(
                                      2011061901 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS    sudachi.jp.
2             IN      PTR   sudachi.jp. ← サーバーIPアドレス最下位部(192.168.1.3)とドメイン名を指定

外部向け正引きゾーンデータベース(ドメイン名⇒IPアドレス)作成

※固定IPアドレス環境の場合のみ

[root@host2 ~]# vi /var/named/chroot/var/named/sudachi.jp.db.wan ← 外部向け正引きゾーンデータベース作成
$TTL    86400
@       IN      SOA     ns1.sudachi.jp.  root.sudachi.jp.(
                                      2011061901 ; Serial
                                      7200       ; Refresh
                                      7200       ; Retry
                                      2419200    ; Expire
                                      86400 )    ; Minimum
        IN NS    ns1.sudachi.jp.
        IN NS    2nd.dnsv.jp.
        IN MX 10 sudachi.jp.
ns1     IN A     XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(ns1.sudachi.jp用)
@       IN A     XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(sudachi.jp用)
www     IN A     XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(www.sudachi.jp用)
ftp     IN A     XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(ftp.sudachi.jp用)
mail    IN A     XXX.XXX.XXX.XXX ← サーバーのグローバルIPアドレスを指定(mail.sudachi.jp用)
sudachi.jp. IN TXT "v=spf1 ip4:202.215.132.171 ~all"

BIND起動

BIND起動

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

[root@host2 ~]# chkconfig named on ← BIND自動起動設定

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

UDPの53番ポートとTCPの53番ポートをオープンする

ルーターの設定で、UDPの53番ポートとTCPの53番ポートへのアクセスをサーバーに転送するようにする

問合せ先DNSサーバーをLinuxサーバーに変更

サーバー自身の問合せ先DNSサーバーを自分自身に変更

[root@host2 ~]# sed -i 's/DNS1=.*/DNS1=127.0.0.1/g' /etc/sysconfig/network-scripts/ifcfg-eth0
← Linuxサーバー自身を問合せ先DNSサーバーとする

[root@host2 ~]# /etc/rc.d/init.d/network restart ← DNSサーバー変更反映

問合せ先DNSサーバーをLinuxサーバーに変更

ルーターのDHCP設定でDNSサーバーのIPアドレスをLinuxサーバーのIPアドレスに変更する

問合せ先DNSサーバー変更反映

Linuxサーバー⇒クライアントの順に再起動し、問合せ先DNSサーバーの変更を反映させる