DNSサーバーの構築

1.なぜDNSサーバーを自分で立ち上げるのか

プロバイダーのDNSサーバーが死んでいる時に自分でDNSサーバーを動かしていれば問題無く
アクセスすることができます。またプロバイダーのDNSサーバーが混んでいる時なども、自分専用なので
変換に時間を取られることがないのでアクセスもスムーズになります。
また、イントラ側の名前解決には自前でDNSサーバーがあれば確実に解決できるようになります。

2.インストール

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に変えて読んでください。

3.認証キーの作成

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 を開くと例えば、
Private-key-format: v1.2 Algorithm: 157 (HMAC_MD5) Key: 8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
の様になっていると思いますが、使うのは Key: に続く
8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
 の部分です。

同様に、Krndc.+157+xxxxx.key を開くと例えば、
rndc. IN KEY 0 2 157 8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
の様になっていると思いますが、使うのは 157 に続く
8BBrkKtqlxpgcwmr5QcL1bnJeh76NjJ4a1x4bPvGAQrcGV5CMIVxQu0x 7W2JxDKlAdiqm+IaNrKBCke/+Phx6A==
 の部分です。

この認証キーは、後で使うのですが、使ったらこの認証キーファイルは、他人に見られないように削除しましょう。
忘れてしまうのが心配であれば、一度プリントアウトするなどして保管してから削除してしまいましょう。

4.設定

4−1.rndc.confの設定

/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
で、パーミッションを変更しておきましょう。

4−2.named.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
で、パーミッションを変更します。

4−3.ゾーンファイルの設定

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=最終更新日
あとはちょっと正確には分かりません。たぶん有効期限だとかだとは思いますが...(・_・;)

4−4.パーミッションの変更と run/ ディレクトリの作成

基本的に、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
としてください。

4−5.rc.confの設定

リブートした時に自動的に走るよう、rc.confに設定します。
/etc/rc.conf を編集する
named_enable="YES"
named_flags="-u bind -c /etc/namedb/named.conf"
named_program="/usr/sbin/named"
これで自動的にスタートします。

5.起動

コマンドラインから
# /usr/sbin/named -u bind -c /etc/namedb/named.conf
で起動できます。
プロセス確認して走っているようでしたらnslookupででも調べて見てください。

ゾーンファイルや、named.confを書き換えた場合、反映させる場合は
# rndc reload
で反映できます。

6.PPPoEの場合

BIND9 をインストールし、/etc/rc.conf で起動するようにした際、PPPoEで接続終了する前に起動するので、
BINDが一時間毎に
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を再起動すれば問題ありません。HUPシグナルだけではダメです。
これは、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