DNS 設定の最初の一歩。 ダイアルアップ・ケーブルモデム・ADSL ユーザにはとっても便利です。
Red Hat や、Red Hat に関連したディストリビューションでは、
bind
パッケージ・bind-utils
パッケージ・
caching-nameserver
パッケージをインストールするだけで、
この HOWTO の最初のセクションの結果と同じものが得られます。
Debian を使っているなら bind
と bind-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/named
は Linux 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
もちろん実際には本当のドメイン名を書く必要があります。 ドメイン名の最後にはピリオドを書かないことに注意してください。 これは重要なポイントです。 ドメイン名の最後にはピリオドを書かないことに注意してください。
これらの準備がすんだら 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" を置かないことで、 この (ほんのわずかな) 可能性を知らされたわけです。 でも逆に、キャッシュが正しく動作していることがわかったことにもなります。
標準的な C API を実装しているすべての OS には、
gethostbyname と gethostbyaddr というシステムコールが存在します。
これらは何種類かの異なる情報源から情報を取得できます。
どの情報源から取得するかは、Linux なら
/etc/nsswitch.conf
というファイルで設定できます
(これを用いている Unix は他にもあります)。
これは長いファイルで、どのファイルから、あるいはどのデータベースから、
いろいろな種類のデータを取得するかを指定します。
通常は先頭にコメント形式の解説がありますので、読んでおきましょう。
読み終わったら `hosts:
' ではじまる行を探してください。
以下のようになっているはずです。
hosts: files dns
(先頭のスペースのことは覚えていますね? これ以上はもう言及しません。)
`hosts:
' ではじまる行が無ければ、
上記のような内容を書いておいてください。
これは、プログラムはまず /etc/hosts
ファイルを見に行き、
次に DNS を resolv.conf
にしたがってチェックせよ、
と言っています。
さて、今やあなたはキャッシュ動作をする named の設定方法を知ったわけで す。ビールでもミルクでも、お好きなもので乾杯しましょう。