bindインストール

気を取り直して先に色々いれていきます。まずはbindから今回は以下の様な設定をします。

  • プライベート内のサーバの名前を解決(コンテンツサーバ)
  • クライアントマシンの問い合わせに答える(キャッシュサーバ)

です。コンテンツサーバというのはいわゆるSOAレコードを持ってるサーバですかね。自分が管理しているゾーンへの問い合わせがあった場合に答えてあげるサーバです。よくDNSの説明で出てくるツリー構造の一部として働くサーバですね。今回はグローバルの解決はしないので、ツリーには参加しないわけですが。一方キャッシュサーバはクライアントの変わりにホスト名を聞きにいってくれるサーバですね。コンテンツサーバと違って自分が管理していないゾーンだとしても権限のあるDNSサーバに聞きにいってクライアントに答えて上げるサーバです。具体的に設定でいえばrecursion yes;で有効になりますね。ちなみに自分が知らないドメインの場合ルートサーバまで聞きにいく方法と自分が指定したサーバに聞きに良く方法と2種類が確か設定できたはずです。forwardだったかな。デフォルトではルートに聞きにいくはずなので特に気にする必要はないですが、内部に複数DNSサーバがある場合は親分サーバを用意してそこに聞きにいくほうが良かったりするかもしれませんね。まあいいや。さくっと行きます。

インストール


$ wget http://ftp.isc.org/isc/bind9/9.5.0-P1/bind-9.5.0-P1.tar.gz
$ tar zxvf bind-9.5.0-P1.tar.gz
$ cd bind-9.5.0-P1
$ ./configure --prefix=/usr/local/services/bind
$ make
# make install

この前、キャッシュポイズニングのSAが出てましたね。さて後は淡々と設定を。

  • rndc.conf(rndcの設定ファイル)


# cd /usr/local/services/bind/etc
# /usr/local/services/bind/sbin/rndc-confgen
> rndc.conf

rndcはnamedを操作するためのAPIを提供してくれるコマンドです。

  • name.root (ルートサーバのhintsファイル)


wget ftp://ftp.internic.net/domain/named.root

  • named.conf (bindの設定ファイル)


key "rndc-key" {
algorithm hmac-md5;
secret "xxxxxxxxxxxxxxxxxxxxxxxx";
};

controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl private {
127.0.0.1;
192.168.11.0/24;
192.168.0.0/24;
172.16.0.0/24;
10.0.0.0/24;
};

options {
directory "/usr/local/services/bind/etc";
pid-file "/usr/local/services/bind/var/run/named.pid";

recursion yes;
max-ncache-ttl 300;
max-cache-ttl 3600;

allow-query {
private;
};
};

logging {
channel "default_syslog" {
syslog local5;
};
category lame-servers {
null;
};
category default {
default_syslog;
};
};

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

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

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

zone "home" IN {
type master;
file "home.zone";
};

zone "0.168.192.in-addr.arpa" IN {
type master;
file "0.168.192.rev";
};

zone "0.16.172.in-addr.arpa" IN {
type master;
file "0.16.172.rev";
};
zone "0.0.0.in-addr.arpa" IN {
type master;
file "0.0.10.rev";
};

ポイントは

  • 頭のrndcの設定はrndc.confからコピペ
  • aclとallow-queryで内部からしか問い合わせできないように
  • LDAPのところで言ってた通り内部ゾーンのドメインはhomeに

くらいですかね。後は各ゾーンファイルを淡々とかくだけです。ここでは量が多いので割愛。ゾーンファイルはnamed-checkzoneでsyntaxチェックができるので、これを使うと設定の効率があがります。


named-checkzone ゾーン名 ファイル

ex)
# named-checkzone home home.zone

出力にOKがあれば大丈夫です。


zone home/IN: loaded serial 20080719
OK

また、全体の設定はnamed-checkconfでチェックできます。


# named-checkconf named.conf

こちらは正常な場合出力がありません。一応


# echo $?
して0が出るのを確かめるくらいですかね。エラーがある場合は出力が出たと思います。設定変更したときとかは常に打つ癖をつけとくと良いですね。(´・ω・`)

設定はこれだけです。例によって起動スクリプトを。

  • /etc/init.d/named


#!/bin/sh
#
# named This shell script takes care of starting and stopping
# named
# chkconfig: - 18 82
# description: named is a dns daemon that offers domain name service
#

BINDDIR=/usr/local/services/bind
PIDFILE=$BINDDIR/var/run/named.pid
CONFFILE=$BINDDIR/etc/named.conf
PROG=$BINDDIR/sbin/named

PATH=$BINDDIR/sbin:$BINDDIR/bin:/usr/bin:/bin:/usr/sbin:/sbin

. /etc/init.d/functions

start() {
echo -n $"Starting $PROG: "
daemon $PROG -c $CONFFILE
retval=$?
echo
return $retval
}

stop() {
echo -n $"Stopping $PROG: "
killproc $PROG
retval=$?
echo
return $retval
}

case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $PROG
RETVAL=$?
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
esac

exit $?

基本的に使いまわしなので後々ちょっと最適化したいかな。まあでも実際はrndcコマンドに頼ることが多いかと思います。せっかくなのでrndcについてもちょっとまとめきます。全部じゃないですが良くつかいそうなのと、面白いと思うのです。

  • rndc reconfig

新規に追加したゾーンを読み込み(既存分は読み直さない)

  • rndc reload

既存のゾーン設定を再読み込み

  • rndc dumpdb

キャッシュされているデータをファイル出力

  • rndc flush

キャッシュをクリア

  • rndc querylog

クエリーログ(ユーザの問い合わせのログ)のオフ、オン。クエリーログはたくさん来てログファイルが肥大化するので必要な時だけ動的に使えるのは良いですね。


少し前のバージョンでrndc reloadはゾーン指定して実行できるようになったかな。使ったことないですが。ついでだからdigもたまに使うけど忘れやすいものをメモ

ゾーン情報を取得。セカンダリサーバからプライマリサーバにtransferが許可されてるか確認したりするのに使えますね。

  • dig @DNSサーバ chaos txt version.bind

bindのバージョンを調べる。これは最近知りました。サーバの設定で許可されてなければ無理らしいですが。

結構さくっとあげれました。しかし、SPFとかCIDRアドレスの逆引きとかもっと上位のレジストラの仕組みとか知識が増えたら増えたでまた勉強することがでてきますね。実に奥が深いものです。3年前 「DNSって何?おいしいの?」 とバイト先で初めて設定したころからすれば大分知識がついたと思いますが( ゚Д゚)y~~

余談ですが、VMWareでいっぱいホスト作って偽DNSルートとその子をいくつか作って仮想DNSツリーを作ったことがあります。マシン確保できるならVMWareである必要は全くないですが。あれ、VMじゃなくてOpenVZだったか。まあ使うものはなんであれ、あれはとても勉強になったので、ツリー構造とかわかんねえヽ(`Д´) ノウワァァァンって方はやってみるば勉強になるかと思います。ちなみにゾーン名は上から syacho, bucho, hiraとかにしてました。社会の縮図ですね。