BIND 9.3.2 を daemontools で走らせる
SERVER
DNS サービス
DNS サービスとは、インターネットで使用するドメイン名の "名前解決" を行うための仕組みです。
インターネット上のコンピュータには IP アドレスと呼ばれる数値が設定されていて、それを用いることでネットワーク越しにコンピュータ間で通信を行うことが出来るようになっています。けれど人にとって数字を取り扱うのはなかなか苦手なことでもあります。そこで人は、たとえば EZ-NET.JP のようなドメイン名を利用することで取り扱いやすくするための DNS という仕組みを用意しました。
DNS サーバにはドメイン情報とそれに関連する IP アドレスの情報がデータベースとして保持されていて、要求があるとそのドメイン名に対応する IP アドレスを検索して、その情報を返します。この一連の仕組みのことを "名前解決" といって、これを暗黙的に利用することで簡単に目的のコンピュータへアクセスすることが出来るようになっています。
今回は DNS サービスを提供するアプリケーション BIND の 9.3.2 を Linux Slackware 10.2 へインストールしてみることにします。
起動には、Slackware の中の仕組みである "/etc/rc.d" による方法の他にも、qmail などでよく利用される daemonntools に含まれる svscan を用いた方法でも起動してみることにしました。
BIND 9.3.2 のインストールと簡単な設定
今回は ISC (INTERNET SYSTEMS CONSORTIUM) から提供されている DNS サーバ BIND の 9.3.2 をダウンロードして Slackware 10.2 へインストールしてみることにしました。
"bind-9.3.2.tar.gz" をダウンロードしたら、それをたとえば /usr/local/src ディレクトリあたりにでもコピーして、次のようにして展開およびインストールを行います。
tar xvzf bind-9.3.2.tar.gz
cd bind-9.3.2/
./configure
make
make install
こうすることで、/usr/local/sbin に named がインストールされました。
そしてインストールした BIND 9.3.2 を起動してみます。
起動するに当たっては、いくつか準備が必要なようです。インストールした段階では "/etc/named.conf" などは用意されないようですので、自分で作成する必要がありそうです。また、BIND の起動に使用するアカウントの作成も必要です。
また、今回はこの BIND を動かそうと思っているサーバには djbdns に含まれる dnscache という名前解決を行うためのサービスが既に稼動している環境のため、それと併用して起動できるように、待ち受ける IP アドレスの指定も行っておくことにします。
BIND で待ちうけ IP アドレスを指定する場合には named.conf 内で "listen-on" を用いて指定してあげれば良いようです。
それでは、まずは BIND を動かすためのアカウントとグループとを作成しておくことにします。
groupadd -g 600 bind
useradd -u 600 -g bind -d /dev/null -s /bin/false bind
これによって GID=600 の bind というグループおよび、それに所属する UID=600 の bind というユーザアカウントを作成することが出来ました。
続いて BIND を起動する上で必要な "named.conf" ファイルのうち、BIND の大まかな動作を決定する部分についての調整です。"named.conf" ファイルを /etc ディレクトリに作成したら、とりあえず次のような内容をそこへ書き込んでおきました。
また基本的な動作設定とあわせて localhost ゾーンに関する設定も併せて記載してみました。
options {
directory "/var/named";
pid-file "/var/run/named/pid";
listen-on { 192.168.0.1; };
recursion no;
allow-query {
any;
};
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "0.0.127.in-addr.arpa.rev";
};
こんな感じの設定で、とりあえずゾーンファイルを "/var/named" ディレクトリへ格納して、再起呼び出しは無効で登録されている情報のみの名前解決を提供し、要求を待ち受ける IP アドレスは 192.168.0.1 という感じとしてみました。
さらに基本的な localhost ドメインとその逆引き用の設定もしておきました。それらの情報は "/var/named" にそれぞれ "localhost.zone" と "0.0.127.in-addr.arpa.rev" ファイルに別途格納しておきます。それらの内容は次のような感じです。
localhost.zone
$TTL 86400
@ IN SOA ddns.ez-net.jp. admin.ez-net.jp. (
1 ; serial
3600 ; refresh
900 ; retry
3600000 ; expire
3600 ; minimum
)
IN NS ddns.ez-net.jp.
IN A 127.0.0.1
0.0.127.in-addr.arpa.rev
$TTL 86400
@ IN SOA ddns.ez-net.jp. admin.ez-net.jp. (
1 ; serial
3600 ; refresh
900 ; retry
3600000 ; expire
3600 ; minimum
)
IN NS ddns.ez-net.jp.
1 IN PTR localhost.
これで、とりあえずではありますけど、基本的な設定は完了です。
あとは今回は BIND を bind というアカウントにて起動しようと思うので、プロセス ID を書き込むファイルを保存するディレクトリへ、BIND 起動アカウントが書き込みできるようにしておきます。
プロセス ID を書き込むファイルは "named.conf" の pid-file にて指定したのがそれですので、今回の場合は次のようにして "/var/run/named" ディレクトリを作成して、そして権限を調整しておきます。
mkdir /var/run/named
chown bind.bind /var/run/named
こうすることで bind アカウントにてファイルの読み書きが出来るようになるので、BIND 起動時にプロセス ID を書き込まれたファイルをここに保存することができ、BIND が正常に動作するようになります。
なお、ここに書き込み権限が設定されていない場合には BIND がすぐに停止してしまうので注意です。
BIND を起動させる
Slackware 10.2 の仕組みの中で起動させる
準備がしっかりと整っていれば、BIND の起動は簡単です。
BIND は /usr/local/sbin/named としてインストールされているので、あとはそれを起動スクリプト中で実行させてあげる感じになります。今回の slackware 10.2 の場合は "/etc/rc.d/rc.bind" という名前のスクリプトを用意して実行権限を設定してあげれば、あとはシステム起動時に自動的に BIND を起動してもらえます。
#!/bin/sh
PROC_NAME="named"
PROC_PATH="/usr/local/sbin"
PROC_USER="bind"
PROC_CMD="${PROC_PATH}/${PROC_NAME} -u ${PROC_USER}"
proc_start()
{
echo "Starting: ${PROC_CMD}"
${PROC_CMD}
}
proc_stop()
{
killall ${PROC_NAME}
}
proc_restart()
{
proc_stop
sleep 1
proc_start
}
case "$1" in
'start')
proc_start
;;
'stop')
proc_stop
;;
'restart')
proc_restart
;;
*)
echo "usage $0 start|stop|restart"
esac
スクリプトへの実行権限の設定は次のような感じです。
chmod +x /etc/rc.d/rc.bind
ちなみに起動の詳細な仕組みとしては、Slackware 10.2 の場合、/etc/rc.d の中の rc.inet2 にて "rc.bind" スクリプトが実行可能として存在してあった場合には、一連の起動プロセスの中で "/etc/rc.d/rc.bind start" を実行してくれるようになっています。
daemontools の svscan で起動させる
今回の環境では dnscache をインストールしていることもあって、daemontools に含まれる svscan も利用できるようになっていました。
svscan とは主に qmail などで利用される daemontools に含まれたサーバープロセスを監視するプログラムです。daemontools のインストールに関するお話は EZ-NET: Slackware 10.0 へ daemontools を組み込んでみる にて触れてあります。
個人的にはなんとなく svscan が好きなので、それを用いて BIND を実行させる方法にも触れておこうと思います。
なにはともあれ svscan でサービスを起動させるためには、そのアプリケーションがフォアグラウンドで起動できる必要があります。もしもバックグラウンドでの動作のみのアプリケーションを svscan で動かそうとした場合は厄介なことになってしまいます。
というのも、svscan はプロセスの動作状況を監視して何らかの都合でそれが停止してしまった場合にはプロセスを復帰させてくれるのですけど、起動したプロセスがバックグラウンドに移行してしまうと、svscan はサービスが停止したものと思ってしまうのか、復帰させるつもりで何度も何度もプロセスを重ねて起動させてしまうのでした。
BIND について調べてみると、ディフォルトではバックグラウンドで動作しますけど、"-f" を付けて起動することでフォアグラウンドでも動作させることができるとのことでした。これならば svscan で問題なく動作させることができそうです。さらには "-g" によって起動することでフォアグラウンドで起動しつつ、ログを全て標準エラー出力へとまわすことができるとのことでしたので、これならば svscan のログの仕組みを用いてログを収集することも可能です。
このような感じから svscan による起動もしっかり出来そうなので、試してみることにします。
もちろん "/etc/rc.d" による起動と併用する必要はありませんので、"/etc/rc.d/rc.bind" は無かったものとした上で、改めて設定するといった感じになります。これで上手く行けば、個人的にはこちらを利用して BIND を起動させることにするつもりです。
その準備として、まずは次のようにして /var/named ディレクトリに sticky bit を立てておきます。
chmod +t /var/named
そして次のような感じの内容で "run" という名前のファイルを作成します。
#!/bin/sh
BIN_BIND="/usr/local/sbin/named"
USERNAME="bind"
exec ${BIN_BIND} -u ${USERNAME} -g 2>&1
svscan で起動する場合には exec コマンドでプログラムを実行する必要があるとのことなので、ここでもそうしてあります。
また svscan はプロセスを管理する都合でプログラムがフォアグラウンドで動作していないといけないため、"-g" オプションを指定しています。"-g" オプションによってログが標準出力へ書き出されますので、svscan のログ収集に合うように、それを標準出力へと混ぜ合わせます。
続いて、ログ収集用のディレクトリの作成です。
mkdir /var/named/log
svscan にログを収集させたい場合には "/var/named" ディレクトリの中に "log" ディレクトリを作成します。そしてその中に次のような感じの "run" スクリプトを作成しておきます。
#!/bin/sh
exec /usr/local/bin/multilog t ./main =status
これらの準備が終わったら、起動用とログ用の run スクリプト両方に、次のようにして実行権限を与えておきます。
chmod +x /var/named/run
chmod +x /var/named/log/run
あとは次のようにして /service ディレクトリへ /var/named へのシンボリックリンクを作成すれば完成です。
ln -s /var/named /service
rndc を有効にする
BIND の "named.conf" を書き換えた場合などには、一般には "rndc" という命令を使用するようです。
ただ、この命令は BIND をインストールすることでプログラム自体は用意されるのですけど、それだけでは "rndc.conf" などの必要な情報がそろわないために利用することができないようです。なので今回はそのあたりの調整も行っておくことにします。
rndc を有効にするために、まずは "rndc.conf" ファイルを生成します。これは BIND をインストールしたときに組み込まれる "rndc-confgen" というプログラムを用いて生成することが出来るようですので、次のような感じで "rndc.conf" ファイルを生成しておきます。
rndc-confgen > /etc/rndc.conf
rndc と named とで連携を取るには HMAC-MD5 暗号アルゴリズムによって作られた鍵が必要となるようです。この鍵は "rndc-confgen" が自動的に生成してくれるようで、その値は rndc.conf の "secret" の部分に記載されています。
そして実際に rndc-confgen によって作られるファイルの内容は次のような感じになりました。
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "8cSnFBD1Ibij6be99O8+oQ==";
};
options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# algorithm hmac-md5;
# secret "8cSnFBD1Ibij6be99O8+oQ==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf
この中の "# Start of rndc.conf" から "# End of rndc.conf" までが /etc/rndc.conf ファイルとしての内容で、その次の "# Use with the following in named.conf, adjusting the allow list as needed:" から "End of named.conf" までは /etc/named.conf の適切な部分へ挿入する感じです。
他にも "named.conf" の設定の中で、今回の設定でも指定してありますけど "directory" および "pid-file" の指定が必要らしいので、もしそれらを設定していないで上手く行かない場合には、それらも追加しておくのが良さそうです。
それ以外にも options に "auth-nxdomain: yes" をつけて、もし登録されていないドメインに対する検索依頼 (NXDOMAIN; Non existent domain) があったときにも、信頼のおける情報 (Authoritative Answer) というような回答を示す "AA" フラグを付ける必要もあるようなことが書かれた資料もありましたけど、少なくとも今回の環境では大丈夫そうでした。
これらの設定を行ったら、いったん BIND を再起動します。
svc -h /service/named
今回は svscan を用いて BIND を起動していますので、このようにして再起動することが出来ました。
これで準備完了です。あとは設定が正しく行えているかどうか、次のようにして BIND のデータベースを再読み込みさせてみて、設定が間違えていないか確認しておくと良さそうです。
rndc reload
HMAC-MD5 暗号鍵を生成するには …
上記では "rndc-confgen" を用いて HMAC-MD5 暗号アルゴリズムによる鍵を自動的に作成してもらいましたけど、このツールに頼らないで手動で生成することも出来ます。これには "dnssec-keygen" というプログラムを用いて作成します。
次のようにすることで、実行したディレクトリへ生成した鍵が保存されたファイルが作成されます。このとき "-n user" オプションに引き続いて BIND を起動するのに使うアカウント名 "bind" を指定しておきますが、これはたぶんあまり意味をなさらないものなのではないかと思います。
dnssec-keygen -a hmac-md5 -b 128 -n user bind
これで "Kbind.+157+14008.key" および "Kbind.+157+14008.private" という 2 つのファイルが生成されます。
ここの "14008" のところは任意の数値で、"bind" のところは -n user で指定したユーザ名が現れてくるようです。そして ".key" で終わるファイルは "named.conf" で使用する公開鍵、".private" で終わるファイルは "rndc.conf" で使用する秘密鍵とのことでした。でも中身を見てもどちらとも似たような感じでしたので、便宜上の公開鍵と秘密鍵といった感じなのではないかと思います。
このような感じで鍵を生成した場合には、"named.conf" と "rndc.conf" には、今回の手順で出来上がったファイルの中の "key: " 以降の "8cSnFBD1Ibij6be99O8+oQ==" といった無作為に生成されたような感じのアルファベット文字列を "secret" として設定してあげる感じになるようです。