自動起動スクリプトを実行するだけではダメだった為、以下に手順をメモ。
いくつかモジュールが必要なので事前にインストールする。
(build-essential はカーネル構築する際などでお馴染み)
# m-a prepare
(マウント方法は色々あるので詳細割愛)
自動起動スクリプトを実行する。
# sh VboxLinuxAdditions.run
Brain external note anywhere
使用Linuxディストリビューションは Debian8.1(jessie)
ただし起動プロセス管理に systemd は使わず、sysvinit使用に戻してある。
参考: Debian8でデフォルトのSystemdを従来のsysvinitに戻す
djbdnsの動作には daemontools(0.70 以上)、ucspi-tcp のコンパイル&インストールが必要。
まず先にこれらをインストール。
djbdnsは主に次の2つで構成。
bind系はDNSサーバ/キャッシュ機能をあわせ持つのに対して、djbdns は tinydns と dnscache に機能が分かれている。
これによりシンプルで高速動作、不具合が皆無という実績を持つ。
tinydns と dnscache は共にポート53を使う。同IPアドレスで待ち受けはできない。
今回待ち受けアドレスは次のように設定する。
サービス | IPアドレス | 備考 |
tinydns | 127.0.0.1 | |
dnscache | 192.168.2.1 | 搭載NICのアドレス |
tinydns と dnscacheは同じマシン上で動作させる。
参考:djbdns公式サイト: http://cr.yp.to/djbdns.html
# apt-get install build-essential
# mkdir -p /var/local/package
# chmod 1755 /var/local/package
# cd /var/local/package
ダウンロード&展開。※昔とURLが変わってる。
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# gunzip daemontools-0.76.tar
# tar -xpf daemontools-0.76.tar
# rm -f daemontools-0.76.tar
# cd admin/daemontools-0.76
# echo gcc -O2 -include /usr/include/errno.h > src/conf-cc
# ./package/install
# cd /usr/local/src
# wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
# gunzip ucspi-tcp-0.88.tar
# tar -xf ucspi-tcp-0.88.tar
# rm -f ucspi-tcp-0.88.tar
# cd ucspi-tcp-0.88
# echo gcc -O2 -include /usr/include/errno.h > conf-cc
# make
# make setup check
# cd /usr/local/src
# wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz
# gunzip djbdns-1.05.tar.gz
# tar -xf djbdns-1.05.tar
# rm -f djbdns-1.05.tar
# cd djbdns-1.05
# echo gcc -O2 -include /usr/include/errno.h > conf-cc
# make
# make setup check
# ps auxw |grep svscan
root 9127 0.0 0.2 2260 672 ? Ss 20:17 0:00 /bin/sh /command/svscanboot
root 9129 0.0 0.3 2180 940 ? S 20:17 0:00 svscan /service
root 12256 0.0 0.7 5012 2172 pts/1 S+ 21:22 0:00 grep svscan
# cat /etc/inittab | grep svscan
SV:123456:respawn:/command/svscanboot
dnslog:*:530:530::/var/local/djbdns:/bin/false
dnscache:*:531:530::/var/local/djbdns/dnscache:/bin/false
tinydns:*:532:530::/var/local/djbdns/tinydns:/bin/false
walldns:*:533:530::/var/local/djbdns/walldns:/bin/false
djbdns:*:530:
# mkdir /var/local/djbdns
# cd /var/local
# chgrp djbdns djbdns
# chmod 2775 djbdns
補足:
inittab での起動/再起動をさせたくない場合は /etc/inittab の行末に追加された行を以下のようにコメントにする
# SV:123456:respawn:/command/svscanboot
手動起動させる場合
起動スクリプトが用意されている。
# csh -cf '/command/svscanboot &'
# tinydns-conf tinydns dnslog /var/local/djbdns/tinydns 127.0.0.1
もしも以下のようなエラーが出る場合は
tinydns-conf: fatal: unable to create /etc/tinydns: file already exists
以下でディレクトリを削除してからやり直す。
# rm -r /var/local/djbdns/tinydns
# tinydns-conf tinydns dnslog /var/local/djbdns/tinydns 127.0.0.1
待ち受けアドレスの設定確認
# cat /var/local/djbdns/tinydns/env/IP
127.0.0.1
既に設定済みの待ち受けアドレスを変更する場合。
例:tinydnsの待ち受けアドレスを192.168.1.1に変更する場合。
# cd /var/local/djbdns/tinydns/env
# echo "192.168.0.1" > IP
# svc -t /service/tinydns ※サービス停止
svscan(inittab経由)により5秒以内にtinydnsが自動起動する。
ゾーンファイル /var/local/djbdns/tinydns/root/data をエディタで修正後、makeを行いdata.cdbを生成することで反映する。
tinydnsの再起動は必要無し。
設定例の状況
tinydnsが動作しているマシンのFQDN | ns01.mydomain.net |
tinydnsが動作しているマシンのIPアドレス | 192.168.2.1 |
tinydnsが管理するドメイン/ネットワーク | mydomain.net 192.168.2.0/24 |
tinydnsが名前解決を管理するマシンのFQDN | pc01.mydomain.net pc02.mydomain.net pc03.mydomain.net |
tinydnsが名前解決を管理するマシンのIPアドレス | 192.168.2.201 192.168.2.202 192.168.2.203 |
ゾーンファイル設定例
修正先 /var/local/djbdns/tinydns/root/data | 設定内容 |
.2.168.192.in-addr.arpa:192.168.2.1:a:259200 | tinydnsサーバ192.168.2.1がネットワーク192.168.2.0/24の権威(名前解決する責任)を持つことを指定。 |
.mydomain.net:192.168.2.1:ns01.mydomain.net | ns01.mydomain.net が ドメイン mydomain.net の権威(名前解決する責任)を持つことを指定。 |
.1.2.168.192.in-addr.arpa:192.168.2.1:a:259200 .100.2.168.192.in-addr.arpa:192.168.2.1:a:259200 .101.2.168.192.in-addr.arpa:192.168.2.1:a:259200 .102.2.168.192.in-addr.arpa:192.168.2.1:a:259200 |
逆引き問い合わせ時にネームサーバ192.168.2.1が応答すべきin-addr.arpaアドレスを記述。 ※192.168.2.100~102の3台。 |
=ns01.mydomain.net:192.168.2.1 =pc01.mydomain.net:192.168.2.201 =pc02.mydomain.net:192.168.2.202 =pc03.mydomain.net:192.168.2.203 |
正引き/逆引きき問い合わせ時用のレコードを記述。 ※pc01~pc03の3台 |
makeしてdata.cdbを生成。
# cd /var/local/djbdns/tinydns/root
# make
# cd /service
# ln -s /var/local/djbdns/tinydns tinydns
# sleep 5 ※tinydns自動起動まで約5秒かかるので念の為待っておく
起動の確認。
# svstat /service/tinydns
/var/local/tinydns: up (pid 1790) 24 seconds
上記を数回実行してみて pidの変化を見る。
毎回変化しているようだと正常に起動できていない(inittab経由でsvscanから起動失敗/再起動を繰り返している)。
原因としては待ち受けIPアドレス127.0.0.1のポート53がBINDなど他のアプリケーションで既に使用されていないか確認。
他、/var/local/djbdnsのディレクトリパーミッションの確認など。
dnscacheを待ち受けIPアドレス192.168.2.1で動作させる。これは1回設定すればOK。
# dnscache-conf dnscache dnslog /var/local/djbdns/dnscache 192.168.2.1
もしも以下のようなエラーが出る場合は
dnscache-conf: fatal: unable to create /var/local/djbdns/dnscache: file already exists
以下でディレクトリを削除してからやり直す。
# rm -r /var/local/djbdns/dnscache
# dnscache-conf dnscache dnslog /var/local/djbdns/dnscache 192.168.2.1
待ち受けアドレスの確認方法。
# cat /var/local/djbdns/dnscache/env/IP
192.168.2.1
既に設定済みの待ち受けアドレスを変更する場合。
例:tinydnsの待ち受けアドレスを192.168.1.1に変更する場合。
# cd /var/local/djbdns/dnscache/env
# echo "192.168.1.1" > IP
# svc -t /service/dnscache ※設定の反映
# sleep 5 ※念の為、確実に再起動待ち
# cd /var/local/djbdns/dnscache/root/ip
# touch 192.168.2
これで192.168.2.0/24 に許可される。
※/var/local/djbdns/dnscache/root/ip ディレクトリに作成したファイル名(中身は空)で許可される
※接続許可IPアドレスの修正ではdnscacheの再起動は必要ない。
ちなみに設定法則は以下の通り。ファイルは複数配置可能。
touch 192.168.1.1 | 192.168.1.1に許可 |
touch 192.168.1 | 192.168.1.0/24に許可 |
touch 192.168 | 192.168.0.0/16に許可 |
touch 192 | 192.0.0.0/8に許可 |
LAN内のマシン名解決をtinydnsに依頼する設定例。
ファイル名=管理下のドメイン名で、中身のアドレスが名前解決を依頼するDNSサーバアドレス。
# cd /var/local/djbdns/dnscache/root/servers
# echo "127.0.0.1" >mydomain.net
# echo "127.0.0.1" >2.168.192.in-addr.arpa
# echo "127.0.0.1" >1.0.0.127.in-addr.arpa
実行したコマンド行 | 内容の意味 |
echo "127.0.0.1" >mydomain.net | ドメインmydomain.netの名前解決を127.0.0.1:53に依頼する。 |
echo "127.0.0.1" >2.168.192.in-addr.arpa | 192.168.2.0/24の逆引きを127.0.0.1:53に依頼する。 これがないとWinクライアン等からのnslookupで192.168.2.0/24の逆引きができない。 |
echo "127.0.0.1" >1.0.0.127.in-addr.arpa | 自分自身の逆引きを127.0.0.1:53に依頼する。 これがないとWinクライアントからのnslookupでDNSがunknownと余計なエラーを吐く。 |
2005年の情報ではルートサーバーのひとつがIPアドレス変更され、初期設定ではルートサーバーのIPアドレスリストに反映されていなかった。2015年時点でもリスト内容は反映されていないようなので手動で修正する。
ファイル名 @ がルートサーバのリスト。
root/servers/@ ファイルを修正する。198.41.0.10 を192.58.128.30 に修正。
/var/local/djbdns/dnscache/root/servers/@
198.41.0.4
128.9.0.107
192.33.4.12
128.8.10.90
192.203.230.10
192.5.5.241
192.112.36.4
128.63.2.53
192.36.148.17
192.58.128.30
193.0.14.129
198.32.64.12
202.12.27.33
# cd /service
# ln -s /var/local/djbdns/dnscache dnscache
# sleep 5 ※自動起動まで約5秒かかる
起動の確認をしておく。
# svstat /service/dnscache
/var/local/dnscache: up (pid 1766) 11 seconds
上記を数回実行してみて pidの変化を確認する。毎回変化しているようだと正常に起動できていない。
原因としては待ち受けIPアドレスのポート53がbindなど他のアプリケーションで既に使用されている可能性など。
/etc/resolv.conf のnameserver行を以下に修正
192.168.2.1は搭載NICのアドレス。
192.168.2.2は上位のDNSアドレス(又はゲートウェイルータのDNSキャッシュアドレス)。
/etc/resolv.conf
search mydomain.net
nameserver 192.168.2.1
nameserver 192.168.2.2
これで期待通り名前解決しているかnslookup等で確認する。
ログの保存先はそれぞれ、
/var/local/djbdns/dnscache/log/main/current
/var/local/djbdns/tinydns/log/main/current
となっている。
このままだと日付がみにくいので以下のようにすると多少見やすい。
dnscacheのログは以下のように閲覧
# cat /var/local/djbdns/dnscache/log/main/current | /usr/local/bin/tai64nlocal | less
tinydnsのログは以下のように閲覧
# cat /var/local/djbdns/tinydns/log/main/current | /usr/local/bin/tai64nlocal | less
bind等他のアプリケーションがtinydns、dnscache稼動アドレスのポート53で動いているとうまくいかないので再確認。
# svstat /service/tinydns
/var/local/tinydns: up (pid 1790) 118 seconds
# svstat /service/dnscache
/var/local/dnscache: up (pid 1766) 115 seconds
それぞれ5秒ごとに実行してみて pid が変化しているか確認。変化している場合、起動に失敗しdaemontoolsによる再起動を繰り返してる。pidが変動する方の設定を再度確認する。
/etc/resolv.conf 修正から10分ほど時間が経過してないとうまくいかない場合がある。その際はdnscacheを再起動してみる。
dnscacheの再起動。
起動プロセス中はDNS解決ができない点に注意。
理由は/etc/rc3.d 配下の起動スクリプト類が全て実行完了後、login画面表示されるタイミング付近でinittab経由でsvscanがrespaen。
その後svscanからtinydns、dnscacheが起動してくるプロセス。
起動プロセス中に名前解決をさせたい場合はちょっと工夫が必要になる。
(svscanよりも前に手動でtinydns、dnscacheを起動させ、起動待ちした上で名前解決が必要なスクリプトを動かす等)