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

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

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

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

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

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


// Config file for caching only name server

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;
};

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 というファイルの名前は ここで付けられています。 /var/named/root.hints ファイルの内容は 以下のようにしておきます。 (この文書の電子版からこのファイルをカットアンドペースト する場合は、実際のファイルでは先頭にスペースが入っては いけないことに注意してください。 言い換えると、すべての行が空白以外の文字ではじまっていなければいけません。 文書処理ソフトによっては、行の最初にスペースを入れてしまうことがあるので、 ちょっと困ることがあります。 その場合は先頭のスペースを取り除いて使ってください)


;
; There might be opening comments here if you already have this file.
; If not don't worry.
;
.                       6D IN NS        M.ROOT-SERVERS.NET.
.                       6D IN NS        I.ROOT-SERVERS.NET.
.                       6D IN NS        E.ROOT-SERVERS.NET.
.                       6D IN NS        D.ROOT-SERVERS.NET.
.                       6D IN NS        A.ROOT-SERVERS.NET.
.                       6D IN NS        H.ROOT-SERVERS.NET.
.                       6D IN NS        C.ROOT-SERVERS.NET.
.                       6D IN NS        G.ROOT-SERVERS.NET.
.                       6D IN NS        F.ROOT-SERVERS.NET.
.                       6D IN NS        B.ROOT-SERVERS.NET.
.                       6D IN NS        J.ROOT-SERVERS.NET.
.                       6D IN NS        K.ROOT-SERVERS.NET.
.                       6D IN NS        L.ROOT-SERVERS.NET.
;
M.ROOT-SERVERS.NET.     6D IN A         202.12.27.33
I.ROOT-SERVERS.NET.     6D IN A         192.36.148.17
E.ROOT-SERVERS.NET.     6D IN A         192.203.230.10
D.ROOT-SERVERS.NET.     6D IN A         128.8.10.90
A.ROOT-SERVERS.NET.     6D IN A         198.41.0.4
H.ROOT-SERVERS.NET.     6D IN A         128.63.2.53
C.ROOT-SERVERS.NET.     6D IN A         192.33.4.12
G.ROOT-SERVERS.NET.     6D IN A         192.112.36.4
F.ROOT-SERVERS.NET.     6D IN A         192.5.5.241
B.ROOT-SERVERS.NET.     6D IN A         128.9.0.107
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

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

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.

次に、以下のような内容の /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 を立ち上げましょう。 ダイアルアップ接続をしている人は、まず先に接続してください。 `ndc start' と入力してリターンを押してください。 オプションは指定しません。 うまくいかない場合は `/usr/sbin/ndc start' としてみましょう。 これもうまくいかない場合は Q & A の章を 見て下さい。 named を動かしている最中に syslog のメッセージファイル (普通は /var/adm/messages ですが、 ディレクトリが /var/log だったり、 ファイル名が syslog だったりするかもしれません) を見ると (tail -f /var/adm/messages とします) 、 以下のような出力が表示されるはずです:

(\ で終わっている行は、次の行に続いていることを表します)

Dec 15 23:53:29 localhost named[3768]: starting.  named 8.2.2-P7 \
                Fri Nov 10 04:50:23 EST 2000 ^Iprospector@porky.\
                devel.redhat.com:/usr/src/bs/BUILD/bind-8.2.2_P7/\
                src/bin/named
Dec 15 23:53:29 localhost named[3768]: hint zone "" (IN) loaded\
                (serial 0)
Dec 15 23:53:29 localhost named[3768]: Zone "0.0.127.in-addr.arpa"\
                (file pz/127.0.0): No default TTL set using SOA\
                minimum instead
Dec 15 23:53:29 localhost named[3768]: master zone\
                "0.0.127.in-addr.arpa" (IN) loaded (serial 1)
Dec 15 23:53:29 localhost named[3768]: listening on [127.0.0.1].53 (lo)
Dec 15 23:53:29 localhost named[3768]: listening on [10.0.0.129].53\
                (wvlan0)
Dec 15 23:53:29 localhost named[3768]: Forwarding source address is\
                [0.0.0.0].1034
Dec 15 23:53:29 localhost named[3769]: Ready to answer queries.

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

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

$ dig -x 127.0.0.1       

; <<>> DiG 8.2 <<>> -x 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUERY SECTION:
;;      1.0.0.127.in-addr.arpa, type = ANY, class = IN

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

;; AUTHORITY SECTION:
0.0.127.in-addr.arpa.   1D IN NS        ns.penguin.bv.

;; Total query time: 30 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:16:12 2000
;; MSG SIZE  sent: 40  rcvd: 110

と表示されれば、うまく動いているはずです。こうなるといいですね。 何か他の表示が出たら、やり直し、全部再チェックです。 named.conf を変更したら、そのたびに ndc restart コマンドで named を再起動する必要があります。

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

$ 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 aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; QUERY SECTION:
;;      pat.uio.no, type = A, class = IN

;; ANSWER SECTION:
pat.uio.no.             1D IN A         129.240.130.16

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

;; ADDITIONAL SECTION:
nissen.uio.no.          1D IN A         129.240.2.3
ifi.uio.no.             1H IN A         129.240.64.2
nn.uninett.no.          1D IN A         158.38.0.181

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

今度は、dig はあなたのマシンで動いている named に pat.uio.no を探すよう依頼します。すると named は root.hints ファイルに書かれているネームサーバの一つに 接続して、問い合わせをします。 /etc/resolv.conf に書かれているドメインすべてについて 調べる必要があるかもしれないので、結果が得られるまでに 少々時間がかかることがあります。 "flags" 行の "aa" に注目してください。 これは結果が「信頼できる (authoritative)」ことを示しています。 つまり、信頼できるサーバからの最新の結果である、と言うことです。 なにが「信頼できる」のかはのちほど説明します。

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

$ 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

今度は結果に "aa" フラグがないことにご注目ください。 これが意味するのは、今回この情報はすでにキャッシュに入っていたので、 named はネットワーク経由で調べたのではない、ということです。 でもキャッシュの情報はもしかすると古いことがあるかもしれません。 ですからここでは "aa" を置かないことで、 この (ほんのわずかな) 可能性を知らされたわけです。 でも逆に、キャッシュが正しく動作していることがわかったことにもなります。

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 の設定方法を知ったわけで す。ビールでもミルクでも、お好きなもので乾杯しましょう。


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