dnscacheは、djbdnsパッケージに格納されているDNSキャッシュサーバである。 クライアントからのDNS問い合わせを受け付け、外部DNSサーバへ要求を発行 して応答を収集し、キャッシュに記憶してクライアントへ応答を返す。クラ イアントからの問い合わせが既にキャッシュ内に保持されている情報に対す るものであれば、外部への要求を行わずにキャッシュ内容を使って応答を返 す。
運用にあたっては、daemontoolsの導入がほぼ前提となっている。
以下の記述はdjbdns-1.05のインストール方法である。最新情報は 本家のdjbdnsのインストール方法 を参照されたい。
インストール先は${prefix}で示されている。例えば/usr/localなど、好みに 応じて選択する。
wgetコマンドなどで djbdns-1.05.tar.gz を取ってくる。
% tar xvzf djbdns-1.05.tar.gz % cd djbdns-1.05
インストール先をconf-homeに、コンパイル方法をconf-ccに、リンク方法 をconf-ldに記述する。
% make
# make setup check
dnscacheを、そのホスト自身からのDNS問い合わせのみをキャッシュするサー バとしてセットアップする。
dnscache用のユーザ、dnscacheのログ用のユーザを作成する。djbdnsパッ ケージ推奨のユーザ名はdnscacheとdnslogである。
自動設定コマンドdnscache-confを用いて、svscanに登録するためのディ レクトリを作成する。第1引数にdnscache用のユーザ名、第2引数にログ用 ユーザ名、第3引数にディレクトリを指定する。
# dnscache-conf dnscache dnslog /var/dnscache
注: /var/dnscacheは私の好みの設定。djbdns推奨は/etc/dnscache。
svscanに起動させ、サービスを開始する。
# ln -s /var/dnscache /service
/etc/resolv.confのnameserverに127.0.0.1を指定する。
dnscacheを、ホスト外部のクライアントからのDNS問い合わせをキャッシュ するサーバとしてセットアップする。
ローカルDNSキャッシュと同様、ユーザを作成してディレクトリを作成す る。
要求を受け入れる外部インタフェースのIPアドレスを /var/dnscache/env/IPに記述する。
/var/dnscache/root/ip/以下に、受け付ける接続元のIPアドレスを設定 する。例えば192.168.1.*からの問い合わせに応答するなら、
# touch /var/dnscache/root/ip/192.168.1
とする。
svscanに起動させ、サービスを開始する。
# ln -s /var/dnscache /service
外部に公開していないDNSサーバを参照する場合は、そのDNSサーバに関す る情報を登録しておかなければならない。
例えば net.local ドメインのDNSサーバが 192.168.1.1 と 192.168.1.2 で動作しているなら、以下のようにして登録する。
# echo 192.168.1.1 > /service/dnscache/root/servers/net.local
# echo 192.168.1.2 >> /service/dnscache/root/servers/net.local
# cp /service/dnscache/root/servers/net.local \
/service/dnscache/root/servers/1.168.192.in-addr.arpa
設定を変更したら、dnscacheを再起動する。
# svc -t /service/dnscache
例えば外部キャッシュサーバのアドレスが10.0.0.1なら、以下のようにし てすべての問い合わせを上位キャッシュサーバに行うように設定する。設 定後再起動する。
# echo 1 > /service/dnscache/env/FORWARDONLY # 10.0.0.1 > /service/dnscache/root/servers/@
ログファイル内のstats行の状態を見てキャッシュ使用状況を調べ、その値 から適切なキャッシュ容量を求める。
まずログファイル内から、最も新しいstats行とその24時間前のstats行を 以下の要領で探し出す(24時間という値はただの目安: あまり問題ではない)。
# cd /service/dnscache/log/main # cat @* current | tai64nlocal | grep stats | less ... 2002-02-04 23:13:06.005320500 stats 792 217714 1 0 ... 2002-02-05 23:18:58.336517500 stats 875 234798 1 0 ...
stats行に示されている4つの数字のうち、2番目の数字はキャッシュ移動量 である: dnscache起動時からその時までにキャッシュへ書き込んだデータ の総バイト数を示している。24時間間隔をおいた値の差分が、その間のキャッ シュ使用量になる(上記の例では 234798 - 217714 = 17084バイト)。
DNS情報のTTL(有効期限:その情報元の設定による)はだいたい3日程度、最 大でも7日なので、3日分のキャッシュ使用量程度のキャッシュ容量を確保 しておけばよい(上記の例では 17k * 3 = 50kバイト)。キャッシュ容量は /service/dnscache/env/CACHESIZE に設定されているので、必要に応じて 調整する。
デフォルト設定では、dnscacheは起動時にいつも同一の128バイトの乱数種 ファイル/service/dnscache/seed を用いている。もしシステムが何らかの 乱数発生器を持っているなら、起動するたびに /service/dnscache/seed を新たな乱数列で置き換えるようにするとよい。
例えば /dev/urandom が使用可能なら、/service/dnscache/run の先頭部 分に以下を追加する。
#!/bin/sh dd if=/dev/urandom of=./seed bs=128 count=1 > /dev/null 2>&1 ...