djbdns (tinydns, dnscache) を使う

(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非対応.

目次

  1. 下準備
  2. インストール
  3. dnscacheの設定
    1. 起動する
    2. LAN内の機械から使えるようにする
  4. tinydns の設定 (IPv6)
    1. 起動する
    2. LAN内のホスト名解決をさせる
  5. /etc/hostsファイル
  6. 外部リンク

@ 下準備

事前に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

@ dnscacheの設定

まず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

LAN内の機械から使えるようにする

私の家では、各機に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サーバのアドレスを変更して、ホスト名が引けるかどうか確認します。

@ tinydnsの設定(IPv6)

(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ホストを指定する。
66ホスト名:IPアドレスIPv6ホストのIPアドレスを指定する。IPv6アドレスは、0を省略せずに書き、:は省く。
33ホスト名: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が更新されます。

Note.

リンクローカルアドレスなど、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

LAN内のホスト名解決をさせる

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を再起動します。

@ /etc/hostsファイル

(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

Note.

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で定められています。

  • 3596 DNS Extensions to Support IP Version 6. S. Thomson, C. Huitema, V. Ksinant, M. Souissi. October 2003. (Format: TXT=14093 bytes) (Obsoletes RFC3152, RFC1886) (Status: DRAFT STANDARD)

正引き(ホスト名→IPv6アドレス)はAAAAレコードを、逆引きはIP6.ARPA(またはIP6.INT)ドメインを使います。