CentOS

2006/8/08 02:40 PM 更新

BIND

ネットワーク内のホストの名前解決を行うためにDNSサーバを導入する。
今回導入するDNSサーバを利用できるのは自宅のネットワークに属するホストのみで、このDNSサーバが名前解決の出来ないホストについてはISPが提供しているDNSサーバに問い合わせを行う。

BINDの公式サイトより 最新のソースファイルを入手しインストールする。
$ wget ftp://ftp.isc.org/isc/bind9/9.3.2/bind-9.3.2.tar.gz
$ tar xvzf bind-9.3.2.tar.gz
$ cd bind-9.3.2
$ ./configure --disable-ipv6 --sysconfdir=/etc
$ make
# make install
BINDを起動する専用ユーザを作成する。
# /usr/sbin/groupadd -g 204 named
# /usr/sbin/useradd -u 204 -g 204 -s /sbin/nologin -d /var/named named

ゾーンファイルを準備する。
作成するゾーンファイルは以下のとおり。
  ・localhost.zone(ローカルホスト正引き)
  ・localhost.rev(ローカルホスト逆引き)
  ・kajukaju.net.zone(ローカルネットワーク逆引き)
  ・kajukaju.net.rev(ローカルネットワーク逆引き)

  /var/named/localhost.zone
$TTL    259200

@               IN SOA  ns.kajukaju.net. root.kajukaju.net. (
                2005061901      ;Serial
                28800                ;Refresh 8 hours
                14400                ;Retry 4 hours
                604800              ;Expire 1 week
                86400                ;Minimum TTL 1 day
)

                IN NS   localhost.
                IN A    127.0.0.1
  /var/named/localhost.rev
$TTL    259200

@               IN SOA  ns.kajukaju.net. root.kajukaju.net. (
                2005061901      ;Serial
                28800                ;Refresh 8 hours
                14400                ;Retry 4 hours
                604800              ;Expire 1 week
                86400                ;Minimum TTL 1 day
)

                 IN NS    localhost.
1               IN PTR  localhost.
  /var/named/kajukaju.net.zone
$TTL    259200

@               IN SOA  ns.kajukaju.net. root.kajukaju.net. (
                2005061901      ;Serial
                28800                ;Refresh 8 hours
                14400                ;Retry 4 hours
                604800              ;Expire 1 week
                86400                ;Minimum TTL 1 day
)

                      IN NS           ns.kajukaju.net.
                      IN MX 10        postman.kajukaju.net.

ns                   IN A            192.168.1.xx
www              IN A            192.168.1.yy
postman         IN A            192.168.1.zz
  /var/named/kajukaju.net.rev
$TTL    259200

@               IN SOA  ns.kajukaju.net. root.kajukaju.net. (
                2005061901      ;Serial
                28800                ;Refresh 8 hours
                14400                ;Retry 4 hours
                604800              ;Expire 1 week
                86400                ;Minimum TTL 1 day
)

                  IN NS           ns.kajukaju.net.

xx              IN PTR          ns.kajukaju.net.
yy              IN PTR          www.kajukaju.net.
zz              IN PTR          postman.kajukaju.net.

BINDの設定ファイルを編集。
設定のポイント
  ・ゾーンファイルの保存先は[/var/named]
  ・ログファイルの出力先は[/var/log/named]
  ・PIDファイルの出力先は[var/run/named]
  ・名前解決できないアドレスはISPのDNSに問い合わせる
  ・バージョン情報の秘匿のためchaosクエリを禁止する
  ・ログは必要なもの(と思われるもの)をシスログに出力[local0.info]
  ・シスログ出力時に時刻は出力しない(シスログの時刻を使うため)

  /etc/named.conf
//logging
logging {
        channel test {
                syslog local0;
                severity info;
                print-category yes;
                print-severity yes;
                //print-time yes;
        };

        category default { default_syslog; default_debug; };
        category general { test; };
        category database { test; };
        category security { test; };
        category config { test; };
        category resolver { test; };
        category xfer-in { test; };
        category xfer-out { test; };
        category notify { test; };
        category client { test; };
        category unmatched { test; };
        category network { test; };
        category update { test; };
        category update-security { test; };
        //category queries { test; };
        category dispatch { test; };
        category dnssec { test; };
        //category lame-servers { test; };
        category delegation-only { test; };
};

//options
options {
        directory "/var/named";
        pid-file "/var/run/named/named.pid";
        recursion yes;
        forward only;
        forwarders { 211.9.226.5; };
        version "9.3.2";
};


//controls
controls {};

view "in_request" in {
        zone "." {
                type hint;
                file "root.cache";
        };

        zone "localhost" {
                type master;
                file "localhost.zone";
        };

        zone "0.0.127.in-addr.arpa";
                type master;
                file "localhost.rev";
        };

        zone "kajukaju.net" {
                type master;
                file "kajukaju.net.zone";
        };

        zone "1.168.192.in-addr.arpa" {
                type master;
                file "kajukaju.net.rev";
        };
};

//Chaos Refused
view "chaos_request" chaos {
        match-clients { !localhost; };
        allow-query { none; };
        zone "." {
                type hint;
                file "/dev/null";
        };
};
ルートDNSサーバの情報が入ったファイルを取得する。
# wget ftp://ftp.internic.net/domain/named.root
# mv named.root /var/named/root.cache
ログファイル出力先やPIDファイル出力先、BIND設定ファイルなどBINDから使えるようにパーミッションを変更する。
# mkdir /var/log/named
# mkdir /var/run/named
# chown -R named:named /var/log/named
# chown -R named:named /var/run/named
# chown -R named:named /var/named
# chown named:named /etc/named.conf
起動スクリプトを作成する。
  /etc/rc.d/init.d/named
#!/bin/sh
#
# named This shell script takes care of starting and stopping
# named (BIND DNS server).
#
# chkconfig: 345 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
#
# processname: named

#
# Source Redhat function library.
#
. /etc/rc.d/init.d/functions

# Source networking configuration.
[ -r /etc/sysconfig/network ] && . /etc/sysconfig/network

RETVAL=0
prog="named"


# Tack on path to syslog-ng if not already in PATH
NAMED_PATH=":/usr/local/sbin"

PATH=$PATH$NAMED_PATH
export PATH

# See how we were called.
start() {
        # Start daemons.
        if [ -n "`/sbin/pidof named`" ]; then
                echo -n $"$prog: already running"
                return 1
        fi
        echo -n $"Starting $prog: "
        daemon named -u named -c /etc/named.conf
        RETVAL=$?;

        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/named
        echo
        return $RETVAL
}

stop() {
        # Stop daemons.
        echo -n $"Stopping $prog: "
        killproc named
        RETVAL=$?


        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/named
        echo
        return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status named
        RETVAL=$?
        ;;
  restart)
        stop
        start
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart}"
        exit 1
esac

exit $?
起動スクリプトを登録する。
# chmod 755 /etc/rc.d/init.d/named
# /sbin/chkconfig --add named
# /sbin/chkconfig --list |grep named
named           0:off   1:off   2:off   3:on    4:on    5:on    6:off
BINDを起動する。
# /sbin/service named start
named を起動中:                                            [  OK  ]

# /sbin/service named stop
named を停止中:                                            [  OK  ]

# ps aux |grep named
named    22151  0.0  0.9  5896 2448 ?     S    Jun20   1:38 named -u named -c /etc/named.conf

# netstat -an |grep 53
tcp         0       0 192.168.1.xx:53          0.0.0.0:*                   LISTEN
tcp         0       0 127.0.0.1:53               0.0.0.0:*                   LISTEN
udp        0      0 192.168.1.xx:53          0.0.0.0:*
udp        0      0 127.0.0.1:53                0.0.0.0:*
動作確認をする。
# dig @localhost any kajukaju.net
# dig @localhost -x 192.168.1.xx
# dig @localhost www.goo.ne.jp
# dig @localhost -x 210.150.25.37
サーバ稼働時のログ。
# tail -f /var/log/named/messages
Jul  3 15:14:28 bruna named[13789]: loading configuration from '/etc/named.conf'
Jul  3 15:14:28 bruna named[13789]: listening on IPv4 interface lo, 127.0.0.1#53
Jul  3 15:14:28 bruna named[13789]: listening on IPv4 interface eth0, 192.168.1.xx#53

# tail -f /var/log/named/debug.log
Jul  3 15:14:28 bruna named[13789]: general: info: zone 0.0.127.in-addr.arpa/IN/in_request: loaded serial 2006070301
Jul  3 15:14:28 bruna named[13789]: general: info: zone 1.168.192.in-addr.arpa/IN/in_request: loaded serial 2006070301
Jul  3 15:14:28 bruna named[13789]: general: info: zone localhost/IN/in_request: loaded serial 2006070301
Jul  3 15:14:28 bruna named[13789]: general: info: zone kajukaju.net/IN/in_request: loaded serial 2006070301
Jul  3 15:14:28 bruna named[13789]: general: notice: running
Jul  3 15:17:08 bruna named[13789]: general: info: shutting down
Jul  3 15:17:08 bruna named[13789]: network: info: no longer listening on 127.0.0.1#53
Jul  3 15:17:08 bruna named[13789]: network: info: no longer listening on 192.168.1.xx#53
Jul  3 15:17:08 bruna named[13789]: general: notice: exiting
許可していないネットワークからのゾーン転送要求、バージョン問い合わせ要求が来たときはログを出力するようにしている。
○ゾーン転送要求
# dig @ns.kajukaju.net axfr kajukaju.net

○バージョン情報取得要求
# dig @ns.kajukaju.net txt chaos version.bind
  /var/log/named/audit.log
21-Jul-2005 22:20:12.822 queries: info: client 192.168.1.xx#56748: view chaos_request: query: version.bind CH TXT +
21-Jul-2005 22:20:12.822 security: info: client 192.168.1.xx#56748: view chaos_request: query (cache) 'version.bind/TXT/CH' denied
ログローテートの設定
  /etc/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/mail.log /var/log/boot.log /var/log/cron.log /var/log/snmp.log /var/log/named.log {
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslog-ng.pid 2> /dev/null` 2> /dev/null || true
    endscript
}