DNS server

PC の数も増えてくると、ローカルネットワーク内の名前解決のために全部のマシンの hosts ファイルを作成するのは非常に面倒です。PC が増えたら全部書き換えないといけないし…。DNS サーバを稼動させて一括管理してみましょう。

この DNS サーバではローカルネットワークのホスト名を管理し、知らないホスト名はプロバイダの DNS サーバに問い合わせるようにします。
プライベートな DNS なので外部からの DNS 問い合わせの事はまったく考えてません。ドメインを取得して DNS を稼動させる場合には参考にならないので注意してね。

ドメイン名はローカルなネットワーク内のみで使用するので好きな名前を付けてかまいません。
ただし、インターネット上に存在するドメイン名を付けると悲しいことになるので、InterNIC が配布していない名前を付けることをお勧めします。

インストール

named は FreeBSD の配布パッケージに標準で含まれていますので、特にインストール作業は必要ありません。

named の設定

named.conf

まず、named の設定ファイル /etc/namedb/named.conf を編集します。

このファイルにはコメントの書式がいろいろあって読みにくいです。/* */ で囲まれているか、# と // 以降の文字列はすべてコメントなので無視してかまいません。

option ステートメント

option ステートメントで全体の設定を行います。

プロバイダの DNS サーバが使えるなら、forwarders のコメントアウトをはずし、DNS サーバのアドレスを書き込みます。
そうすると自分で名前解決できない場合には、 まず forwarder で指定した DNS サーバに問い合わせに行くようになります。DNS サーバからの返事がタイムアウトした場合には、自分でルートサーバから名前解決を行います。

forward only; の行を有効にしておくと、forwarder で指定した DNS サーバに問い合わせのみを行い、自分でルートサーバに問い合わせることはしません。

次の allow-query は、この DNS サーバの利用を許可するアドレス範囲を、allow-transfer はゾーン転送を許可するアドレス範囲を指定します。

options {
        directory "/etc/namedb";

//      forward only;

//      forwarders {
//              [プロバイダの DNS サーバアドレス];
//      };
        allow-query {
                192.168.1/24;
        };
        allow-transfer {
                192.168.1/24;
        };
};

zone ステートメント

zone ステートメントでは、名前解決に使うファイルの設定を行います。

最初の zone "." ではルートサーバ情報ファイルを指定してあります。今回の運用方式では、これについては変更する必要はありません。
完全に閉じたネットワークで、インターネット上のホストの名前解決をする必要が無い場合には、このエントリは必要ありませんので設定しないでください。

zone "localhost." / zone "0.0.127.IN-ADDR.ARPA" は localhost の正引き / 逆引き※1の設定をします。

zone "home" / zone "31.168.192.IN-ADDR-ARPA" は home ドメインに所属するホストの正引き / 逆引きの設定をします。

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

zone "localhost." {
    type master;
        file "localhost.zone";
        };

zone "0.0.127.IN-ADDR.ARPA" {
        type master;
        file "localhost.rev";
};

zone "home" {
        type master;
        file "home.zone";
};

zone "1.168.192.IN-ADDR.ARPA" {
        type master;
        file "home.rev";
};

type master は、このサーバがマスターデータを所有しているということです。そして、file "ファイル名"でデータファイルを指定します。

type slave とした場合は、他のDNSサーバからデータをコピーして使用します。その場合、マスター側で allow-transfer でゾーン転送を許可する必要があります。

正引き情報ファイルの作成

ローカルの正引き情報ファイル home.zone※2 を作成します。雛型などは無いので、一からすべて書くことになります。

1行目に、TTL(生存時間)を指定しておきます。これは問い合わせを行ったクライアントがどのくらいの期間その情報を利用できるかを指定します。(他のDNSサーバのキャッシュに収まっている最長時間を指定できるってことでいいのかな)

2行目には @ IN SOA に続いて、ネームサーバーのホスト名(要するに自分の名前) 管理者のメールアドレスを書きます。ここでのメールアドレス表記は、root@host.domain ならば root.host.domain になることに注意してください。

次にこのファイルのシリアルナンバーを記入します。私は YYYYMMDD[No.] という書式を使っていますが、1 から始めて数を増やしていってもかまいません。この設定ファイルを書き換えたときに、シリアルナンバーを増やさないと設定が反映されないので、管理しやすい方式を使ってください。

それ以降は、リフレッシュ・リトライ・有効時間・最小TTL が秒数でしていされています。私はよく理解できていないのと特別変更する必要がなさそうなので、参考文献に書いてあった数値をそのまま使っています。

以降ローカルに存在する PC やネットワーク機器の名前と IPアドレスを列挙していきます。

# vi /etc/namedb/home.zone
$TTL 3600
@ IN SOA denta.home. root.denta.home. (
                                2000120901  ; Serial
                                3600        ; Refresh
                                300         ; Retry
                                3600000     ; Expire
                                3600 )      ; Minimum
;
home.                   IN      NS      denta.home.
soho.home.              IN      A       192.168.31.1
muramasa.home.          IN      A       192.168.31.2
emerald.home.           IN      A       192.168.31.3
penta.home.             IN      A       192.168.31.10
ruby.hoem.              IN      A       192.168.31.11
neo.home.               IN      A       192.168.31.12
jade.home.              IN      A       192.168.31.13
denta.home.             IN      A       192.168.31.250

www.home.               IN      CNAME   denta.home.

IN を含む行に、名前とアドレスの対応を書いていきます。

IN NS とある行でドメイン home のネームサーバーは denta.home であると設定します。

次の行から IN A とある行で、ホスト名と IP アドレスの対応を書き連ねていきます。ホスト名の最後に . をつけると完全なホスト名として扱われます。つけない場合には、ドメイン名部分が付加されますので、muramasa とだけ書いてあってもドメイン名が付加されて muramasa.home となって muramasa.home. と同じ扱いになります。最後に . を付け忘れると、muramasa.home.home となってしまうので注意してください。

最後の一行、IN CNAME は別名の表記です。この行では www.home は denta.home の別名と設定されます。

逆引き情報ファイルの作成

正引き情報ファイルと同じように、逆引き情報ファイル home.rev※2 を作成します。

先頭部分は正引き情報ファイルと同じように書きます。

# vi /etc/namedb/home.rev
$TTL 3600
@       IN      SOA     denta.home. root.denta.home.  (
                                2000120901  ; Serial
                                3600        ; Refresh
                                300         ; Retry
                                3600000     ; Expire
                                3600 )      ; Minimum
;
        IN      NS      denta.home.
1       IN      PTR     soho.home.
2       IN      PTR     muramasa.home.
3       IN      PTR     emerald.home.
10      IN      PTR     penta.home.
11      IN      PTR     ruby.home.
12      IN      PTR     neo.home.
13      IN      PTR     jade.home.
250     IN      PTR     denta.home.

localhost.zone の作成

localhost の正引き情報ファイルを作成します。

# vi /etc/namedb/localhost.zone
@ IN SOA denta.home. root.denta.home. (
                                2000120901  ; Serial
                                3600        ; Refresh
                                300         ; Retry
                                3600000     ; Expire
                                3600 )      ; Minimum
;
                        IN      NS      denta.home.
localhost.              IN      A       127.0.0.1

localhost.rev の作成

localhost の逆引き用ファイル localhost.rev を作成します。作成用スクリプトが用意されているので、簡単に作れます。

# cd /etc/namedb
# sh .make-localhost

ここまでで、DNSサーバの設定は終わりました。

DNS クライアント設定

/etc/resolv.conf を編集して、自分の DNS サーバを使うように設定しましょう。

# vi /etc/resolv.conf
domain home
nameserver 127.0.0.1

/etc/host.conf でネームサーバを参照するように設定されているかも確認してください。

# cat /etc/host.conf
hosts
bind

動作テスト

起動テスト

設定がすべて終了したら、named をコマンドラインから起動してみます。

# named -u bind -g bind

named は起動時のメッセージを syslog を使って /var/log/messages に出力しています。正常に起動されたか確認してみましょう。

# tail /var/log/messages
starting.  named 8.2.3-T6B Mon Nov 20 11:27:49 GMT 2000
jkh@bento.FreeBSD.org:/usr/obj/usr/src/usr.sbin/named
Ready to answer queries.

Ready to answer queries. の行が出力されていれば正常に起動されています。出力されないなら、設定のミスがあるので設定ファイルを一通り確認してみてください。

動作テスト

ここでは、nslookup を使って正引き / 逆引きが行えるかテストしてみます。

$ nslookup
Default Server:  denta.home
Address:  192.168.31.250

> localhost
Server:  denta.home
Address:  192.168.31.250

Name:    localhost
Address:  127.0.0.1

> 192.168.31.2
Server:  denta.home
Address:  192.168.31.250

Name:    muramasa.home
Address:  192.168.31.2

> www.jp.freebsd.org
Server:  denta.home
Address:  192.168.31.250

Name:    www.jp.freebsd.org
Address:  210.157.158.42

プライベートネットワーク内のホストと、インターネット上のホストのドメイン名と IP アドレスを適当に入力してみて、正引き / 逆引きが引けていればOKです。

自動起動の設定

/etc/rc.conf を編集して起動時に自動的に DNS サーバが起動するように設定します。

/etc/default/rc.conf に標準設定のファイルが置いてあるので、必要な項目を /etc/rc.conf にコピーして使うのがお作法です。

# grep named_ /etc/default/rc.conf >> /etc/rc.conf
# vi /etc/rc.conf
named_enable="YES"              # Run named, the DNS server (or NO).
named_program="named"           # path to named, if you want a different one.
#named_flags=""                 # Flags for named
named_flags="-u bind -g bind"   # Flags for named

named_flags の行が2行あるので、セキュリティー的に強そうな -u bind -g bind の行を有効にしておきます。これによって、ユーザ bind グループ bind で named が実行されるようになります。

参考文献

  1. 「FreeBSD 徹底活用1 〜ネットワーク編」
    著者 : 天川修平, 衛藤敏寿, 佐藤淳一, 浜田直樹, 細川達己
    出版社 : 翔泳社 ISBNコード : 4-88135-538-4 価格 : 2,800円+ 税
  2. My Web Page by F. SHIBASAKI, Ph.D.
    LinuxでBIND-8.1.2を使ってみよう
  3. System Infinity Corporation
    グローバル用 プライベート用 named(Bind 8) HOW TO
  4. Laif'sHomePage
    FreeBSDによるダイアルアップルーターの構築 ローカルDNSサーバーの設置

注釈

※1 正引き・逆引き
ホスト名から IP アドレスを得る問い合わせを正引き。
その逆の問い合わせを逆引きといいます。
※2 home.zone, home.rev
私のローカルドメインは .home と設定したので、分かりやすいように home.zone としましたが、ファイル名は何でもかまいません。自ドメイン名.zone としておけば分かりやすいと思います。以下ファイル名は必要に応じて読み替えてください。