プロバイダーのDNSサーバーが死んでいる時に自分でDNSサーバーを動かしていれば問題無く
アクセスすることができます。またプロバイダーのDNSサーバーが混んでいる時なども、自分専用なので
変換に時間を取られることがないのでアクセスもスムーズになります。
また、イントラ側の名前解決には自前でDNSサーバーがあれば確実に解決できるようになります。
FreeBSD6.1の場合、デフォルトでインストールされています
最新バージョンにする場合は
でインストールできます
# cd /usr/ports/dns/bind9
# make install clean
ここで、出てくるオプション、もしくはmake configでオプションが出ますが
「REPLACE_BASE」にチェックを入れるとデフォルトでインストールされているところに上書きされます(/usr/sbin/named)
チェックを入れない場合は
/usr/local/sbin/named
になりますのでご注意ください。
一応、以下は「REPLACE_BASE」で話を進めます。
もし置き換えない方は/usr/sbin/namedを/usr/local/sbinに変えて読んでください。
BIND9 では、セキュリティを保つために、認証キーを設定しないと、reload が出来ません。
キー作成ですが一番簡単なのはwebminからサーバーの中に有るbindを開き
setup RNDC
を開けばボタン一発で作成できます
一応、昔やった手動は下記のとおりです
とやると、カレントディレクトリに
/usr/sbin/dnssec-keygen -r /dev/urandom -a hmac-md5 -b 512 -n user bind
Krndc.+157+xxxxx.key
Krndc.+157+xxxxx.private
という2つのファイルが作成されるはずです。xxxxx は、任意の5桁の数字です。
Krndc.+157+xxxxx.private を開くと例えば、
の様になっていると思いますが、使うのは Key: に続く
Private-key-format: v1.2 Algorithm: 157 (HMAC_MD5) Key: 8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
の部分です。
同様に、Krndc.+157+xxxxx.key を開くと例えば、
の様になっていると思いますが、使うのは 157 に続く
rndc. IN KEY 0 2 157 8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
の部分です。
この認証キーは、後で使うのですが、使ったらこの認証キーファイルは、他人に見られないように削除しましょう。
忘れてしまうのが心配であれば、一度プリントアウトするなどして保管してから削除してしまいましょう。
/etc/rndc.conf を編集する
options { default-server localhost; default-key "key"; }; server localhost { key "key"; }; key "key" { algorithm hmac-md5; secret "..."; };
この、secret に続く、"Krndc.+157+xxxxx.private で得られた、キーの文字列に置き換えます。
編集が終わったらで、パーミッションを変更しておきましょう。
# chown root:wheel rndc.conf
# chmod 400 rndc.conf
/etc/namedb/named.conf を編集する
acl "allowed-hosts" { 127.0.0.1; 192.168.1.0/24; }; key "key" { algorithm hmac-md5; secret "..."; }; controls { inet 127.0.0.1 allow { 127.0.0.1; } keys { "key"; }; }; options { directory "/etc/namedb"; auth-nxdomain yes; allow-transfer {allowed-hosts;}; allow-query {allowed-hosts;}; pid-file "/var/run/named/named.pid"; }; zone "." { type hint; file "named.root"; }; zone "localhost" { type master; file "localhost.zone"; }; zone "0.0.127.in-addr.arpa"{ type master; file "0.0.127.rev"; }; zone "hogehoge.org"{ type master; file "hogehoge.org.zone"; }; zone "1.168.192.in-addr.arpa"{ type master; file "1.168.192.rev"; }; #アクセス制限 #freeBSD自身を許可 #LAN側のアドレスを許可 #...にはKrndc.+157+xxxxx.key のキーの部分の文字列に書き換えます #ディレクトリー指定 #allowed-hostsしかアクセスできないようにする #pidの場所指定 #大元のゾーンファイル指定、これは誰でもこのままです #localhostゾーンファイル指定、このままでOK #localhost逆引きゾーンファイル指定、このまま #LAN側正引き設定(各自設定) #これがマスターである宣言 #ファイル名指定 #LAN側逆引き設定(各自設定) #これもマスター #ファイル名指定
書込みが終わったら、パーミッションを変更します。
他から見られないようにするためです。
BIND9 をインストールした時点で、/etc/group と /etc/master.passwd に
bind というグループとユーザが作成されているはずです。
で、パーミッションを変更します。
# chown bind:bind named.conf
# chmod 400 named.conf
named.confで設定したそれぞれのゾーンファイルを同じディレクトリー(/etc/namedb)に作ります。
全てのドメインを管理する基本となる DNS サーバ(ルートネームサーバ)が記述されたヒントファイルが必要となります。
以前、このファイルは InterNIC や JPNIC の FTP サイトからダウンロードしていましたが、現在では dig と言う
コマンドで生成することが可能です。
# /usr/bin/dig @A.ROOT-SERVERS.NET. > /etc/namedb/named.root
dig コマンドを実行しますが、オプションとして "@ルートサーバ名" を指定すると一覧が表示されます。
これをファイルとして保存すれば named.root が生成されます。
ヒントファイルはルートサーバが増えたり減ったりする度に更新されているので定期的に上記のコマンドで
アップデートする事をお勧めします。
それでは、残りのローカルに関するファイルを作ります。
/etc/namedb/localhost.zone ローカルホストの正引きを編集する
$TTL 86400 @ IN SOA server.hogehoge.org. root.hogehoge.org. ( 20020711; serial number 86400 ; Refresh 3600 ; Retry 604800 ; Expire 86400 ) ; Minimum IN NS localhost. localhost. IN A 127.0.0.1
/etc/namedb/hogehoge.org.zone イントラの正引きを編集する
$TTL 86400 @ IN SOA server.hogehoge.org. root.hogehoge.org. ( 20020711 ; serial number 86400 ; refrash rate 3600 ; retry 604800 ; expire 86400 ) IN NS server.hogehoge.org. server IN A 192.168.1.1 windows1 IN A 192.168.1.2 windows2 IN A 192.168.1.3 windows3 IN A 192.168.1.4 windows4 IN A 192.168.1.5
/etc/namedb/0.0.127.rev ローカルホストの逆引きを編集する
$TTL 86400 @ IN SOA server.hogehoge.org. root.hogehoge.org. ( 20020711 ; serial number 86400 ; refrash rate 3600 ; retry 604800 ; expire 86400 ) IN NS localhost. 1 IN PTR localhost.
/etc/namedb/1.168.192.rev イントラの逆引きを編集する
$TTL 86400 @ IN SOA server.hogehoge.prg. root.hogehoge.org. ( 20020711 ; serial number 86400 ; refrash rate 3600 ; retry 604800 ; expire 86400 ) IN NS server.hogehoge.org. 1 IN PTR server.hogehoge.org. 2 IN PTR windows1.hogehoge.org. 3 IN PTR windows2.hogehoge.org. 4 IN PTR windows3.hogehoge.org. 5 IN PTR windows4.hogehoge.org.
項目の説明
serial number=最終更新日
あとはちょっと正確には分かりません。たぶん有効期限だとかだとは思いますが...(・_・;)
基本的に、BIND9 では、/etc/namedb の設定は、bind ユーザのみが読み込めればよいので、
/etc/namedb 以下は、namedb ディレクトリも含めて、
で各ファイルを設定して下さい。
# chown bind:bind ファイル名
# chmod 400 ファイル名
(ディレクトリーのパーミッションは770)
通常、daemon の pid ファイルは、/var/run にあるのですが、
BINDを走らせるユーザーがrootではなくbindですので、/var/run/namedの下に
して、このディレクトリーにbindユーザーの書き込み権限を与えましょう。
既になっているかもしれませんので、確認してbindユーザーになっていなければ変更しましょう。
としてください。
# cd /var/run
# mkdir named
# chown bind:wheel named
# chmod 700 named
リブートした時に自動的に走るよう、rc.confに設定します。
/etc/rc.conf を編集するこれで自動的にスタートします。
named_enable="YES"
named_flags="-u bind -c /etc/namedb/named.conf"
named_program="/usr/sbin/named"
コマンドラインからで起動できます。
# /usr/sbin/named -u bind -c /etc/namedb/named.conf
プロセス確認して走っているようでしたらnslookupででも調べて見てください。
ゾーンファイルや、named.confを書き換えた場合、反映させる場合はで反映できます。
# rndc reload
BIND9 をインストールし、/etc/rc.conf で起動するようにした際、PPPoEで接続終了する前に起動するので、
BINDが一時間毎にと文句をいってきます。BINDを再起動すれば問題ありません。HUPシグナルだけではダメです。
Jan 1 9:00:00 hogehoge /usr/sbin/named[xxx]: could not listen on UDP socket: permission denied
Jan 1 9:00:00 hogehoge /usr/sbin/named[xxx]: creating IPv4 interface vmnet1 failed; interface ignored
これは、BINDをrestartするスクリプトを実行することで対処しました。
このscriptを /usr/local/etc/rc.d/zzz.bind_restart.sh として置けば、PPPoEログインよりもあとで実行されますので大丈夫です。
なお、最初から /etc/rc.conf ではBINDを起動しないように書いておけばいい、という気もしますが、
名前が引けないと起動に困る(時間がかかる)daemonもあるようですので、こうしました。
/usr/local/etc/rc.d/zzz.bind_restart.sh を編集する
#!/bin/sh # restart bind again to work with PPPoE # Jul. 13, 2002 # if [ -f /var/run/named/named.pid ]; then PID=`head -1 /var/run/named/named.pid` else PID=NULL fi case $1 in start) if [ $PID != NULL ]; then kill $PID sleep 1 /usr/sbin/named -u bind -c /etc/namedb/named.conf echo "restart bind" else /usr/sbin/named -u bind -c /etc/namedb/named.conf echo "bind is not running. start bind" fi ;; stop) if [ $PID != NULL ]; then kill $PID echo "bind stopped." else echo "bind is not running." fi ;; *) echo "usage: `basename $0` {start|stop}" ;; esac exit 0