LinuxでBIND9.xを

目次
はじめに
なぜBIND9.xなのか?
導入方法の一例
-(1) ダウンロード
-(2) 下準備
-(3) インストール
-(4) 設定ファイル等の作成
--(a) /etc/named.conf
--(b) ゾーン設定ファイル
--(c) 専用ユーザー作成

1 はじめに

 DNSサーバーとして現在最もLinux界隈で普及しているのは、ISCBINDであろう。とりわけ、BIND8.xはほとんどのディストリビューションで標準添付されている。

 しかしながら、Linux環境におけるBIND9.xに関する情報は、現時点では極めて少ない。そこで、今回当方でBIND9.xの最新版(執筆時点)BIND9.1.2を導入したのを機に、その経過を公開することにした。この文書がBIND9.xの導入を検討している方々の一助となれば幸いである。

***お約束の注意事項***

 この文章は無許可での再配布を可能とする。
 この文章は完全に無保証であり、この文章によって生じたいかなる損害も、執筆者が負うものではない。この文章の扱いは自己責任でお願いする。
 この文章に対する訂正、補足、助言等は大歓迎である。みんなで幸せになろう:-)

2 なぜBIND9.xなのか?

 前述の通り、現在ほとんどのLinuxディストリビューションで添付されているのはBIND8.xである。そして、BIND8.xに関する情報は、非常にたくさんある。それならば、果たして現時点で情報の少ないBIND9.xを使うメリットはあるのか?
 この疑問はもっともである。だが、いくつかの点で、BIND9.xに乗り換えるメリットはあると考える。

(1) viewセクションの存在
BIND9.xの便利な新機能の一つに、viewセクションの存在が挙げられる。viewセクションとは、参照元のIPアドレスによって、異なった名前解決をすることができる機能である。これにより、1つのnamedを起動させるだけで、ローカルIPアドレスを持つLAN上のDNSサーバーと、グローバルIPアドレスを持つインターネット上のDNSサーバーを兼ねることができる(詳細は後述)。

(2) セキュリティー上の問題
開発元のISC自身が、BIND9.1.2への移行を「強く推奨」している。

(3) そのほかにもある新機能
 その他にもBIND9.xにはいくつかの新機能がある。これらに魅力を感じた場合も、BIND9.xへ移行する価値はあるだろう。

3 導入方法の一例
大まかな流れは次のようになる。
-(1) ダウンロード
-(2) 下準備
-(3) インストール
-(4) 設定ファイル等の作成

(1) ダウンロード
当然ながら、まずはダウンロードしなくては始まらない。
BIND9.xは、ISCのページの他、RingServer(例えばパワードコムならここ)などからもダウンロードできる。
ファイル名は、bind-9.1.2.tar.gzである。
なお、Debianな方は、ここらへんの解説を読んだ方が幸せかもしれない。

(2) 下準備
本稿で紹介するインストール方法では、BIND9.xは/usr/local下にインストールされる。このため、一部の設定を変更する必要がある。
まず、/etc/ld.so.confの中身をエディターで確認する。
そして、もしld.so.confの中に
/usr/local/lib
という行が入っていない場合は、root権限で
/usr/local/lib
の1行を書き足す。これによって、システムが/usr/local/libディレクトリ内のライブラリを認識できるようになる。
ちなみに、私の環境(Laser5 Linux6.4)だと、/etc/ld.so.confの中身は次のようになっている。

/usr/X11R6/lib
/usr/lib
usr/i486-linux-libc5/lib
/usr/local/lib

最後の1行が、書き足したものだ。
変更後は設定変更を反映させるため、必ず

# ldconfig

を実行しておこう。

(3) インストール
さて、ダウンロードしたtarball(ファイル)は、お好みならば/usr/local/srcなどの適当なディレクトリにcp(mv)し(/usr/local/srcにmv,cpする場合はroot権限が必要。以下は、すでにroot権限で作業していることを前提にしている)、そのディレクトリに
# cd /usr/local/src
などとして移った後で

# tar zxvf bind-9.1.2.tar.gz

として展開する。すると、そのディレクトリにbind-9.1.2というディレクトリが出来る。
そして、
# cd bind-9.1.2
としてそのディレクトリに入る。
この後、普通ならば
# ./configure
# make
# make install
という手順を使うのが、一般的なtarballで配布されているソフトのインストール方法だが、BIND9.xをLinux2.2にインストールするにはちょっとした注意点がある。
というのも、BIND9.xでこの手順を踏むと、特定のユーザー権限で実行するオプションが使えなくなってしまうのだ。ISCによると、これはLinux2.2のマルチスレッドサポートがまだまだ発展途上のための不具合だそうである。rootを奪取可能なバグが見つかった場合を考えると、是非とも特定ユーザー権限での実行を可能にしておきたい。そのためには、マルチスレッドを無効にする --disable-threadsオプションをつけてconfigureすればよい。 こんな感じだ。

# ./configure --disable-threads
# make
# make install


なお、Linux2.4以上ならば、普通の手順でconfigureしても大丈夫らしい。
ここまでで、インストールは終了だ。意外に簡単ではないだろうか?

追記(2004/12/31):Linux2.2系でもマルチスレッド動作できるバージョンもある。
bind-9.1.3のREADMEによると/contrib/linux/coredump-patchの適用が条件だという。
ただし、bind-9.2.4のREADMEだと、「いくつかのプラットフォームではマルチスレッド動作する」
という記述に置き換わっている。執筆者が手を抜いたのか、さらに複雑な条件が新バージョンで
加わったのかは不明である。

また--disable-threadsオプションをつけた場合とつけなかった場合では一部ファイル(lock,pid)の
作成場所が変わってしまう。具体的には--disable-threadオプションをつけると
/var/lock, /var/run 配下に、マルチスレッド対応にすると、
/(prefix)/var/lock, /(prefix)/var/run/ 配下に作成される。
またマルチスレッドにした場合はフォルダが自動では作成されないため、
別途作成する必要がある。
なお、--prefixオプションを使用しなかった場合は、
/usr/local/var/lock, /usr/local/var/runになる。
現在の藤木総研では、この性質を利用して/usr/local/var,/usr/local/var/lock/,/usr/local/var/runという
ディレクトリを作成し、これらの所有者をuidが0ではないuser, namedにして、書き込み権限を与えることで、
セキュリティーを強化している。

(4) 設定ファイルの作成等
BIND9.xで苦労するのは、むしろインストール後の設定ファイルなどの作成だ。
具体的には
--(a) /etc/named.conf
--(b) ゾーン設定ファイル作成
--(c) 専用ユーザー作成
の3段階を経て、はじめてBIND9.x(プログラム名はnamed)がまともに動作する。

(a) /etc/named.conf
BIND9.x用の基本設定ファイルは、標準では/etc/named.confとなっている。
このため、新規にBIND9.xをインストールする方は、設定ファイルの名前を/etc/named.confにしておくとよい。 この設定ファイルの中身は、当方の環境では、このような感じになっている。

// namedaemon configurations ver1.00 by FTL
// referring to JR0RXU.NET's configuration. Specially thanks!
acl localnet {
	192.168.0.0/24;
	127.0.0.1;
};

options {
	directory "/var/named9";
	allow-transfer { localnet; };
	allow-query { localnet; };
};

view "local" {
	match-clients { localnet; };
	recursion yes;

	zone "." {
		type hint;
		file "named.ca";
	};

	zone "fuzsiki.net" {
		type master;
		file "named.fzk.local";
	};

	zone "0.0.127.in-addr.arpa" {
		type master;
		file "named.0.0.127.in-addr.arpa";
	};

	zone "0.168.192.in-addr.arpa" {
		type master;
		file "named.0.168.192.in-addr.arpa";
	};
};

view "world" {
	match-clients { any; };
	allow-query { any; };
	recursion no;
	zone "fuzsiki.net" {
		type master;
		file "named.fzk";
	};
};
割とネット上のドキュメントが多いBIND8.xのnamed.confと共通する部分は、ごっそり説明を割愛させていただく:-)
BIND9.xに特徴的なのは、先頭のacl セクションと、2つのviewセクションだろう。
察しの良い方ならだいたい見当がつくと思うが、
*aclセクションでlocalnetのアドレスを定義し、
*viewセクションの"local"で、localnet(LAN)用の名前解決を
*viewセクションの"world"で、外部用の名前解決をしている。
これによって、取得したドメインネームを、外部用と内部用に分けて使うことができる。fuzsiki.netのゾーン設定が2つあるのは、このためだ。

追記(2004/12/31)
BIND9のviewセクションでは、その記述順序が重要だ。
namedは、一番最初にクライアント条件にマッチしたviewセクションに従った名前解決を行う。
なので、例えば先の例でview "world" がview "local"
より先に記述してあると、view "local"セクションは無意味だ。


なお、蛇足ながら"world"に逆引きゾーンの設定が無いのは、当方が使用しているwakwakざんまい+固定IPサービスの仕様である。逆引きは、プロヴァイダが担当しており、プロヴァイダに申し込んだ、別のドメイン名に解決される。逆引きもユーザーが担当するサービスでは、当然逆引きゾーンの設定が必要だ。

(b) ゾーン設定ファイルの作成
ゾーン設定ファイルは、ほとんどBIND8.xと同じであり、それについてのオンラインドキュメントも豊富にある。そこで、例として内部用のfuzsiki.netのゾーン設定ファイル
/var/named9/named.fuzsiki.localを、一部変更して掲げたい。

@	IN	86400	SOA	localhost.fuzsiki.net. root.localhost.fuzsiki.net.	(
			2001051400	; Serial
			28800		; Refresh
			14400		; Retry
			3600000		; Expire
			86400	)	; Minimum
		IN	NS	localhost

localhost 	IN	A	192.168.0.1
irixeye		IN	A	192.168.0.2
os-9ppc		IN	A	192.168.0.3
pc9801		IN	A	192.168.0.4
atari		IN	A	192.168.0.5
msdos		IN	A	192.168.0.6
www		IN	CNAME	localhost
ns0		IN	CNAME	localhost
laser		IN	CNAME	localhost
なんだか凄まじいクライアントがつながっているようにも思えるが、クライアントのドメイン名とそのマシンやOSはほとんど一致していないのであしからず。
ここで唯一注目していただきたいのが、先頭の一行である。@ INに続く数字は、BIND8.xでは必須ではなかったTTL値だ。BIND9.xではこれが無いと動かないので注意して欲しい。
なお、BIND8.xで、BIND9.xでも使えるゾーン設定ファイルを作るには、先頭に$TTL=86400などとしてTTL値を明示した1行を加えれば良い。(詳しくは後日)

(c) 専用ユーザー作成
ここまでくれば、もうひと息だ。あとは、BIND9.x専用のユーザーを作成すれば良い。
ところで、BIND8.xを使用していた方のマシンには、すでにnamed専用のユーザーnamedがシステムに登録されている場合が多いであろう。これを使えればしめたもの。
ところが、私の環境だと、なぜかBIND9.xのnamedをnamedユーザー権限で使うことができなかった。
$ vi /var/log/messagesとしてログを見たところ、
couldn't open pid file '/var/run/named.pid':permission denied
とのこと。どうやら、BIND9.xは、BIND8.xのnamedユーザー権限では実行できないようだ。
そこで次善の策として、userID,groupがrootと同じで、ただshellを/bin/falseにしたBIND9.xのnamed専用ユーザーhogyを作成することにした。

# adduser -u 0 -o -g root -d /var/named9 -s /bin/false hogy

最後に、rootで、ユーザーhogyの権限でnamedを起動する次のようなコマンドを入力する。

# /usr/local/sbin/named -u hogy

これで、めでたくBIND9.xが希望通りの動作をするはずだ。

4 LASER5Linux6.4での、BIND8.2.3からの移行

追記:004/12/31
残念ながら時期ハズレになってしまったので、bind8から移行するときに要点だけ説明する。
一般的な設定では必ず失敗するのがZONEファイルだ。
BIND9では、zoneのデフォルトTTLの記載が必須になっている。書式を先に記述したBIND9方式に修正しても良いが、通常はzoneファイルの先頭に一行

$TTL 86400

という記述を加えた方が、楽だろう。
なお、BIND8の時からTTLを記述していた場合は、zoneファイルの修正の必要は、ない。

もう一箇所詰まりそうな(むしろ私が詰まった)のがマルチスレッドオプションを使って
コンパイルした場合のpid,lockファイルの作成場所だが、これは先に述べた。

back to home