Nameserverの構築

Nameserverの構築をします。これはサーバーにとっては無くてはならない縁の下の力持ちの役割を担います。IPv4(今までの普通のインターネット)では、8ビットづつの4つの数字(IP アドレス)でマシンが一意に決められています。これは、202.abc.xyz.18 などの数字の羅列ですから覚えるのは困難です。これに、例えば www.fujie.org などのアルファベットや数字などを割り当てたものがいわゆる普段接しているネームアドレスになります。この IP アドレスとネームアドレスを結びつける電話帳の役割をするのが、Nameserver です。次に私の場合の例を図示してみます。これはプロバイダーから8個のIPアドレスをいただいた場合を想定しています。

IP address : 202.abc.xyz.16/29 (202.abc.xyz.16 〜 202.abc.xyz.23)

これは全32ビット中、202.abc.xyz.16 から3ビット(8個)を割り当てられているという意味になります。普通割り当てられるIPアドレスは8個か16個ですので、最後は /29 か /28 になります。IPアドレスの4番目の数字すべてを割り当てられると8ビット(/24=256個)ということになり、これをCクラスといいます。一般的には8個か16個だと思いますので、Cクラス未満割り当てを前提に話を進めてゆきます。このような世界で一意のIPアドレスの他に自分のネットワーク内だけなら自由に使えるIPアドレスがあります。これをグローバルIPアドレスに対してローカルIPアドレスといいます。代表的なものは、192.168.0.0 〜 192.168.255.255 までの16ビット空間で、グローバルIPアドレスが足りないときやグローバルに公開したくない時などに使用されます。この例では、ルーターのNAT機能等により同じマシンあるいは独立したマシンにローカルIPアドレスも割り当てています。なお、8(16)個割り当てられたグローバルIPアドレスのうち、最初と最後は使えない決まりになっています。また2番目のIPアドレスは普通、ルーターに割り当てるため、マシンに割り当てることができるグローバルIPアドレスは5(13)個になります。DHCP server とはルーターが自動的にローカルIPアドレスを割り振ってくれる機能でほとんどのルーターには備わっています。ここでは Nameserver に BIND9 を使うことを前提にします。

           router.fujie.org
           192.168.1.1
           202.abc.xyz.17
              +------+  |
Internet------|Router|--+
              +------+  |  +---------------------------------+
           DHCP server  |  |   ns.fujie.org                  |
           NAT          |  |   202.abc.xyz.18 = 192.168.1.2  |
                        +--+       DNS Server                |
                        |  |       Web server                |
                        |  |       Mail server               |
                        |  +---------------------------------+
                        |
                        |  +---------------------------------+
                        |  |   ns2.fujie.org                 |
                        |  |   202.abc.xyz.19 = 192.168.1.3  |
                        +--+       DNS server                |
                        |  |       Web server                |
                        |  |       Mail server               |
                        |  +---------------------------------+
                        |
                        +--Host3(WindowsXP)        192.168.1.5
                        |
                        +--Host4(WindowsXP)        192.168.1.6
                        |
                        +--Host3(MAC)              192.168.1.9
                        |
                        +--Hosts                   DHCP Clients

1.BINDのインストール
まずNameserverソフトであるBINDをインストールします。最新のBIND9(2003年1月現在9.2.1)をインストールします。FreeBSDの場合、portsを使うのがお気楽でしょう。

# cd /usr/ports/net/bind9
# make
# make install

ソースをBINDのサイトからダウンロードしてコンパイルしてもいいでしょう。この場合もインストールされるディレクトリはportsからインストールした場合と同じようです。

# cd /usr/local/src/
# tar zxvf bind-9.2.1.tar.gz
# cd bind-9.2.1
# ./configure
# make
# make install

2.zoneファイル
ネームアドレスからIPアドレスを引く正引きデータベースです。あらたにfujie.org.zoneというファイルを作ってください。エディタには標準のviがお勧めです(というかどのUNIXでも標準装備のようです)。viの基本コマンドは以下のとおりでこれだけ知っていればどうにかなります。vi filenameで起動されます。またESCキーでコマンドモードになります。また、eeも使いやすいです。ee filenameで起動します。コマンドは起動画面に書いてありますのでviと違って覚える必要がありません。

<viの基本コマンド>
h    カーソルを左へ
j    カーソルを下へ
k    カーソルを上へ
l    カーソルを右へ
i  その位置から入力
a  次の位置から入力
x  文字のdelete
dd  行のdelete
:q   終了
:q!  保存せず終了
:wq 保存して終了

global用とlocal用の2つのzoneファイルを用意します。

global用zoneファイルの一例:
 1:  ; file name: fujie.org.zone
 2:  ; for fujie.org.
 3:  $ORIGIN  fujie.org.
 4:  $TTL 86400
 5:  @      IN        SOA     ns.fujie.org.  root.fujie.org.  (
 6:         2002111501        ; serial number
 7:         10800             ; refresh after 3 hours
 8:         3600              ; retry after an hour
 9:         604800            ; expire after a week
10:         86400 )           ; minimum TTL of a day
11:         IN        NS      ns.fujie.org.
12:         IN        NS      ns2.fujie.org.
13:         IN        NS      ns1.sphere.ad.jp.
14:         IN        NS      ns2.sphere.ad.jp.
15:         IN        MX      10 ns.fujie.org.
16:         IN        A       202.abc.xyz.18
17:         IN        MX      20 ns2.fujie.org.
18:         IN        A       202.abc.xyz.19
19:         IN        MX      30 mail.wind.ne.jp.
20:         IN        A       210.235.156.36
21:  @      IN        A       202.abc.xyz.18
22:  router IN        A       202.abc.xyz.17
23:  ns     IN        A       202.abc.xyz.18
24:  ns2    IN        A       202.abc.xyz.19
25:  www    IN        CNAME   ns.fujie.org.
26:  ftp    IN        CNAME   ns.fujie.org.
27:  www2   IN        CNAME   ns2.fujie.org.
28:  localhost     IN      A       127.0.0.1

行数:は便宜上書いたもので、実際には記載しません。セミコロン";"から後の文字はコメントになります。6〜20行目を除いて、すべて行頭から記述してください。空白があると動きません。3行目でドメインを書きますが、省略すると named.conf で指定されたゾーン名が適用されます。4行目の記載は、bind8から必須となりました。これは SOA レコードよりも前に記載されなくてはならず、SOAの記載よりも優先されます。5行目ではホストと管理者のメールアドレスを記述します。"("の前には空白を1文字以上挿入してください。メールアドレスに@は使ってはいけません。ピリオドで代用します。6行目はシリアルナンバーで日付+01からでいいでしょう。このデータベースを書き換えたら数字を増やしてください。そうしないと nameserver に変更が反映されません。10行目の")"の前は空白を1文字以上挿入してください。11行目はnameserverとするマシンの名前です。ドメイン名の最後には必ずピリオド"."を入れてください。12行目はsecondary nameserverです。上流プロバイダーのnameserverでも構いません。13行目は上流プロバイダのnameserverです(例:インフォスフィアのsecondary nameserver)。もちろん、12行目で指定してあれば必要ありません。15行目はメールサーバーの設定で、****@ns.fujie.org宛のメールをns.fujie.orgで受けるという意味です。16行目はそのIPアドレスで、17行目は、予備用のsecondary mail serverです。MX record(この場合は20)は必ずprimaryより大きい数字にして下さい。19行目は、上流プロバイダのmail serverで、プロバイダに連絡してメールの転送ができるようにしてもらってください。もちろん、なくても動きます。22〜24行目では、マシンの名前にglobal addressを割り振っています。もし、global addressを割り振るマシンが他にもあれば(WWW ServerやPOP3 Serverが他のマシンにある場合など)、24行目以下に追加して記述してください。25行目はwww.fujie.orgの別名(cname)がns.fujie.orgであるという意味です。WWW serverをns.fujie.orgに置くということです。28行目はlocalhostのおまじないです。21行目を入れると、wwwを省略しても www.fujie.org にアクセスできるようになります。

local用zoneファイルの例:
 1:  ; file name: local.fujie.org.zone
 2:  ; for local.fujie.org
 3:  $TTL 86400
 4:  @        IN        SOA     ns.local.fujie.org.  root.local.fujie.org.  (
 5:           2002111501        ; serial number
 6:           10800             ; refresh after 3 hours
 7:           3600              ; retry after an hour
 8:           604800            ; expire after a week
 9:           86400 )           ; minimum TTL of a day
10:           IN        NS      ns.fujie.org.
11:           IN        NS      ns2.fujie.org.
12:           IN        NS      ns1.sphere.ad.jp.
13:           IN        NS      ns2.sphere.ad.jp.
14:           IN        MX      10 ns.fujie.org.
15:           IN        A       202.abc.xyz.18
16:  @        IN        A       192.168.1.2
17:  router   IN        A       192.168.1.1
18:  ns       IN        A       192.168.1.2
19:  ns2      IN        A       192.168.1.3
20:  drroom   IN        A       192.168.1.5
21:  thinkpad IN        A       192.168.1.6

3.revファイル
IPアドレスからネームアドレスを引く逆引きデータベースです。global用はCクラス未満のため特殊な技が必要になります。SUB16.xyz.abc.202.rev と xyz.abc.202.rev という2つのファイルをエディタで作ります。

global用revファイルその1
 1:  ; file name: SUB16.xyz.abc.202.rev
 2:  ; for SUB16.xyz.abc.202.in-addr.arpa.
 3:  $ORIGIN  SUB16.xyz.abc.202.in-addr.arpa.
 4:  $TTL 86400
 5:  @        IN        SOA     ns.fujie.org.  root.fujie.org.  (
 6:           2002111502        ; serial number
 7:           10800             ; refresh after 3 hours
 8:           3600              ; retry after an hour
 9:           604800            ; expire after a week
10:           86400 )           ; minimum TTL of a day
11:           IN        NS      ns.fujie.org.
12:           IN        NS      ns2.fujie.org.
13:           IN        NS      ns1.sphere.ad.jp.
14:          IN        NS      ns2.sphere.ad.jp.
15:  17       IN        PTR     router.fujie.org.
16:  18       IN        PTR     ns.fujie.org.
17:  19       IN        PTR     ns2.fujie.org.

このzoneファイルは、40bit ということになります。最初の16はもらったIPアドレスの先頭を使いますが、プロバイダから指示されることもあります。InfoSphere ならSUB16、DION なら 16h となります。この例ではInfosphereの指示に準拠しています。

global用revファイルその2
 1:  ; file name: xyz.abc.202.rev
 2:  ; for xyz.abc.202.in-addr.arpa.
 3:  $ORIGIN  xyz.abc.in-addr.arpa.
 4:  $TTL 86400
 5:  @        IN        SOA     ns.fujie.org.  root.fujie.org.  (
 6:           2002111501        ; serial number
 7:           10800             ; refresh after 3 hours
 8:           3600              ; retry after an hour
 9:           604800            ; expire after a week
10:           86400 )           ; minimum TTL of a day
11:           IN        NS      ns.fujie.org.
12:           IN        PTR     fujie.org.
13: 16        IN        NS      ns.fujie.org.
14: 17        IN        CNAME   17.SUB16.xyz.abc.202.in-addr.arpa.
15: 18        IN        CNAME   18.SUB16.xyz.abc.202.in-addr.arpa.
16: 19        IN        CNAME   19.SUB16.xyz.abc.202.in-addr.arpa.

例えば、202.abc.xyz.18 に対する逆引き要請があった場合、xyz.abc.202.in-addr.arpa ゾーンで 18 がヒットして、その CNAME(別名)として 18.SUB16.xyz.abc.202.in-addr.arpa というゾーンを参照します。そしてさらに、SUB16.xyz.abc.202.in-addr.arpaゾーンで 18 がヒットし、ns.fujie.org が引けます。

local用revファイル

 1:  ; file name: 1.168.192.rev
 2:  ; for 1.168.192.in-addr.arpa.
 3:  $ORIGIN  1.168.192.in-addr.arpa.
 4:  $TTL 86400
 5:  @        IN        SOA     ns.fujie.org.  root.fujie.org.  (
 6:           2002111501        ; serial number
 7:           10800             ; refresh after 3 hours
 8:           3600              ; retry after an hour
 9:           604800            ; expire after a week
10:           86400 )           ; minimum TTL of a day
11:           IN        NS      ns.fujie.org.
12:           IN        NS      ns2.fujie.org.
13:           IN        NS      ns1.sphere.ad.jp.
14:           IN        NS      ns2.sphere.ad.jp.
15:  1        IN        PTR     router.local.fujie.org.
16:  2        IN        PTR     ns.local.fujie.org.
17:  3        IN        PTR     ns2.local.fujie.org.
18:  5        IN        PTR     drroom.local.fujie.org.
19:  6        IN        PTR     thinkpad.local.fujie.org.

local用逆引きファイルはCクラス以上なので素直に書けば問題ありません。

4.named.conf
BIND9 では named.boot は使いません。その代わり、named.conf で様々な設定をします。これはとても奥が深いのですが、とりあえず primary nameserver として動くようにします。次は僕の場合の例です。尚、named.confやzoneファイル、revファイルは/etc/namedbに置おきました(これは、後に述べるnamed flagsで変更可能)。ここで"key"という概念が出てきますが、これはBIND9.2 以降から出てきたもので、セキュリティを上げるための手段のようですが、詳しいことはBIND9のホームページを参照してください。この"key"を作らなくてもBIND9は動きますが、「keyがないよ」というようなメッセージが延々と流れてウザいので作っておきましょう。

# cd /etc/namedb/
# /usr/local/sbin/dnssec-keygen -r /dev/urandom -a hmac-md5 -b 512 -n user rndc 

すると、Krndc.+157+XXXXX.key と Krndc.+157+XXXXX.private という2つのファイルができます。XXXXXには5桁の数字が入ります。それぞれの中身を確認します。

# cat Krndc.+157+XXXXX.private
Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: **************************************************************

このprivateキーの90桁くらいの文字列を利用してrndc.confを書きます。これはsampleをコピーして利用するといいでしょう。

# cd /usr/local/etc/
# cp rndc.conf.sample /etc/namedb/rndc.conf
# ee /etc/namedb/rndc.conf

rndc.confの例

options {
        default-server  localhost;
        default-key     "key";
};

server localhost {
        key     "key";
};

key "key" {
        algorithm       hmac-md5;
        secret "******************************************************"
};

この*************の部分に先ほどの、Krndc.+157+XXXXX.private の中身の key: から続く文字列をコピーして入れます。さらに、Krndc.+157+XXXXX.keyの中身を確認してnamed.confを作ります。

# cat Krndc.+157+XXXXX.key
rndc. IN KEY 0 2 157 ***********************************************

named.confの例

key "key" {
        algorithm       hmac-md5;
        secret "*************************************************************";
};

controls {
        inet ::1 allow {
                ::1;
        }
        keys {
                "key";
        };
        inet 127.0.0.1 allow {
                127.0.0.1;
        }
        keys {
                "key";
        };
};

これをnamed.confの先頭に挿入します。さらにnamed.confの続きを書きます。BIND9で大きく変わった新しい機能の1つにviewセクションがあります。これは要求元のIPアドレスによって回答するゾーン情報を切りかえるというもので、viewセクションの内部に定義されたmatch-clientsとDNSクエリーの要求元IPアドレスを比較し、どのビューの内容で回答するかを判断します。ローカルからDNSクエリーが行われた場合、"internal"アクセス制御リストに定義されている192.168.1.0/24のアドレスにマッチするので、"internal"ビューの内容を検索して回答します。インターネットからのDNSクエリーに対しては、"internal"アクセス制御リストにマッチしないので "external"ビューの内容を検索して回答します。この"internal"と"external"は任意で構いません。それでは、named.confの続きを見てみましょう

named.confの例(続き)
//
// named.conf
//
// #--- アクセスコントロールの設定 ---#
acl "allowed-hosts" {
        0.0.0.0;
        127.0.0.1;
        192.168.1.0/24;
};
// ここでは依頼しているセカンダリネームサーバーを設定します。
// InfoSphereの例
acl "allowed-hosts-external" {
        202.239.113.26;
};

// #--- オプションの設定 ---#
options {
        directory       "/etc/namedb";
        pid-file        "/etc/namedb/named.pid";
        auth-nxdomain   no;

        allow-transfer  { allowed-hosts; };
        allow-query     { allowed-hosts; };
};

// #--- ログ出力の設定 ---#
logging {
        channel default_debug {

// /var/log/named.log と言うファイルに出力して 4 世代で管理してそのファ
// イルサイズが 3MByte になったら世代を新しくすると言う設定
                file            "/var/log/named.log" versions 4 size 3m;
                severity        dynamic;
                print-time      yes;
                print-category  yes;
        };
        category default {
                default_debug;
        };
        category xfer-in {
                default_debug;
        };
        category xfer-out {
                default_debug;
        };
};


// #---  LAN 側のゾーンファイルの設定 ---#
view "internal" {
        match-clients   { allowed-hosts; };
        allow-transfer  { allowed-hosts; };
        allow-query     { allowed-hosts; };
        recursion       yes;

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

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

        zone "0.0.127.in-addr.arpa" {
                type master;
                file "localhost.rev";
        };

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

        zone "local.fujie.org" {
                type master;
                file "local.fujie.org.zone";
        };
        zone "local.fujie.jp" {
                type master;
                file "local.fujie.jp.zone";
        };
};


// #---  外側のゾーンファイルの設定 ---#
view "external" {
        match-clients   { any; };
        allow-query     { any; };
        allow-transfer  { allowed-hosts-external; allowed-hosts; };
        recursion no;

        zone "fujie.org" {
                type master;
                file "fujie.org.zone";
        };

        zone "fujie.jp" {
                type master;
                file "fujie.jp.zone";
        };

        zone "xyz.abc.202.in-addr.arpa" {
                type master;
                file "xyz.abc.202.rev";
        };

        zone "SUB16.xyz.abc.202.in-addr.arpa" {
                type master;
                file "SUB16.xyz.abc.202.rev";
        };
};

ディレクトリオプションは、zoneファイルやcacheファイルの置き場所を指定します。僕の場合、/etc/namedb に置いてあります。また、pid-fileのディレクトリもここで指定します。

5.localhostデータベース
以下のようにすれば、/etc/namedb/localhost.revが自動的にできあがります。

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

6.resolv.conf
/etc/resolv.conf

domain  fujie.org
nameserver    127.0.0.1

7.rc.conf
自動起動のためのflagを書き換えます(書き加えます)。

# ee /etc/rc.conf
-----
named_enable="YES"               # Run named, the DNS server (or NO).
named_program="/usr/local/sbin/named"  # path to named, if you want a different one.
named_flags="-c /etc/namedb/named.conf" # Flags to named (if enabled).

これで自動起動できるはずです。

8.動作の確認
rootでログインして、namedを起動します。

# named -c /etc/namedb/named.conf

ではnslookupで確認してみましょう。
# nslookup
> www.fujie.org
で正しいIP addressが引けたでしょうか。また逆に

> 210.250.4.50
で正しいdomain name が引けたでしょうか。

では、今度は外に出てみましょう

> www.apple.com
で正しいIP addressが引けましたか。localで不明な場合はnamed.rootというキャッシュファイルを読みにいくことになっています。これで全世界のnameserverと繋がりました。

9.キャッシュファイルのメインテナンス
キャッシュファイル(named.root)は常に最新にしておいたほうがよいでしょう。mobiuseさんのページfkimuraさんのページを参考に(ほとんどそのままです)次のようなshell scriptを書いて月に一度くらいcronで実行しています。

# cd /etc/namedb
# ee chg_cache.sh
------------------
#!/bin/sh
#generated by pmobiuse

/usr/local/bin/dig @a.root-servers.net . ns >/etc/namedb/named.root.new 2>&1

case `cat /etc/namedb/named.root.new` in
*NOERROR*)
         # It worked
         :;;
*)
         echo "The root.hints file update has FAILED."
         echo "This is the dig output reported:"
         echo
         cat /etc/namedb/named.root.new
        exit 0
        ;;
esac

echo "The root.hints file has been updated to contain the following infomation:"
cat /etc/namedb/named.root.new

chown root.wheel /etc/namedb/named.root.new
chmod 444 /etc/namedb/named.root.new
rm -f /etc/namedb/named.root.old
mv -f /etc/namedb/named.root /etc/namedb/named.root.old
mv -f /etc/namedb/named.root.new /etc/namedb/named.root
kill -HUP `/bin/cat /var/run/named.pid`
echo "The nameserver has been restarted to ensure that the update is complete."
echo "The previous named.root file is now called /etc/namedb/named.root.old"
exit 0
-------------------
# chmod 755 chg_cache.sh
# crontab -e
-------------------
# change cache
1 1 10 * * /etc/namedb/chg_cache.sh
-------------------

これで毎月10日に更新されます。

TOP PAGE