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