第1部 構築編

本番運用に向けて

BIND9 に挑戦

さて、DNS をどうするかはまだ決まっていないのだが、取り敢えずネームサーバを設定する練習をしてみたいと思う。
ネームサーバを構築する上で事実上標準となっているのは BIND (Berkeley Internet Name Domain) というソフトウェアだ。
またこれもオープンソースで提供されている。

現在 BIND は 4 系、8 系、9 系の 3 種類がインターネット上で利用されている。
ま、今更 BIND4 系もないだろうし、BIND8 系か BIND9 系になるわけだが。
BIND8 系と BIND9 系で大きな違いになっているのが、view セクションの存在だと思う。
view セクションを切ることによって、ローカルの IP アドレス即ち LAN と、WAN の両方を兼ねることが出来るようになるのだ。
BIND8 系では LAN 用、WAN 用と二つのプロセスを走らせなければならなかった。

より正確なことを言うと、ドメイン名解決を問い合わせてきたクライアントの IP アドレスを元にフィルタリング出来る様になったのだ。

と言うわけで、BIND9 に挑戦する。
この日記を書いている時点での BIND9 の正式な最新バージョンは 9.2.1 だ。
Internet Software Consortium (http://www.isc.org/) へ行って bind-9.2.1.tar.gz をもらってこよう。

色々とベンチマークを取っているのを眺めてみると、BIND9 はまだ BIND8 の速度に達していない様だ。
大規模なネームサーバを構築する上での安定性も BIND8 の方が実績がある分だけ良いらしい。
今後は BIND9 に順次移行していくと思われるが、イントラ用のネームサーバなどで最新よりむしろ安定性を望む場合には BIND8 の方がいいのかも知れない。

この bind-9.2.1.tar.gz を例によって /home/******** にコピーして、SSH でログイン、すぐに su コマンドで root になる。
BIND9 は BIND8 と違って SSL が必須となったので、OpenSSL がインストールされているか調べよう。

# rpm -qa | grep openssl

すると rpm でインストールされた OpenSSL が確認された。
ではインストール開始だ。
例によって、/home/******** にコピーした bind-9.2.1.tar.gz を、/usr/local/src/bind9 ディレクトリを作成してコピー、その下でコンパイル作業を行う。

# mkdir /usr/local/src/bind9
# cp /home/********/bind-9.2.1.tar.gz /usr/local/src/bind9/
# cd /usr/local/src/bind9/
# tar xzf bind-9.2.1.tar.gz
# cd bind-9.2.1

以上、余りにも毎度の作業なので解説無し。
んで、configure を行う。
インストール先は /usr/local/named にしておこう。

# ./configure --prefix=/usr/local/named --sysconfdir=/etc --enable-threads=yes --enable-ipv6=no --with-openssl=/usr/include/openssl

この時、--prefix はインストール先、--sysconfdir は named.conf の保存先だ。
マルチ CPU システムで運用するので --enable-threads を付けておくらしい。
んで、

# make
# make install

これで最低限のインストールは出来たはず。
次ぎに BIND8 と BIND9 の大きな違いのひとつである、秘密鍵と公開鍵の認証の準備を行う。
BIND8 の操作コマンドである ndc と違って、BIND9 の rndc は TCP 経由で BIND9 を操作するらしい。
そこで秘密鍵と公開鍵による認証を行うらしいのだ。
取り敢えず、BIND9 関連のページに書いてあったようにやってみる。

# cd /usr/local/named/sbin/
# ./rndc-confgen > rndc.conf

これで rndc.conf が出来上がった。
rndc.conf を覗いてみると、

Use with the following in named.conf, adjusting the allow list as needed

と書かれている行があるので、named.conf を作成する際にコレより下のコメントアウトされている部分を引用することになる様だ。
面倒なので、rndc.conf を named.conf と言う名前で /etc にコピーして、/etc/named.conf を仮作成する。
取り敢えず起動だけしてみたいので、ゾーンの設定とか全然やっていない空の named.conf だ。

んで、取り敢えず起動出来るか試してみる。

# /usr/local/named/sbin/named -c /etc/named.conf

………ん?

うんともすんとも言わんな………?
稼働しているかどうか分かりゃしないので、プロセスを覗いてみる。

# ps -aux | grep named

………おらんな?

色々と試してみるも全然起動しない………
インターネットで色々と漁っていると /var/log/messages にログが書き出されているとのこと。
早速覗いてみると………

named[1168]: couldn't open pid file '/usr/local/named/var/run/named.pid': No such file or directory
named[1168]: exiting (due to early fatal error)

なんか致命的なエラーが出ているらしい(爆)
/usr/local/named/var/run/named.pid というファイルが見付からない、ということなんだな。
見付からないってことはパーミッション以前ってことでしょ?
んで、取り敢えず該当ディレクトリがあることを確認しようとしたら、/usr/local/named/var/ がイキナリない

マジか?
まさかこれケ?

とか呟きながら、取り敢えずディレクトリを作ってみる

# mkdir /usr/local/named/var
# mkdir /usr/local/named/var/run

んで再び起動実験。

………あがるでやんの………

どぉ~やら --prefix オプションを付けて configure すると、ちょっとした細工が必要らしい。
全然確証無いが(爆)
取り敢えず上がることは確認したので、落としてみよう。

# /usr/local/named/sbin/rndc stop

んがしかし………

rndc: connection to remote host closed
This may indicate that the remote server is using an older version of the command protocol, this host is not authorized to connect, or the key is invalid.

拒否られた(爆)
再び /var/log/messages を見てみると………

named[1184]: invalid command from 127.0.0.1#32770: bad auth

“bad auth”?
認証失敗け?

わ、分からんっ!?

rndc.conf も作ったし、named.conf も書き換えたし、それでもなお認証失敗とは何事!?
インターネットで情報を探す、情報を探す、探す、探す、探す………

むむ?

もしかしてもしかすると、rndc.conf の場所が問題!?
というわけで、rndc.conf を怪しい場所である /etc にコピー。

--sysconfdir パラメータを configure 時に指定したからな。

再び、

# /usr/local/named/sbin/rndc stop

として BIND9 を止めてみる………
今度は例の嫌なメッセージが出ない。

# ps -aux | grep named

と叩いてプロセスを覗いてみると、見事に named の消失を確認。
今度は認証が成功したらしい。

んじゃ、今度は自動起動の設定をしてみようか。
………と思ったんだが、Apache や MySQL の時は Red Hat Linux の様な System V 系 UNIX 互換 OS の INIT プロセスに対応するようなスクリプトが最初からあった。
しかし BIND9 にはそもそもそんな物はない
作らないとダメか………??
取り敢えず、起動は、

# /usr/local/named/sbin/named -c /etc/named.conf

でええわな。
終了させる場合にはどうしよう?
rndc で落とすか?
シグナル送って落とすか?
シグナルで落とすなら、

# pkill -u root named

で落とせると思うので試してみる。
うん、落ちるな。
後は BIND9 を実行するためだけのシェルにログインしないユーザを作って、BIND9 自体はそれで稼働させるようにしよう。

# useradd named -g root -M -s /sbin/nologin

んで、ユーザを指定して起動してみる。

# /usr/local/named/sbin/named -u named -c /etc/named.conf

………上がらん………
仕方ないのでもう一度 /var/log/messages を覗いてみると、

# named[1232]: couldn't open pid file '/usr/local/named/var/run/named.pid': Permission denied

今度はパーミッションですか(爆)
取り敢えず、

# chmod -R 774 /usr/local/named/

としてパーミッションを付け替えて、再起動。
今度はちゃんと上がったらしい。
んで、落とす時は、

# pkill -u named named

だな。
これを元に bash のスクリプトを書いてみよう。
サポートすべきパラメータは最低限 startstop なので、これらに対応させる。
restart は stop → start と実行するだけなので、これも対応するか。
スクリプト名は named で、/etc/init.d の下に作成する。
さらに自動実行の設定も行うので、スクリプトが完成次第、

# cd /etc/rc3.d
# ln -s /etc/init.d/named S55named
# cd /etc/rc0.d
# ln -s /etc/init.d/named K45named

んで、再起動してみて正常に呼び出されるか見てみよう。
システムが起動したら、例によって

# ps -aux | grep named

と叩いてプロセスを探してみる。
正常に BIND9 が起動しているみたいだ。

これで一通りの BIND9 のインストールは出来たと思うので、次はゾーンファイルに挑戦してみよう。
ちなみに、今回作ったシェルスクリプトはこんな感じ。
俺並みの初学者が唐突にソースからインストールすることなどそうそう無いと思うが、取り敢えず減るモンじゃないし公開。

拡張の .txt は実際には付いていないので、もしこのヘタレたスクリプトを元に BIND9 を動かしてみようなんてけったいなコト考えている場合には注意。
ついでに動作保証無し(爆)

Red Hat Linux から BIND9 の rpm パッケージが用意されている。
それで入れてしまっても当然構わないし、その方が面倒な設定作業に煩わされずに済むだろう。

Valid HTML 4.01 Strict Valid CSS!