第20回 djbdnsに乗り換える

2005/6/7作成


記念すべき第20回はdjbdnsと、やや地味なコンテンツとなりました。
今回は実験と言うよりは完全に作業記録です。
djbのインストールなら他にもっとわかりやすいコンテンツがごろごろ転がっています。

ドメインが変わってしまったこともあってbindからdjbdnsにのりかえました。
それもあるのですが、bindを使っていて、どうもここ最近キャッシュのレスポンスが悪化していたということもありました。



1.daemontoolsをインストールする

qmailのところで、準備だけしていたdaemontoolsをようやく入れることにします。
実はqmailのところではdaemontoolsはいれていませんでした。
daemontoolsの役割は、デーモン(プロセス)を監視して、落ちたときに自動的に再開してくれることにあります。
いままでbindを使っていた落ちたことはないのですが、入れるのが一般的なようなので入れておきます。

ソースはこういうところから入手することができます。
さっそく展開するのですが、そのまえに'/usr/local/package'というディレクトリを作成しておきます。
なぜなら、daemontoolsは展開したところがそのままインストール先となってしまい、実行ファイルからなにからすべてここから実行されてしまうのです。
さすがにいつものように'/usr/local/src'に置くのは気が引けるのでこっちに作成しました。
% mkdir /usr/local/package
% cd /usr/local/package
% fetch http://tools.qmail.jp/daemontools/daemontools-0.76.tar.gz
% tar zxvf daemontools-0.76.tar.gz
% cd admin/daemontools-0.76/
% su
Password:
# ./package/install
以上で完了です。
このあと、daemontoolsを起動するために再起動するように言われますが、別にそこまでする必要はありません。
rc.localにインストーラがスクリプトを追加してあるだけなので、これをコマンドラインから実行すればOKです。
# csh -cf '/command/svscanboot &'

2.djbdnsのインストール

djbdnsのソースはこのへんから持ってきます。
djbdnsはdaemontoolsほどクセはないので、qmailと同じ要領でインストールできます。
% cd /usr/local/src
% fetch ftp://ftp.jp.qmail.org/qmail/djbdns-1.05.tar.gz
% tar zxvf djbdns-1.05.tar.gz
% cd djbdns-1.05
% su
Password:
# make
# make setup
# make check
インストールはこれでおしまいです。

3.DNSキャッシュを動かす

DNSの機能には2つあります。
ひとつは自分のドメインを管理することと、もう一つはDNSの問い合わせを中継し、問い合わせ結果を保持することです。
DNSキャッシュは後者になります。
bindの場合はひとつのプロセスで両方を受け持っていますが、djbdnsはそれぞれ別のプロセスとして動いています。
qmailなんかと同じですね。
まずは、キャッシュを動かすための専用ユーザを作ります。
dnscacheとdnslogというユーザを作りましょう。
# pw useradd dnscache -u 60050 -s /sbin/nologin
# pw useradd dnslog -u 60051 -s /sbin/nologin
つづいて、/etcにcache用のディレクトリを作ります。
バインドしたいIPアドレスを最後に付けてください。
後で出てくるcacheサーバはコンテンツサーバ(tinydns)とIPアドレスを変更するのが望ましいようです。
詳しくはこのへんを読みましょう。
# dnscache-conf dnscache dnslog /etc/dnscache 192.168.0.1
このときに設定したIPアドレスがDNSキャッシュサーバのアドレスになります。
続いてキャッシュへのアクセス権を設定します。
変な人がキャッシュを利用しないようにするためです。
# touch /etc/dnscache/root/ip/192.168.0
# touch /etc/dnscache/root/ip/127.0.0.1
これで192.168.0.0/24のエリアとlocalhostからのみキャッシュへのアクセスが可能になります。
そのあと、手順書ではdaemontoolsが使用するために/serviceにシンボリックリンクを用意します。
シンボリックリンクを作ったらすぐにdaemontoolsがプロセスを立ち上げてしまいます。
うまく立ち上がらないのはbindが動いている可能性があります。bindは何もしないと*:53のポートを使うのでポートが競合して立ち上がらないようです。
とりあえず、今回はリンクは作らずに最後にリンクを作ることにします。

4.DNSサーバを動かす(準備)

キャッシュが動いたら今度はサーバを動かしましょう。
DNSサーバにはさらに2つの機能があります。
ひとつはDNSの問い合わせに答えることで、もうひとつはゾーン転送と呼ばれるセカンダリDNSとの同期です。
前者はtinydnsというプログラムで動いているようです。ゾーン転送はaxfrdnsのようです。
導入手順はcacheを動かしたときとなんとなく似ています。
tinydnsユーザとaxfrdnsユーザとdnslogユーザを作成します。
dnslogユーザはdnscacheのときに作ったので今回は作らなくてもいいです。
# pw useradd tinydns -u 60052 -s /sbin/nologin
# pw useradd axfrdns -u 60053 -s /sbin/nologin
続けてcacheのときと同様にディレクトリを作成します。
最後にIPアドレスを書きますが、前述の理由により違うアドレスがいいようです。
# tinydns-conf tinydns dnslog /etc/tinydns 211.129.133.XXX
# axfrdns-conf axfrdns dnslog /etc/axfrdns /etc/tinydns 211.129.133.XXX

5.DNSサーバを動かす(bindからのゾーン転送)

bindからの移行の場合、bindと直接通信してゾーン転送してもらい、設定を持ってくることができます。
一応次のような方法でできますが、管理するホストが少ない場合ははじめから作り直した方がスッキリすると思います。
# cd /etc/tinydns/root
# tcpclient ns.example.com 53 axfr-get example.com zone-example zone-example.tmp
コマンドは、「ns.example.comのDNSに問い合わせて、example.comドメインの情報のゾーン転送してもらい、zone-exampleとして保存する」と解釈しましょう。
この調子で他のゾーンも転送します。
うちの場合は逆引きのゾーンと、ローカルネットワーク用のゾーンがあったのでこれを実行します。
ちなみにインターネット側の逆引きはうちが管理じゃないので使いません。
# tcpclient ns.local.example.com 53 axfr-get local.example.com zone-examplel_local zone-example_local.tmp
# tcpclient ns.local.example.com 53 axfr-get 0.168.192.in-addr.arpa zone-0.168.192.local zone-0.168.192_local.tmp
そうすると、zone*というファイルがいくつかできました。
これらをsortして連結してmakeします。
# sort -u zone* > data
# make
できあがり。でもすごいめんどくさいです。

6.ゾーン転送の設定

ゾーン転送の設定ファイルは/etc/axfrdns/tcpです。
ゾーン転送を許可するホストを設定します。
# /etc/axfrdns/tcp
192.168.0.:allow
こうすると192.168.0.0/24のホストにゾーン転送を許可することになります。

7.レコードの新規登録

bindから移行しない場合は次の手順でレコードを追加していきます。
7−1.ドメインの委譲
daily-labo.comのドメイン管理を委譲してもらうにあたり、基本的な設定をします。
このへんを見ながらやるといいです。
tinydnsのディレクトリへ移動し、add-nsツールで自分が管理するドメインを教えてあげましょう。
# cd /etc/tinydns/root
# ./add-ns daily-labo.com 211.129.133.XXX
上は、daily-labo.comというドメインのネームサービスを211.129.133.XXXというアドレスで行うという意味です。
これを設定することで、a.ns.daily-labo.comがNSレコードとして追加され、211.129.133.XXXがa.ns.daily-labo.comに自動的にバインドされます。
ついでにSOAレコードやシリアルも勝手に設定してくれるようです。
なにもしないと次のようにSOAレコードが登録されました。
Primary nameserver: a.ns.daily-labo.com.
Hostmaster E-mail address: hostmaster.daily-labo.com.
Serial #: 111763XXXX
Refresh: 16384
Retry: 2048
Expire: 1048576
Default TTL: 2560
hostmasterのアドレスがちょっと見慣れないアドレスです。
メールアドレスを設定していない場合は登録しておきましょう。
おさらいすると、add-nsをすると次のようなことを自動的にやってくれるようです。
7−2.AレコードとCNAMEレコードの登録
つづけてAレコードとCNAMEレコードを追加していきます。
Aレコードの追加はadd-hostで、CNAMEレコードの追加はadd-aliasを使います。
# ./add-host host.daily-labo.com 211.129.133.XXX
# ./add-alias www.daily-labo.com 211.129.133.XXX
7−3.MXレコードの登録
メールを使うためにはMXレコードを登録したほうがいいでしょう。
MXレコードの登録はadd-mxを使います。
# ./add-mx daily-labo.com 211.129.133.XXX
こうすることで、MXレコードが追加されます。
実はついでにAレコードも追加されていることも気をつけなければいけません。
SMTP用にa.mx.daily-labo.comが登録されています。
7−4.make
それぞれのコマンドだけでは反映されていません。
makeコマンドを実行しましょう。
# make
7−5.おまけ
/etc/tinydns/rootにあるdataファイルを直接いじることで設定することも可能です。
たとえば「.(ドット)」の後にドメインを入れることでNSレコードの登録ができます。
それぞれ次のような意味があります。
.(ドット) NSレコード、SOAレコード、Aレコードを追加
=(イコール) Aレコード
+(プラス) CNAMEレコード
@ MXレコード、Aレコード
7−1から7−3までの設定を入れるとdataファイルは次のようになっているはずです。
.daily-labo.com:211.129.133.XXX:a:259200
=host.daily-labo.com:211.129.133.XXX:86400
+www.daily-labo.com:211.129.133.XXX:86400
@daily-labo.com:211.129.133.XXX:a::86400

8.起動

では最後にdaemontoolsに管理させるためシンボリックリンクをおきます。
その前にbindを停止してdaemontoolsを起動します。
# killall named
# csh -cf '/command/svscanboot &'
そしてシンボリックリンクを作成。
# ln -s /etc/dnscache /service/
# ln -s /etc/tinydns /service/
# ln -s /etc/axfrdns /service/
これで完了です。
PCを再起動しておくと安心かもしれません。

自動的にbindが立ち上がるようになっている場合はrc.confを修正したり、Linuxな人はchkconfigしたりして停止しておきましょう。

9.確認

どういうわけかnslookupが使えなくなっています。
nslookupは具合が悪いようなのでdigなどで確認するのがいいでしょう。
外部から動作を確認したい場合はDNS StuffDNS Reportなどを使うと便利です。

参考文献

djbdns入門 http://djbdns.qmail.jp/jp/

djbdns日本語サイト(たぶん本家) http://djbdns.qmail.jp/djbdns.html


もどる