Bind

(作成:2006/03)

OSSのDNSサーバとしては有名過ぎるくらい有名なので特に紹介する事も無く。
とはいえ、ホームユースでネームサーバ立てて楽しい事ってあまり無いかも。小規模LANでも構築していればそれなりにアレかも知んないけど、おそらくは趣味の問題。 でも、キャッシュサーバとして動作させればDNS問い合わせとかが多少高速になるし、使い所はあるという事で。

Install on Debian

特にセキュアな実装が必要なものでもないんで、 apt-get でサクッとインストール。

# apt-get install bind

インストール後、サーバに問題があれば /var/log/syslog にログとして残るのでそちらを参照のこと。

設定

Bindに直接関わるものではないけれど、内外のDNSが引けるよう /etc/resolv.conf を設定し直しておく。

#### /etc/resolv.conf

search isp.no.domain
search hyakki.local
nameserver 192.168.1.1
nameserver ***.***.***.***  # ISPのns

全般

まずは設定全体に関わるオプション。詳細は順に。

//// /etc/bind/named.conf

options {
        directory "/var/named";
        auth-nxdomain yes;
        version "";
        allow-transfer { none; };
        recursion       yes;
};
  • options
    この鴎括弧で括られた内容がBIND全体の設定に適用される。
  • directory
    正引き/逆引き設定ファイルの設置場所。
  • auth-nxdomain
    旧いDNSサーバへの互換性のため。指定されたドメインが無い場合に AuthoritativeAnswer ビットというのを立てるらしい。
  • version
    BINDのバージョン。空欄にしとけばバージョンがばれないんで、ちょっとセキュア。
  • allow-transfer
    名前解決データの転送制限。ここに転送を許可するIP/ネットワークアドレスを指定してやれば、そこにしか名前解決データを転送しないので、やっぱりちょっとセキュア。
  • recursion
    名前解決が自己解決出来ない場合、他のネームサーバへ問い合わせるかどうか。 no にすれば外部に問い合わせしない。 yes なら問い合わせるが、forwarder で設定したサーバに問い合わせる。ホームユースで使わないなら設定不要。

ローカル用DNSサーバとしての設定

以下はホームユースでPC管理をするようなローカル設定なので、グローバルなDNSを立てる場合には殆ど必要無いかと。
ネームサーバを使用できるネットワークを制限するには以下のように設定する。 ローカルでのみ使用、ネットワークアドレス 192.168.1.0/24 、自分自身 127.0.0.1 なら、この二つを定義してやる。 acl に続く文字列は宣言名なので任意。例えばネットワークのドメイン名にしとくのも良いかも。

//// /etc/bind/named.conf

acl hyakki {
        192.168.1.0/24;
        127.0.0.1;
};

ローカルなサーバの場合はDNS問い合わせに対し自己解決出来ない場合が生じるんで、その時に優先して問い合わせるDNSを以下のように設定する。
ホームユースなんかだとトラフィック軽減のためにDNSキャッシュとして一元化させて動作させるんだけど、当然の事ながらマトモに問い合わせの出来るトコ知らなきゃ意味無い。普通はISPから提供されているNSのアドレスを記述する。

//// /etc/bind/named.conf

forwarders {
        xxx.xxx.xxx.xxx;
        yyy.yyy.yyy.yyy;
};

ルートサーバのキャッシュ

DNSのルートサーバも、あんまし頻繁にアクセスするのも嫌がられるので、キャッシュするように設定しとく。

//// /etc/bind/named.conf

zone "." IN {
        type hint;
        file "named.root";
};

/var/named/named.root については以下から最新版を入手すれば良い。

ローカルアドレスの名前解決

そんなに重要なモンでもないと思うけど、サーバ自身のローカルな名前解決もしとく。

/// /etc/bind/named.conf

zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.127.0.0";
        allow-update { none; };
};

/var/named/named.localhost/var/named/named.127.0.0 はローカルホスト用のゾーンファイルで、以下の内容でOK。

;;;; /var/named/named.localhost

$TTL    86400
$ORIGIN localhost.
@   1D IN SOA   @ root (
                        42      ; serial (d. adams)
                        3H      ; refresh
                        15M     ; retry
                        1W      ; expiry
                        1D )    ; minimum

    1D IN NS    @
    1D IN A     127.0.0.1
;;;; /var/named/named.127.0.0

$TTL    86400
@   IN SOA localhost. root.localhost.  (
                        1997022700      ; Serial
                        28800           ; Refresh
                        14400           ; Retry
                        3600000         ; Expire
                        86400 )         ; Minimum
    IN NS  localhost.
1   IN PTR localhost.

設定(キャッシュサーバとして)

キャッシュサーバとして設定を行なうには、Debianの場合だと基本的にはデフォルト設定のまま何もしなくて良い。いやぁ便利だねぇ。

設定(メインサーバとして)

ものすごく当り前な話だが、自分のネットワークを表現するためのメインネームサーバとして設定する事もできる。出来なきゃ何のためのBINDだよって話だけどさ。

正引きDNS設定

ホスト名/ドメイン名からIPアドレスを問い合わせるための設定。メインのネームサーバとして主要な設定。

named.conf ではまず、利用したいドメイン名についてのゾーン宣言をする。 zone に続く文字列は利用したいドメイン名で、この括弧内で宣言されている正引き用ゾーンファイル内でのデフォルトのドメイン名として用いられる。 type は、このドメイン名についてのメインのネームサーバである事を表す。 file は、正引き用ゾーンファイルのファイル名を指定する。このファイルは、 option 内の directory で指定されたパスに置くこと。

//// /etc/bind/named.conf

zone "hyakki.local" {
        type    master;
        file    "named.hyakki";
};

で、その正引き用ゾーンファイルの中身について。
ファイル中の記述では、FQDNの後には必ず . を付ける必要があり、メールアドレスの @. に置き換える必要がある。

;;;; /etc/bind/named.hyakki

$TTL    604800
@       IN      SOA     oni.hyakki.local.       root.hyakki.local. (
        2003101001      ; Serial
        10800           ; Refresh
        1800            ; Retry
        604800          ; Expire
        86400           ; Minimum
)
  • $TTL
    Time To Live値を指定する。簡単に言えばクライアント側の持つDNS情報の賞味期限みたいなもので、これが短いとクライアントは頻繁にDNS問い合わせ結果を更新してレスポンスが悪くなるし、長いとクライアントは古い情報を保持するようになる。ドメイン情報の更新頻度にも依るが、大体この程度の値で良いんでないかな。
  • @ 以降
    SOAレコード。ゾーン管理情報を記述する。 @named.conf で設定したドメイン名に置き換えられる。5つ目の root.hyakki.local. は、管理者のメールアドレスを指す。
  • SOAレコードの中身
    順に「ゾーンファイルのバージョン」「ゾーン情報をリフレッシュするまでの時間」「リフレッシュ失敗時の再試行間隔」「リフレッシュが出来ない場合の、セカンダリサーバの持つゾーンデータ使用期限」「存在しないドメイン名についてのTTL」の意。メインのネームサーバとしては1つ目と5つ目の数値しか意味無いが、セカンダリサーバも構築するつもりであれば2~4つ目も重要となる。
    ゾーンファイルのバージョンについては、ゾーンファイルの変更があった場合に必ず変更すること。書式は任意だが、通例は変更した日付とその日の変更回数を使った YYYYMMDDnn 。 なお「存在しないドメイン名」というのは、そういう風に敢えてゾーン宣言出来るらしいのだが、使い道についてはよく判らない。。。敢えて指定して嬉しい事って何かあるのかしらん。

ゾーン定義。最初にネームサーバやメールサーバがある場合(もちろん自分自身も含む)、それぞれNSレコードとMXレコードで指定してやる。

;;;; /etc/bind/named.hyakki

@   IN  NS      oni.hyakki.local.
@   IN  MX  10  oni.hyakki.local.

各マシンのゾーン定義はAレコードで行なう。

;;;; /etc/bind/named.hyakki

;; Servers
oni             IN      A       192.168.1.1
funayurei       IN      A       192.168.1.100

;; Clients
kappa           IN      A       192.168.1.2
tengu           IN      A       192.168.1.3

ホスト名とは別にエイリアスが欲しいなー、という場合は CNAME レコードで行なう。エイリアスってーのはつまり「別名」って事で、例えばここでは www.hyakki.localoni.hyakki.local が同一。 この利点は、見れば判ると思うけれど、Webアドレスやメールアドレスなんか用だね。まぁぶっちゃけ利用可能ポートの問題で我が家では無意味なんだが。。。

;;;; /etc/bind/named.hyakki

;; Aliases
gateway         IN      CNAME   funayurei
ns              IN      CNAME   oni
mail            IN      CNAME   oni
www             IN      CNAME   oni
ftp             IN      CNAME   oni

逆引きDNS設定

IPアドレスからホスト名/ドメイン名を問い合わせるための設定。メインのネームサーバとして2番目に主要な設定。
named.conf で利用したいIPアドレスについてのゾーン宣言をする。内容は大体正引きの設定と同じ。 zone に続く文字列は利用したいネットワークIPで、この括弧内で宣言されている逆引き用ゾーンファイル内でのデフォルトのネットワークIPとして用いられる。

//// /etc/bind/named.conf

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

逆引き用ゾーンファイルの中身について。
ファイル中の記述では、FQDNの後には必ず . を付ける必要があり、メールアドレスの @. に置き換える必要がある。

TTLSOA レコードについては正引き用と同様。NSレコードも同様。でもMXレコードは要らない。 各マシンのゾーン定義は PTR レコードで行なう。アドレスは下1桁のみで良い。

;;;; /etc/bind/named.192.168.1

$TTL    604800
@       IN      SOA     oni.hyakki.local.       root.hyakki.local. (
        2003101001      ; Serial
        10800           ; Refresh
        1800            ; Retry
        604800          ; Expire
        86400           ; Minimum
)

@       IN      NS      oni.hyakki.local.

;; Servers
1       IN      PTR     oni.hyakki.local.
100     IN      PTR     funayurei.hyakki.local.

;; Clients
2       IN      PTR     kappa.hyakki.local.
3       IN      PTR     tengu.hyakki.local.

設定(セカンダリサーバとして)

メインサーバが落ちた時とかの予備サーバとして設定する事もできる。 ホームユースだと更に必要無さ気ではあるけれど。。。

方法は簡単。 named.conf で、 zonetypeslave に変更し、 masters でメインサーバを指定してやれば良い。正/逆引きゾーンファイルは用意する必要は無い。つーかセカンダリなんだから用意しちゃいかん。
メインサーバからのゾーン情報は /var/cache/bind/ 以下に保持されるため、 zonefile をフルパスで設定しないのであれば directory 設定も変更する必要がある。

//// /etc/bind/named.conf

zone "hyakki.local" {
        type    slave;
        file    "named.hyakki";
        masters { 192.168.1.1; };
};

zone "1.168.192.in-addr.arpa" {
        type    slave;
        file    "named.192.168.1";
        masters { 192.168.1.1; };
};

起動と動作チェック

起動。

# /etc/init.d/bind start

/var/log/message にて起動ログのチェックができる。エラーが出ていなければ、実際に設定したサーバに接続可能な端末から dig コマンドで参照してみる。

$ dig @ns.hyakki.local -x 192.168.1.3
...
;; ANSWER SECTION:
1.1.168.192.in-addr.arpa. 84471 IN  CNAME   ***.0/128.1.168.192.in-addr.arpa.
***.0/128.1.168.192.in-addr.arpa. 0 IN PTR   tengu.hyakki.local.
...
$ dig @ns.hyakki.local tengu.hyakki.local
...
;; ANSWER SECTION:
tengu.hyakki.local.       86400  IN      A       192.168.1.3
...
$

正引き/逆引き共に問題無ければ成功。