2015/07/23

djbdnsインストール&設定

使用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稼動中に修正し&即テストする場合は以下で再起動させる。
# svc -t /service/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の再起動。

# svc -t /service/dnscache
# sleep 5 ※再起動待ち

■補足

起動プロセス中はDNS解決ができない点に注意。

理由は/etc/rc3.d 配下の起動スクリプト類が全て実行完了後、login画面表示されるタイミング付近でinittab経由でsvscanがrespaen。
その後svscanからtinydns、dnscacheが起動してくるプロセス。

起動プロセス中に名前解決をさせたい場合はちょっと工夫が必要になる。
(svscanよりも前に手動でtinydns、dnscacheを起動させ、起動待ちした上で名前解決が必要なスクリプトを動かす等)

0 件のコメント:

コメントを投稿