(2003.11.03新規作成。2004.12.19 加筆。2004.12.31 更新。)
djbdns (tinydns, dnscache) は、小さく、信頼性の高いDNS権威サーバ/キャッシュサーバです。bindのような複雑怪奇で脆弱なものは使うべきではありません。私は、LAN内の各機械のためのDNSキャッシュ、それぞれの機械の名前解決として使っています。
(2014.12.12)
ずいぶん昔から djbdnsは開発が止まっています。どのようなセキュリティ上の問題があるかないかも分からないので, もはや使うべきではありません。
権威サーバはNSD, キャッシュサーバはUnboundをおすすめします。DNSキャッシュサーバを選ぶ
(2019.9) まさか, djbdns が再始動しました。N-DJBDNS. Fedora Linux にもパッケージが用意されています。
思想は健在で, IPv6非対応, DNSSEC非対応.
事前にdaemontoolsをインストールします。daemontoolsはパッチを当てないと最近のLinuxではコンパイルできません。ファイルの入手、インストール方法はdaemontools を使う を参照してください。
まずdjbdnsのファイルを入手します; N-DJBDNS.
そのままではコンパイルできないのと、IPv6対応にするために、パッチを入手し、それを当てます;Fefe's patches for IPv6 with djbdns IPv6パッチ, DNSSEC 対応があります。
djbdnsは,インストール先をconf-homeファイルで設定します。<このファイルで設定したディレクトリ> + /bin にインストールされので、/usr/local、あるいは /usr/djb などとします。その後、コンパイル、インストールします。
$ make $ su # make setup
まずDNSキャッシュサーバであるdnscacheのほうから設定していきます。
グループdjbdns、ユーザーdnscache、dnslogを作成します。いずれもホームディレクトリは必要ないので削除します。
# groupadd djbdns # useradd dnscache -g djbdns -s /sbin/nologin # useradd dnslog -g djbdns -s /sbin/nologin # rm -rf /home/dnscache /home/dnslog
dnscache-confコマンドを実行します。このコマンドで、/var/djbdns/dnscacheというディレクトリが作成され、設定ファイルがそれ以下に作られます。192.168.0.9は、キャッシュサーバを動かす機械のIPアドレスです。
# /usr/djb/bin/dnscache-conf dnscache dnslog /var/djbdns/dnscache 192.168.0.9
djbdnsの設定の仕方を他のソフトウェアの設定ファイルと対比すると、ディレクトリ名がセクションに、ファイルが項目名に、その内容が値になります。
初期設定では、ルートサーバーのIPアドレスがひとつ誤っている(古い?)ので、root/servers/@ファイルを修正します。198.41.0.10 を192.58.128.30 に修正します。
念のため、テストしておきます。この時点ではまだdnscacheを起動していないので、DNSサーバが何も使えないときは、いったんパスして後で確認します。
# /usr/djb/bin/dnsname `cat \@ ` a.root-servers.net b.root-servers.net c.root-servers.net d.root-servers.net e.root-servers.net f.root-servers.net g.root-servers.net h.root-servers.net i.root-servers.net j.root-servers.net k.root-servers.net l.root-servers.net m.root-servers.net
daemontoolsで自動的に起動するようにします。runファイルはとりあえず触らなくても大丈夫だと思います。
# ln -s /var/djbdns/dnscache /service
少し待って、動いていることを確認します。
# svstat /service/dnscache /service/dnscache: up (pid 989) 437 seconds
/etc/nsswitch.conf, /etc/resolv.confファイルを必要に応じて書き換えます。/etc/nsswitch.confは、普通はそのままでも大丈夫なはずです。/etc/resolv.confファイルを、192.168.0.9(キャッシュサーバのIPアドレス)でホスト名を引くようにします。
nameserver 192.168.0.9
/etc/host.confも書き換えます。hosts, bindは、それぞれ/etc/hostsファイルで引く、DNSで引くという意味です。
order hosts,bind
私の家では、各機に192.168.0.xというIPアドレスを振っています。root/ipディレクトリにあるファイルがdnscacheにアクセスできる機械を表します。ファイルの内容はなくても構いません。次のようにします。
# touch /var/djbdns/dnscache/root/ip/192.168.0 # ls /var/djbdns/dnscache/root/ip 127.0.0.1 192.168.0
この後、ほかの機械で、DNSサーバのアドレスを変更して、ホスト名が引けるかどうか確認します。
(2004.12.31更新)
IPv4だけのときは各機械の/etc/hostsファイルにIPアドレスとホスト名の対応表を書いても大したことはありません。しかし、IPv6だとIPアドレスの桁数が多いので、DNSサーバを使ったほうがいいです。
設定する手順ですが、IPv6パッチを当てたtinydnsでLAN内の機械のホスト名を解決し、その後dnscacheの設定を変更して、LAN内のもののときにtinydnsを見に行くようにします。
私はIPv6のグローバルアドレスを持っていないので、リンクローカルアドレスを使います。
まず、ユーザーtinydnsを作成します。
# useradd tinydns -g djbdns -s /sbin/nologin # rm -rf /home/tinydns
tinydns-confコマンドで環境を作成します。listenするIPアドレスは、dnscacheと同じであってはなりません。そこで、tinydnsのほうは127.0.0.1にして、他の機械からはdnscacheを経由してアクセスします。
# tinydns-conf tinydns dnslog /var/djbdns/tinydns 127.0.0.1
tinydnsが扱うホストとIPアドレスの設定は、root/data ファイルを修正して行います。
1行1エントリで記述します。行頭の文字で、意味が決まります。行頭文字、書き方、意味は次のとおりです。
行頭 | 書き方 | 意味 |
---|---|---|
. | .ドメイン:ネームサーバのIPアドレス:ネームサーバ名 | ドメインのネームサーバを指定する。 |
= | =ホスト名:IPアドレス | IPv4ホストのIPアドレスを指定する。 |
+ | +ホスト名:IPアドレス | 別名であるIPv4ホストを指定する。 |
6 | 6ホスト名:IPアドレス | IPv6ホストのIPアドレスを指定する。IPv6アドレスは、0を省略せずに書き、:は省く。 |
3 | 3ホスト名:IPアドレス | 別名であるIPv6ホストを指定する。 |
例えば、次のようになります。グローバルアドレスは割り振られていないので、リンクローカルアドレス(link-local address; fe80::/64)を使います。xxxx....、yyyy....は、インターフェイスIDで、16進数です。
.fruits:192.168.0.9:a .0.168.192.in-addr.arpa::a .0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa::a .0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.int::a =orange.fruits:192.168.0.9 +d.orange.fruits:192.168.0.9 6orange.fruits:fe80000000000000xxxxxxxxxxxxxxxx 3d.orange.fruits:fe80000000000000xxxxxxxxxxxxxxxx =grape.fruits:192.168.0.3 6grape.fruits:fe80000000000000yyyyyyyyyyyyyyyy
dataファイルを修正したら、makeします。これでdata.cdbが更新されます。
リンクローカルアドレスなど、IPv6アドレスの種類については、RFC 3513 Internet Protocol Version 6 (IPv6) Addressing Architecture.を参照してください。
IPv6アドレスを調べるには、Linux機では、/sbin/ifconfigコマンドを使います。次のような行が含まれているはずです。
inet6 addr: fe80::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
Windows機では、次のように打てば、IPアドレスが表示されるでしょう。
>netsh interface ipv6 show address
再び、daemontoolsで自動的に起動するようにします。
# ln -s /var/djbdns/tinydns /service
しばらくして、動いていることを確認します。
# svstat /service/tinydns /service/tinydns/: up (pid 2067) 84619 seconds
dnscacheの設定を変更します。dnscacheのroot/serversディレクトリに、tinydnsで引くドメイン名、IPアドレスをファイル名とするファイルを作ります。このファイルの内容は、127.0.0.1(tinydnsがlistenしているIPアドレス)とします。
# ls /var/djbdns/dnscache/root/servers 0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa 0.168.192.in-addr.arpa fruits 0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.int @
ファイルを作ったら、dnscacheを再起動します。
(2004.12.31 この節追加。)
localhostなどの解決は、/etc/hostsファイルに書いておきます。他の解説ページでは、ip6-localhostなどとしているものもありますが、djbdnsの流儀では、vを入れます。
127.0.0.1 localhost # for IPv6 ::1 ipv6-localhost ipv6-loopback fe00::0 ipv6-localnet ff00::0 ipv6-mcastprefix ff02::1 ipv6-allnodes ff02::2 ipv6-allrouters
All Nodes Address, All Routers AddressのIPv6アドレスも、RFC 3513に書かれています。また、RFC 2375 IPv6 Multicast Address Assignmentsにまとめがあります。FF02の2は、link-localの意味です。
サイトによっては、ff02::3 ipv6-allhosts という行があるものもあるが、ff02::3は、RFC 2375ではunassignedになっている。allnodesが別にあるし、誤り?
IPv6 DNSの仕様は、IETF RFCで定められています。
正引き(ホスト名→IPv6アドレス)はAAAAレコードを、逆引きはIP6.ARPA(またはIP6.INT)ドメインを使います。