次のページ 前のページ 目次へ

3. 名前解決とキャッシュを行うネームサーバ

DNS 設定の最初の一歩。 ダイアルアップ・ケーブルモデム・ADSL などのユーザにはとても便利です。

Red Hat や、Red Hat に関連したディストリビューションでは、 bind パッケージ・bind-utils パッケージ・ caching-nameserver パッケージをインストールするだけで、 この HOWTO の最初のセクションの結果と同じものが得られます。 Debian を使っているなら bindbind-doc をインストールするだけです (あるいは前者に対しては bind9。 この文書の執筆時では、Debian の安定版 (potato) は BIND 9 をサポートしていません)。 もちろんこれらのパッケージをインストールするだけでは、 この HOWTO を読むことによって得られる知識は手に入りません。 ですので、まずパッケージをインストールし、 そこでインストールされたファイルを調べながら、 読み進んでいくのが良いでしょう。

キャッシュ専用のネームサーバとは、名前引きの結果を記憶しておき、 次回の問い合わせの時にその記憶を使って答えるものです。 次回からの問い合わせに対する応答は (特に遅い回線を使っている場合には) とても速くなります。

まず最初に /etc/named.conf というファイルが必要です (Debian では /etc/bind/named.conf)。 named は起動するとまずこのファイルを読み込みます。 現在のところは、次のような簡単なものでよいでしょう。


// Config file for caching only name server
//
// The version of the HOWTO you read may contain leading spaces
// (spaces in front of the characters on these lines ) in this and
// other files.  You must remove them for things to work.
//
// Note that the filenames and directory names may differ, the
// ultimate contents of should be quite similar though.

options {
        directory "/var/named";

        // Uncommenting this might help if you have to go through a
        // firewall and things are not working out.  But you probably
        // need to talk to your firewall admin.

        // query-source port 53;
};

controls {
        inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
};

key "rndc_key" {
        algorithm hmac-md5;
        secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};

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

zone "0.0.127.in-addr.arpa" {
        type master;
        file "pz/127.0.0";
};

Linux ディストリビューションのパッケージでは、 ここで紹介するそれぞれのファイルに、別の名前をつけているかもしれません。 でも内容は同じはずです。

directory の行は、 named が参照するファイルの置き場所を 指定するものです。これ以降のすべてのファイル名はここからの相対パスとなります。 すなわちディレクトリ pz/var/named 以下にあり、 フルパスで表記すれば /var/named/pz ということになります。 /var/namedLinux Filesystem Standard に準拠した正しいディレクトリ名です。

/var/named/root.hints というファイルの名前は ここで付けられています。 このファイルの中身は次のようになります。


;
; There might be opening comments here if you already have this file.
; If not don't worry.
;
; About any leading spaces in front of the lines here: remove them!
; Lines should start in a ;, . or character, not blanks.
;
; すでにこのファイルがあった場合は、ここに開始コメントがあるかも
; しれません。なくても問題はありません。
;
; 行頭に空白文字があった場合は、削除してください! 各行は ;、.
; または文字で始まります。空白で始まることはありません。
;
.                       6D  IN      NS      A.ROOT-SERVERS.NET.
.                       6D  IN      NS      B.ROOT-SERVERS.NET.
.                       6D  IN      NS      C.ROOT-SERVERS.NET.
.                       6D  IN      NS      D.ROOT-SERVERS.NET.
.                       6D  IN      NS      E.ROOT-SERVERS.NET.
.                       6D  IN      NS      F.ROOT-SERVERS.NET.
.                       6D  IN      NS      G.ROOT-SERVERS.NET.
.                       6D  IN      NS      H.ROOT-SERVERS.NET.
.                       6D  IN      NS      I.ROOT-SERVERS.NET.
.                       6D  IN      NS      J.ROOT-SERVERS.NET.
.                       6D  IN      NS      K.ROOT-SERVERS.NET.
.                       6D  IN      NS      L.ROOT-SERVERS.NET.
.                       6D  IN      NS      M.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.     6D  IN      A       198.41.0.4
B.ROOT-SERVERS.NET.     6D  IN      A       128.9.0.107
C.ROOT-SERVERS.NET.     6D  IN      A       192.33.4.12
D.ROOT-SERVERS.NET.     6D  IN      A       128.8.10.90
E.ROOT-SERVERS.NET.     6D  IN      A       192.203.230.10
F.ROOT-SERVERS.NET.     6D  IN      A       192.5.5.241
G.ROOT-SERVERS.NET.     6D  IN      A       192.112.36.4
H.ROOT-SERVERS.NET.     6D  IN      A       128.63.2.53
I.ROOT-SERVERS.NET.     6D  IN      A       192.36.148.17
J.ROOT-SERVERS.NET.     6D  IN      A       198.41.0.10
K.ROOT-SERVERS.NET.     6D  IN      A       193.0.14.129
L.ROOT-SERVERS.NET.     6D  IN      A       198.32.64.12
M.ROOT-SERVERS.NET.     6D  IN      A       202.12.27.33

このファイルには世界中のルートネームサーバを記述します。 これは時間とともに変化していくので、 ときどき更新する必要があります。更新の方法は メンテナンス の章を見てください。

named.conf の末尾の方には zone セクションがあります。 この利用法については後の章で述べるつもりですので、今のところは 以下のような内容のファイルを pz サブディレクトリに 127.0.0 という名前で作っておいてください。 (ここでもカットアンドペーストするときには 先頭のスペースを取り除くようにしてください)


$TTL 3D
@               IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                                1       ; Serial
                                8H      ; Refresh
                                2H      ; Retry
                                4W      ; Expire
                                1D)     ; Minimum TTL
                        NS      ns.linux.bogus.
1                       PTR     localhost.

keycontrol といった名前がついたセクションは、 この二つでもって、 この named がリモートから制御できることを指定しています (rndc というプログラムが用いられます)。 ここではローカルホストからの接続でなければならず、 エンコードされた秘密鍵での認証が必要になります。 この鍵はパスワードのようなものです。 rndc が機能するには、この鍵にマッチする /etc/rndc.conf が必要になります。


key rndc_key {
    algorithm "hmac-md5";
    secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};

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

見てわかるように、secret の指定は同一です。 rndc を他のマシンから使う場合は、 それらの時計は 5 分以内に会っていなければなりません。 この目的には ntp (xntpdntpdate) ソフトウェアを用いることをおすすめします。

次に、以下のような内容の /etc/resolv.confが必要です。 (同じく空白を取り除くこと!)


search subdomain.your-domain.edu your-domain.edu
nameserver 127.0.0.1

`search' で始まっている行は、 問い合わせされたホストを探すドメインの指定です。`nameserver' で始まる行は、ネームサーバのアドレス指定です。 今は自分のマシンでネームサーバを動かすので、ローカルホストを指定します。 (注: named はこのファイルを参照しません。参照するのはレゾルバです。 注2: resolv.conf ファイルiには "domain" と書かれた行があるかもしれません。 あっても問題ありませんが、 "search" と "domain" の両方を同時には用いないようにしてください。 どちらかしか効力を持ちません。)

このファイルの意味を説明しましょう。クライアントが foo の名前引きを行うと、まず最初に foo.subdomain.your-domain.edu を調べ、次に foo.your-domain.edu を試し、最後に foo を調べます。search 行にあまり多くのドメインを書くと、 すべてを調べるのに時間がかかるようになるので、 ほどほどにしておくのが良いでしょう。

この例ではあなたのマシンが subdomain.your-domain.edu にあるとしていますので、あなたのマシンの名前はおそらく your-machine.subdomain.your-domain.edu となっているでしょう。 なお search 行にはあなたの TLD (Top Level Domain, この場合は `edu') を含めるべきではありません。頻繁に接続するような特定のドメイン があれば、以下のように search 行にそのドメインを加えてもいいでしょう。 (先頭にスペースがあったら取り去るのを忘れないように。)


search subdomain.your-domain.edu your-domain.edu other-domain.com

もちろん実際には本当のドメイン名を書く必要があります。 ドメイン名の最後にはピリオドを書かないことに注意してください。 これは重要なポイントです。 ドメイン名の最後にはピリオドを書かないことに注意してください。

3.1 named を起動する

これらの準備がすんだら named を立ち上げましょう。 ダイアルアップ接続をしている人は、まず先に接続してください。 では named を起動します。 ブートスクリプトから起動する場合は /etc/init.d/named start、 named を直接起動する場合は /usr/sbin/named とします。 以前の版の BIND で似たようなことを行ったときは、 おそらく ndc を使ったことと思います。 BIND 9 では、これは rndc に変わりました。 rndc は named をリモートから制御できますが、 named を起動することはできません。 named を動かしている最中に syslog のメッセージファイル (普通は /var/adm/messages ですが、 Debian では /var/log/daemin ですし、 ディレクトリが /var/log だったり、 ファイル名が別だったりするかもしれません) を見ると (tail -f /var/adm/messages とします)、 以下のような出力が表示されるはずです:

(行末が \ の行は次の行に続きます)

Dec 23 02:21:12 lookfar named[11031]: starting BIND 9.1.3
Dec 23 02:21:12 lookfar named[11031]: using 1 CPU
Dec 23 02:21:12 lookfar named[11034]: loading configuration from \
    '/etc/named.conf'
Dec 23 02:21:12 lookfar named[11034]: the default for the \
    'auth-nxdomain' option is now 'no'
Dec 23 02:21:12 lookfar named[11034]: no IPv6 interfaces found
Dec 23 02:21:12 lookfar named[11034]: listening on IPv4 interface lo, \
    127.0.0.1#53
Dec 23 02:21:12 lookfar named[11034]: listening on IPv4 interface eth0, \
    10.0.0.129#53
Dec 23 02:21:12 lookfar named[11034]: command channel listening on \
    127.0.0.1#953
Dec 23 02:21:13 lookfar named[11034]: running

エラーメッセージがあった場合は、何か間違えているのでしょう。 named は読んでいるそのファイルを名指ししてくれるはずです。 戻ってファイルをチェックしてください。 修正が終わったら再度 named を起動してください。

さて、ここまで行ってきた設定を試してみましょう。 これまでは nslookup がテストのためのプログラムでした。 最近では dig が推奨されています。

$ dig -x 127.0.0.1
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26669
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 259200  IN      PTR     localhost.

;; AUTHORITY SECTION:
0.0.127.in-addr.arpa.   259200  IN      NS      ns.linux.bogus.

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 23 02:26:17 2001
;; MSG SIZE  rcvd: 91

と表示されれば、うまく動いているはずです。こうなるといいですね。 非常に異なった表示が出たら、やり直し、全部再チェックです。 named.conf を変更したら、 そのたびに rndc reload コマンドを実行する必要があります。

では問い合わせをしてみましょう。 あなたの近くにあるマシンの名前を引いてみましょう。 私の近く (Oslo 大学) には pat.uio.noというマシンがあります。

$ dig pat.uio.no
; <<>> DiG 9.1.3 <<>> pat.uio.no
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15574
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0

;; QUESTION SECTION:
;pat.uio.no.                    IN      A

;; ANSWER SECTION:
pat.uio.no.             86400   IN      A       129.240.130.16

;; AUTHORITY SECTION:
uio.no.                 86400   IN      NS      nissen.uio.no.
uio.no.                 86400   IN      NS      nn.uninett.no.
uio.no.                 86400   IN      NS      ifi.uio.no.

;; Query time: 651 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 23 02:28:35 2001
;; MSG SIZE  rcvd: 108

今度は、dig はあなたのマシンで動いている named に pat.uio.no を探すよう依頼します。すると named は root.hints ファイルに書かれているネームサーバの一つに 接続して、問い合わせをします。 /etc/resolv.conf に書かれているドメインすべてについて 調べる必要があるかもしれないので、結果が得られるまでに 少々時間がかかることがあります。

ここでもう一度同じ問い合わせを行うと、 次のような結果になるでしょう。

$ dig pat.uio.no

; <<>> DiG 8.2 <<>> pat.uio.no 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; QUERY SECTION:
;;      pat.uio.no, type = A, class = IN

;; ANSWER SECTION:
pat.uio.no.             23h59m58s IN A  129.240.130.16

;; AUTHORITY SECTION:
UIO.NO.                 23h59m58s IN NS  nissen.UIO.NO.
UIO.NO.                 23h59m58s IN NS  ifi.UIO.NO.
UIO.NO.                 23h59m58s IN NS  nn.uninett.NO.

;; ADDITIONAL SECTION:
nissen.UIO.NO.          23h59m58s IN A  129.240.2.3
ifi.UIO.NO.             1d23h59m58s IN A  129.240.64.2
nn.uninett.NO.          1d23h59m58s IN A  158.38.0.181

;; Total query time: 4 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:23:09 2000
;; MSG SIZE  sent: 28  rcvd: 162

こんどはずっと速かったことがはっきりわかるでしょう。 前は 0.5 秒以上かかっていましたが、今回は 4ms ですみました。 サーバからの回答がキャッシュされたのです。 キャッシュされた回答は、古くなって現状と異なってしまう可能性もありますが、 キャッシュされた回答を正しいと見なせる期間は、 回答を返したサーバの側で制御できるので、 得られた回答が正しいものである可能性は高いでしょう。

3.2 レゾルバ

標準的な C API を実装しているすべての OS には、 gethostbyname と gethostbyaddr というシステムコールが存在します。 これらは何種類かの異なる情報源から情報を取得できます。 どの情報源から取得するかは、Linux なら /etc/nsswitch.conf というファイルで設定できます (これを用いている Unix は他にもあります)。 これは長いファイルで、どのファイルから、あるいはどのデータベースから、 いろいろな種類のデータを取得するかを指定します。 通常は先頭にコメント形式の解説がありますので、読んでおきましょう。 読み終わったら `hosts:' ではじまる行を探してください。 以下のようになっているはずです。


hosts:      files dns

(先頭のスペースのことは覚えていますね? これ以上はもう言及しません。)

`hosts:' ではじまる行が無ければ、 上記のような内容を書いておいてください。 これは、プログラムはまず /etc/hosts ファイルを見に行き、 次に DNS を resolv.conf にしたがってチェックせよ、 と言っています。

3.3 おめでとう

さて、今やあなたはキャッシュ動作をする named の設定方法を知ったわけです。 ビールでもミルクでも、お好きなもので乾杯しましょう。


次のページ 前のページ 目次へ