作成開始 : 平成16年11月07日(日)  最終更新日 : 平成20年10月23日(木)

djbdnsでDNSキャッシュ・サーバーを試す!


「単に試してみたかった。」ってのもありますが、DNSのお勉強をしたく検索していたら見つかりました。
色んなサイトの説明文によると「複雑怪奇なBINDよりも簡単で軽く、高速に動作する」とありました。
DNSサーバーとしての各種機能はありますが、まずはLAN内で外部DNSのキャッシュ・サーバーとして使ってみることにしました。
これにより、ルートDNSからの検索をせずに、プロバイダのDNSサーバーの混雑などにに関係なくLAN内に構築したDNSキャッシュ・サーバーのキャッシュから目的のサイトに行けるようにしました。(・・・・のつもりです)
 なお、LAN内の名前解決についての構築も考えましたが、各サーバーの運用管理が面倒くさいし今のところ hosts だけで事足りているので今回は見送りました。
もっとサーバー機が少なくなったらやってみたいと思います。
      ↓
やってみました。(平成20年06月22日[日])


1.構築したPCと構成概要

こんなんでも機能を限定すれば十分動きます。 NEC PC-9821Ne

CPU : 33MHz
MEM : 14Mbyte
HDD : 350Mbyte

NICを2枚挿してFireWall (IPフィルターリングレベル・ゲートウェイ) とメールサーバーとして使用中!!
     ↓
この時の環境が壊れてしまった(HDD不良)ので現在は、拡張BOXを外し RATOCのNICで動いています。(平成20年06月22日[日])
メール・サーバー、NTPサーバー、DNSサーバー稼動中

こんな低スペックでも機能限定すればかなり軽快に動作します。

こういう動作概念です。

192.168.2.0ネットワークの別PCにしてもよかったんですが、電気量増やしたくないし192.168.2.0ネットワークの入口なので「FireWall & Mail Server」に構築してみました。


2.djbdnsの紹介・・・・・・EZ-NET 特集: DNS サーバ djbdnsより引用

djbdns とは、qmail の作者、D.J.Bernstein さんが作成したネームサーバです。
http://djbdns.jp.qmail.org/djbdns/ に掲げられていますけど、「安全、確実、高速、簡潔、設定も簡単な DNS ツール群」 が売り文句になっているようです。
これらは複数のプログラムセットで校正されていて、それぞれが必要最小限の役割を担っています。なので適切で安全な運用を図ることができるようになっています。
インストールが面倒だったり、BIND などと比べて極端に環境が違ったりと、なれないうちは大変なことが多いのですが、慣れてしまえばかなり効率よく扱えるものと思います。
また、セキュリティーホールが無いと断定できそうなほどの安心感も魅力です。
DNS のようなサーバソフトウェアの場合、バージョンの差し替えというのは大体、セキュリティホールの埋め合わせが大きく絡んでくるでしょうから、バージョンの差し替えのわずらわしさからも疎遠になります。
・・・・・・とのことです。

3.参考にしたサイト

前田年紀さんのサイト  取付け隊 on Web・・・・ここにある「FreeBSD備忘録」  

4.配布ファイルの準備

全て前田年紀さんのサイト からダウンロードできます。どちらもとっても小さいです。

djbdns をインストールする前に daemontools が必要です。ダウンロードしておきましょう。→daemontools-0.76.tar.gz(36,975byte)
djbdns本体 → djbdns-1.05.tar.gz(85,648byte)

5.インストールと設定

(1)daemontools
・Windowsクライアントで取得した daemontools-0.76.tar.gz をftpでアップロードします。
・環境を構築するサーバーに telnet でログインしスーパーユーザ(root)に移行します。
・カレントディレクトリを / (cd / [Enter])にしディレクトリ package を作成します。(mkdir -p package [Enter])
・パーミッションを設定します。(chmod 1755 package [Enter])
・カレントディレクトリを /package (cd package [Enter])にします。
・daemontools-0.76.tar.gz を移動します。(mv /home/takaq/daemontools-0.76.tar.gz . [Enter])
・daemontools-0.76.tar.gzを解凍します。

 gunzip daemontools-0.76.tar.gz [Enter]
 tar -xpf daemontools-0.76.tar [Enter]

・daemontools-0.76.tar はもういらないので削除します。(rm daemontools-0.76.tar [Enter])
・カレントディレクトリを /package/admin/daemontools-0.76 に移動します。(cd admin/daemontools-0.76 [Enter])
・コンパイルと設定を実行します。

 package/install [Enter]

 コンパイルは(この非力なPCでも)結構早く終わります。この過程でサービス・ディレクトリ /service が作成されていました。

・/etc/rc.local に次のような記述が追加されていました。

        csh -cf '/command/svscanboot &'

・変更を反映させるためリブートしました。
 そうしたら、ローカル・パッケージ実行のところで今までなかった表示(pid)がありました。
 また、top や ps aux で見ると svscan のプロセスを確認できました。
(2)djbdns
・Windowsクライアントで取得した djbdns-1.05.tar.gz をftpでアップロードします。
・環境を構築するサーバーに telnet でログインしスーパーユーザ(root)に移行します。
・カレントディレクトリを /usr/local に移動します。 (cd /usr/local [Enter])
・ソースを保存・展開するディレクトリを作成します。(mkdir src [Enter] →既にある場合は読み飛ばしてください)
・カレントディレクトリを /usr/local/src に移動します。(cd src [Enter])
・djbdns-1.05.tar.gz を移動します。 (mv /home/takaq/djbdns-1.05.tar.gz . [Enter])
・パッケージの解凍・展開をします。

 gunzip djbdns-1.05.tar.gz [Enter]
 tar -xf djbdns-1.05.tar [Enter]

・カレントディレクトリを /usr/local/src/djbdns-1.05 に移動します。(cd djbdns-1.05 [Enter])
・コンパイルを実行します。

 make [Enter]

 ここも(この非力なPCでも)結構早く終わります。

 make setup check [Enter]

 成功するとなんかの成功報告を表示するとのことでしたが、私のとこでは何も表示せずにプロンプトが返ってきました。

・リブートします。

※ここでリブートしないと、この後の工程で dnscache-conf を使う場面がありますが、ll では見えているのですが実行しようとすると「ファイルが見つかりません」みたいになります。
(3)djbdnsをローカルPCからの外部DNSキャッシュ・サーバーとして設定(全てスーパーユーザで実行)
・djbdns用のユーザ(Gdnscache, Gdnslog)とグループ(Gdns)を作成します。

 vi で /etc/group に以下を追加(viでも動くけど、ここは/stand/sysinstallで作った方がいいみたい)

 Gdns:*:81:

 vipw で /etc/passwd に以下を追加(他の行をコピペして記述した方が正確ですね)

 Gdnscache:*:81:81::0:0:DNS cache:/noexistent:/sbin/nologin
 Gdnslog:*:82:81::0:0:DNS log:/noexistent:/sbin/nologin


・カレントディレクトリを /usr/local/bin に移動します。(cd /usr/local/bin [Enter])
・以下のような感じで /etc/dnscache サービスディレクトリを作成します。

 dnscache-conf Gdnscache Gdnslog /etc/dnscache 192.168.2.1 [Enter]

  行末のアドレスはキャッシュ・サーバーとして設定するPCのIPアドレスです。
  ※環境を作り直しする時は /etc/dnscache を rm -rf しここからするといいです。
    でないと、これ実行で「既にあります」みたいなメッセージを返されます。
    私は、最初間違って環境作ってしまったので・・・・・間違い環境はいらなかったので rm -rf /etc/dnscache しました。

・新しいサービスを svscan に通知します。 svstat を使って、サービスが動いたことを確認します。

 ln -s /etc/dnscache /service [Enter]
 sleep 5 [Enter]
 svstat /service/dnscache [Enter]

/etc/dnscache/root/ip の下にこのキャッシュを使ってよいクライアントの IP アドレスを名前にもつファイルを作ります。

 touch /etc/dnscache/root/ip/192.168.2 [Enter] → 192.168.2.0/24のPCは利用できるよぉーです。

※ネットワークの追加などで別なアドレス帯に利用許可するには上記の方法でアドレス帯に相当するファイルを作成します。
例→ touch /etc/dnscache/root/ip/192.168.1 [Enter] → 192.168.1.0/24のPCは利用できるよぉーです。
即反映されます。リブートやdjbdnsの再起動は必要ありません。(2005/05/30 追記)


viで/etc/dnscache/env/FORWARDONLY を作ります。

 内容はプロバイダのDNSサーバーの先頭(例えば 218.47.162.1, 218.47.162.9ならば 218)を書きます。
   ↑
※最初ここを「touch /etc/dnscache/env/FORWARDONLY」で作ってしまいました。しばらく正常(?)に機能していましたが定期休息日に、PCリブートしたら正常に動作しなくなりました。(かなりハマリました)
なので、vi で 218 と書いてリブートしたらOKになりました。(ふうぅー)


・vi で /etc/dnscache/root/servers/@に、プロバイダのDNSサーバ(プライマリ、セカンダリ)のIPアドレスのみを記述します。

・このサーバー機の /etc/resolv.conf を 192.168.2.1 にします。こんな感じです。

 serch
 nameserver 192.168.2.1

・インターネットホストのアドレスが検索できるか調べます。

 dnsip a www.plala.or.jp [Enter]  ・・・で下のように返ってきたらOKです。

 218.47.162.65 218.47.162.66

・各クライアントPCのプライマリDNSを192.168.2.1のみにしてWebブラウザでアクセスしてみます。
 無事アクセスできました。OKです。(念のためにこの後ろにプロバイダのDNSサーバーを追記しといてもよいでしょう)

6.付記

dnscache が裏でしていることを見たいなら、 /service/dnscache/log/main/currentを見てみます。
※このファイルは一定量になると別名のファイルにログ出力されます。このファイルは10個でmultilogになっています。
ですので、増えっぱなしにはなりません。
こんな感じになっています。
・FreeBSDの各PCからnslookupを実行するとこんな風になります。
WindowsPCからもちゃんとできます。
・最初、/etc/dnscache/env/FORWARDONLYをtouchで作成したのですが、それだとリブート後にdnsipでとれないしキャッシュできません。
 ログにも input/output errorが出ていました。これ解消に随分ハマリました。また徹夜になってしまったぁー!
・この記録でうまくいかない時は・・・・・

/etc/dnscache/env/FORWARDONLYの内容を空にしてみてください。そしてリブートするか svc -t /service/dnscache (svscanの再起動)を実行してみてください。

・自己満足な感想としては、このような超々低スペックなPCでもすばやく検索してくれます。
 なんか、とても満足しています。
 折を見てLAN内の名前解決もやってみたいと思います。
      ↓
やってみました。(平成20年06月22日[日])

平成18年04月30日(日) 追記

「フレッツ・スクエア」を見たくて設定変更してみました。(結構苦労したけど、以下に落ち着きました)
@フレッツ・スクエアの設定
各地域の詳しい設定は「フレッツ公式ホームページ」をご覧ください。
私の場合は次のとおりです。ルーター使用でかつ2セッション接続可です。

接続条件2に以下を設定しました。

 接続ユーザ名 : guest@flets  パスワード : guest
 DNSアドレス : 220.210.194.67, 220.210.194.68
 追加するドメイン名 : flets
 宛先ネットワークアドレス : 220.210.194.0/25 (255.255.255.128), 220.210.195.0/26(255.255.255.192), 220.210.195.64(255.255.255.192)

これで、設定反映させるとPPPランプがオレンジになり2セッション接続していることがわかります。
ここで、各PCがルータからDHCPでアドレスをもらっていればブラウザから http://www.flets/ で「フレッツ・スクエア」を見ることができます。
また、ルータからDHCPでアドレスをもらっていないで固定IPにしている場合、ネットワーク接続→TCPIPのDNSサーバーを192.168.1.1(ルータ)にすれば見ることができます。

・・・・・が、せっかくLAN内に djbdns がありますので、それを使うことにしました。
Adjbdnsの設定変更・・・・・もう、既にお分かりでしょうが・・・! (念のため各ファイルは cp でバック取っておきましょうね)
viで/etc/dnscache/env/FORWARDONLY を編集します。

 内容はルータの先頭アドレス(例えば 192.168.1.1ならば 192)を書きます。

・vi で /etc/dnscache/root/servers/@に、ルータのIPアドレス(192.168.1.1)のみを記述します。

svc -t /service/dnscache [Enter] (svscanの再起動)を実行

・インターネットホストのアドレスが検索できるか調べます。

 dnsip a www.plala.or.jp [Enter]  ・・・で下のように返ってきたらOKです。

 218.47.162.65 218.47.162.66

 dnsip a www.flets [Enter]  ・・・で下のように返ってきたらOKです。

 220.210.194.4
BクライアントのDNSサーバー設定
私は、プライマリに 192.168.2.1(djbdns)、セカンダリに 220.220.248.1 (ぷらら) にしています。

平成20年06月22日(日) 追記 ・・・・・ LAN内のDNSサーバーを試してみた。(この時のDNSサーバー機は 192.168.1.7 です)

今までサーバー機やクライアント機にはLAN内の名前解決を各PCの hosts に記述していました。台数も多くなったし少しだけDNSが理解できたので djbdns を使ってLAN内の名前解決をしてみました。これするまで djbdns ではインターネットのDNSキャッシュとしてだけ使っていました。
・tinydns用のユーザ Gtinydns をvipwで作成します。
 Gtinydns:*:80:81::0:0:DNS dns:/noexistent:/sbin/nologin を追記
・カレントディレクトリを /usr/local/bin に移動します。
・以下のような感じで /etc/tinydns サービスディレクトリを作成します。
mail# tinydns-conf Gtinydns Gdnslog /etc/tinydns 127.0.0.1
・レコードを追加します。
mail# cd /etc/tinydns/root
mail# ./add-ns takaq.jp 192.168.1.7
mail# ./add-ns 1.168.192.in-addr.arpa 192.168.1.7
mail# ./add-host webcaster.takaq.jp 192.168.1.1
mail# ./add-host T513V.takaq.jp 192.168.1.2
mail# ./add-host xc13.takaq.jp 192.168.1.3
mail# ./add-host Armada.takaq.jp 192.168.1.4
mail# ./add-host PC9821ne.takaq.jp 192.168.1.5
mail# ./add-host DynaBook.takaq.jp 192.168.1.6
mail# ./add-host mail.takaq.jp 192.168.1.7
mail# ./add-host v200.takaq.jp 192.168.1.8
mail# ./add-host Express.takaq.jp 192.168.1.9

・・・・等々
・dataファイルの修正
---------------------------------------------
mail# cat data
.takaq.jp:192.168.1.7:a:259200
.1.168.192.in-addr.arpa:192.168.1.7:a:259200
=webcaster.takaq.jp:192.168.1.1:86400
=t513v.takaq.jp:192.168.1.2:86400
=xc13.takaq.jp:192.168.1.3:86400
=armada.takaq.jp:192.168.1.4:86400
=pc9821ne.takaq.jp:192.168.1.5:86400
=mail.takaq.jp:192.168.1.7:86400
=v200.takaq.jp:192.168.1.8:86400
=express.takaq.jp:192.168.1.9:86400
---------------------------------------------
上記のうち以下のように vi で修正します。(今回は NS だけでしたが MXがあった場合も同様に!)
.takaq.jp:192.168.1.7:a:259200 -(:aをとる)-> .takaq.jp:192.168.1.7:259200
.1.168.192.in-addr.arpa:192.168.1.7:a:259200 -(:aをとる)-> .1.168.192.in-addr.arpa:192.168.1.7:259200
・設定の反映
(makeをすることでdataファイルから自動的にdata.cdbが作成できます。)

mail# make

するとすぐに
/usr/local/bin/tinydns-data
mail#
・・・と返ってきました。
・シンボリックリンクの作成
mail# ln -s /etc/tinydns /service
・正常に起動しているか確認
mail# svstat /service/tinydns
/service/tinydns: up (pid 642) 96 seconds
mail#
・・・・と返ってきました。
・LAN内問い合わせの設定
takaq.jp1.168.192.in-addr.arpa127.0.0.1に問い合わせるようにします。
mail# cd /etc/dnscache/root/servers
mail# echo 127.0.0.1 > takaq.jp
mail# echo 127.0.0.1 > 1.168.192.in-addr.arpa
・設定反映のため tinydns と dnscacheを再起動します。
mail# svc -h /service/tinydns
mail# svc -h /service/dnscache
これで反映しない時は次を実行します。
mail# svc -t /service/tinydns
mail# svc -t /service/dnscache
・tinydns をインストールしたPCとクライアントPCから問い合わせてみます。
これする前の Server: は 7.1.168.192.in-addr.arpa でしたけど NSとして設定した mail.takaq.jp になっていますね。!

平成20年10月23日(木) 追記

tinydns でレコードを追加・修正・削除した時は次ぎの手順で反映させます。
cd /etc/tinydns/root ・・・でレコード編集
make で data.cdb 作成
svc -t /service/tinydns svc -t /service/dnscache で反映させます。

FreeBSD構築苦労談へ戻る

サイトトップへ