使用Linuxディストリビューションは Debian8.1(jessie)
ただし起動プロセス管理に systemd は使わず、sysvinit使用に戻してある。
参考: Debian8でデフォルトのSystemdを従来のsysvinitに戻す
■概要
djbdnsの動作には daemontools(0.70 以上)、ucspi-tcp のコンパイル&インストールが必要。
まず先にこれらをインストール。
- daemontools
- 起動管理を行うデーモン管理ツール。
dnscache、tinydns等の起動はこのツールによって行われる。また万一停止した場合も自動で再起動する。
- 起動管理を行うデーモン管理ツール。
- ucspi-tcp
- djbdns群で利用されるネットワークモジュール群。
djbdnsは主に次の2つで構成。
- tinydns (DNS サーバ)
- 保持しているレコード(静的データベース)の情報のみを返答する。
→ tinydns自身で管理しているドメイン情報しか返答しない
再帰検索はしない。
→ 自分の管理外のドメインは一切返答しない。
つまりこれ単体では他のインターネットドメイン名の解決はできず、管理下にある(権威を持つ)ドメインしか名前解決しないというシンプルな動作。
- 保持しているレコード(静的データベース)の情報のみを返答する。
- dnscache (DNSキャッシュ)
- クライアントの問い合わせによって再帰検索を行う。
tinydnsやインターネット上の他のDNSサーバに問い合わせて名前解決する。
- クライアントの問い合わせによって再帰検索を行う。
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
■daemontools インストール
インストール先を /var/local/package とする。# 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
Debianでは次が必要。
# echo gcc -O2 -include /usr/include/errno.h > src/conf-cc
コンパイル&インストール。
# ./package/install
■ucspi-tcp インストール
ダウンロード&展開先を /usr/local/src とする。# 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
Debianでは次が必要。
# echo gcc -O2 -include /usr/include/errno.h > conf-cc
コンパイル&インストール。
# make
# make setup check
■djbdns インストール
ダウンロード&展開先を /usr/local/src とする。# 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
Debianでは次が必要。
# echo gcc -O2 -include /usr/include/errno.h > conf-cc
コンパイル&インストール。
# make
# make setup check
svscanが動作しているか確認。
# 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
svscanは /etc/inittab 登録され自動起動されるしくみ。
# cat /etc/inittab | grep svscan
SV:123456:respawn:/command/svscanboot
djbdns実行用アカウント作成
/etc/passwd に追記。
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
/etc/group に追記。
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 設定
□待ち受けアドレス設定
待ち受けIPアドレス127.0.0.1で動作させる。外部からの名前解決はdnscacheを経由してtinydnsに問い合わせとする。
待ち受けアドレス(127.0.0.1)の設定は1回設定すればOK。
# 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
□svscanへの登録
# 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設定
□待ち受けアドレス設定
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 ※念の為、確実に再起動待ち
□名前解決問い合わせ許可IPアドレスの指定
# 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に許可 |
□tinydnsとの連携設定
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と余計なエラーを吐く。 |
□rootファイル修正
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
□svscanへの登録
# 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修正
/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
djbdns は10分毎に、もしくは 10000 回の利用毎に/etc/resolv.confが変更されているかチェックするとのこと。
一般的なほとんどのプログラムは開始時に /etc/resolv.conf を読むだけで再起動されないかぎり読み直ししない事が多い。
dnscache稼動中に修正し&即テストする場合は以下で再起動させる。
# sleep 5 ※再起動待ち
■動作確認
これで期待通り名前解決しているか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の再起動。
# sleep 5 ※再起動待ち
■補足
起動プロセス中はDNS解決ができない点に注意。
理由は/etc/rc3.d 配下の起動スクリプト類が全て実行完了後、login画面表示されるタイミング付近でinittab経由でsvscanがrespaen。
その後svscanからtinydns、dnscacheが起動してくるプロセス。
起動プロセス中に名前解決をさせたい場合はちょっと工夫が必要になる。
(svscanよりも前に手動でtinydns、dnscacheを起動させ、起動待ちした上で名前解決が必要なスクリプトを動かす等)
0 件のコメント:
コメントを投稿