## page was renamed from DNS/djbdnsを動かしてみる/DNSサーバの設定法 ## page was renamed from DNS/運用/djbdnsを動かしてみる/DNSサーバの設定法 ## page was renamed from DNS/実装/djbdns/djbdnsを動かしてみる/DNSサーバの設定法 djbdnsを動かしてみる/ = DNSサーバの設定法 = DNS関連ドキュメントを整理する上でとても参考になるので、少しずつwikiに移す。-- ToshinoriMaeno <> https://cr.yp.to/djbdns/run-server.html {{{ D. J. Bernstein [Translated into Japanese by MAENO Toshinori] Internet publication djbdns }}} <> IP アドレスを公開するためのコンピュータの設定法です。 BIND DNS サーバから乗り換えようとしているなら、ここではなく、'''BINDからの乗換え''' の説明に従ってください。 == サーバを設定する == ここの方法はあなたがすでに daemontools と djbdnsを インストール済みであり、 svscan が動作中であることを前提にしています。 {{{ 1. root で、 UNIX アカウント Gtinydns と Gdnslogを作る。 }}} {{{ 2. root で、 /etc/tinydns サービスディレクトリを作る。 いっしょに DNS サーバの IP アドレスを設定する。 tinydns-conf Gtinydns Gdnslog /etc/tinydns 1.8.7.200 }}} このディレクトリにはログと構成設定ファイルがあり、 後で変更できます。 IPアドレスはこのコンピュータのものでなければなりません。 IP アドレスでは DNSキャッシュなど他の port-53 サービスを行っていてはいけません。 一台のコンピュータで DNS サーバと DNS キャッシュを一緒に動かせるのは それらが別のIPアドレス上で動いているときに限ります。 小規模ネットワークでの標準的設定法では DNS キャッシュを 127.0.0.1 や 10.53.0.1などのprivate アドレスで動かし、 DNS サーバは public アドレスで動かすというものです。 {{{ 3. root で、 svscan に新サービスを通知する。 svstat を使って、サービスが動きだしたことを確認する: ln -s /etc/tinydns /service sleep 5 svstat /service/tinydns }}} 4. このページで以降に説明されている方法で DNS データを設定する。 5. 公開webページにあなたのDNSサーバが djbdns を使っていることをのせてください。 そうすれば、2,3ヶ月のうちには Googleで powered djbdnsという検索をすると。あなたのページが見つかるでしょう。 これらの公開表明は他の人達が djbdns を使うこと、djbdnsのサポートサービスを提供すること、 関連ツールを開発することなどのはげましになります。 さらに、 Bernstein Writing Fund への寄付も考慮していただきくたくお願いいたします。 }}} == DNS サービスの複製を作る == 第一の DNS サーバと同じ情報を提供するために 第二コンピュータを DNS サーバとして設定する方法です。 インターネット内の DNS caches は両方のサーバを順不同で試しますので、 どちらかが壊れてしまっていてもクライアントは返事を受け取ることができます。 DNS サーバは 2 台設定しなければならないというものではありません。 DNS サーバはウェッブサーバやメイルサーバなどよりも多重にする必要はありません。 もしウェッブサーバやメイルサーバ、DNS サーバのために一台のコンピュータしか ないのなら、 第二の DNS サーバを設定するなんてばかげています。 (第三者 DNS サーバ はほとんどすべての場合、よくない考えです。) しかしながら、いろんなサービスをする大規模サイトを運営しているなら、 DNS サーバを複数設定すべきです。 例のために、 第一の DNS サーバは IP アドレス 1.8.7.200 で動作し、 第二の DNS サーバは IP アドレス 1.8.7.201 で動作するものとして 説明します。 {{{ 1. 第二のコンピュータで、 root で、 UNIX アカウント Gtinydns と Gdnslogを作る。 2. 第二のコンピュータで、 root で、 /etc/tinydns サービスディレクトリを作る。 いっしょに第二の サーバの IP アドレスを設定する。 tinydns-conf Gtinydns Gdnslog /etc/tinydns 1.8.7.201 3. 第一のコンピュータで、 root で、 /service/tinydns/root/Makefile を編集して、 /service/tinydns/root/data を第一のコンピュータから第二のコンピュータへ複写するようにする。 remote: data.cdb rsync -az -e ssh data.cdb 1.8.7.201:/service/tinydns/root/data.cdb data.cdb: data /usr/local/bin/tinydns-data もし rsync がなければ、こうする: remote: data.cdb scp data.cdb 1.8.7.201:/service/tinydns/root/data.cdb.tmp ssh 1.8.7.201 mv /service/tinydns/root/data.cdb.tmp \ /service/tinydns/root/data.cdb data.cdb: data /usr/local/bin/tinydns-data これで 第一のコンピュータでの変更はすべて第二のコンピュータへ 複製される。 4. 第二のコンピュータで、rootで、 /service/tinydns/root/data を編集して、 DNS データが 第一のコンピュータから第二のコンピュータへ複写されている ことを注記しておく: # Do not edit data on this computer! data.cdb is copied from 1.8.7.200. # The following line protects data.cdb by stopping make. 9 5. 第二のコンピュータで、rootで、 svscan に新サービスを通知する。 svstat を使って、サービスが動きだしたことを確認する: ln -s /etc/tinydns /service sleep 5 svstat /service/tinydns }}} == 委譲を受ける == 名前を委譲してもらって、あなたの DNS サーバで扱うようにするための 二つのとても重要な作業があります。 この二つの作業段階を詳しく説明した別のウェッブページを作りました。 .com, .net, .org, .at, .br, .ch, .de, .dk, .fr, .hu, .it, .nl, .no, .ru, .us, .in-addr.arpa, local names. この他のトップレベルドメインとしては .aero, .biz, .coop, .edu, .gov, .info, .int, .mil, .museum, .name などがあります。 最初にあなたのサーバが委譲を受けられるようにする必要があります。 ドメイン(名)に責任を持つことを知らなければ、 あなたのサーバは問合せに答えません。 以下のコマンドにより、 末尾が heaven.af.mil と 7.8.1.in-addr.arpa であるような名前に責任があることをあなたのサーバに教えます: {{{ cd /service/tinydns/root ./add-ns heaven.af.mil 1.8.7.200 ./add-ns heaven.af.mil 1.8.7.201 ./add-ns 7.8.1.in-addr.arpa 1.8.7.200 ./add-ns 7.8.1.in-addr.arpa 1.8.7.201 make }}} これらのコマンドは以下のこともサーバに知らせています。 a.ns.heaven.af.mil が IP アドレス 1.8.7.200 を持ち、 b.ns.heaven.af.mil が IP アドレス 1.8.7.201 を持ち、 両方が heaven.af.milの DNS サーバであることを公開する。 a.ns.7.8.1.in-addr.arpa が IP アドレス 1.8.7.200 を持ち、 b.ns.7.8.1.in-addr.arpa が IP アドレス 1.8.7.201 を持ち、 これらが 7.8.1.in-addr.arpa の DNS サーバであることを公開する。 第二の作業は親サーバに名前をあなたのサーバへ委譲してもらうことです。 インターネット上のキャッシュがあなたのネームサーバに 名前を問合せるためには その名前があなたのサーバに委譲されていなければなりません。 例でなら、 af.milの管理者は heaven.af.mil を IP アドレス 1.8.7.200 を持つサーバ a.ns.heaven.af.milと IP アドレス 1.8.7.201 を持つサーバ b.ns.heaven.af.milと に委譲する必要があります。 そして、 8.1.in-addr.arpaの管理者は 7.8.1.in-addr.arpa を IP アドレス 1.8.7.200 を持つサーバ a.ns.7.8.1.in-addr.arpaと IP アドレス 1.8.7.201 を持つサーバ b.ns.7.8.1.in-addr.arpaと に委譲する必要があります。 BIND の不良 (日本語訳) をひき起さないために、 同じ IP アドレスの別の名前ではなく、 親サーバも a.ns, b.ns などの同じ名前を 使うようにしなければなりません。 tinydns はこれらとは異なる名前を使うように設定できますが、 その場合には親サーバもそれらの名前を使う必要があります。 == コンピュータのアドレスを公開する == ひとたび、heaven.af.milのような名前があなたのサーバに委譲されたら、 heaven.af.milや 末尾が .heaven.af.mil である名前の IP アドレスを 決められます。 二種類の名前を設定するのが普通に行われています: コンピュータ名: 各コンピュータに名前を付けて、 その名前と IP アドレスを用いて、add-hostを実行します。 さらに、コンピュータにその IP アドレスを 受けもつ(respond)ように指示しなくては なりません。 サービス名: 各サービスに対して、(www, pop, など), サービス名と IP アドレス を用いて、add-aliasを実行します。 コンピュータ名とサービス名とを区別することで あとでコンピュータ間で移動させようとした時に役立ちます。 例えば、あなたはheaven.af.milの管理者だったとします; 三台のコンピュータがあって、それらの IP アドレスは 1.8.7.4, 1.8.7.5, 1.8.7.6 だとします; ウェブサーバは一台目のコンピュータで動かします; 一台目のコンピュータでFTP サーバも動かします; コンピュータには lion, tiger, bear という名前を付けることにして、 以下のコマンドを実行します: {{{ cd /service/tinydns/root ./add-host lion.heaven.af.mil 1.8.7.4 ./add-host tiger.heaven.af.mil 1.8.7.5 ./add-host bear.heaven.af.mil 1.8.7.6 ./add-alias www.heaven.af.mil 1.8.7.4 ./add-alias ftp.heaven.af.mil 1.8.7.4 make }}} add-host と add-aliasプログラムは /service/tinydns/root/data ファイルを編集します。 ファイルは tinydns-data 形式 をしています。 make は tinydns-data プログラムを実行し、 tinydns に新しい情報のことを知らせます。 なにか不都合がおきたら、 tinydns-data はエラーメッセージを出力し、 tinydns は古い情報を提供し続けます。 さて、インターネットの誰かが lion.heaven.af.milや www.heaven.af.mil、 ftp.heaven.af.milのアドレスを探すと IP アドレス 1.8.7.4 が返ります。 1.8.7.4 に対応するコンピュータの名前を探すと lion.heaven.af.milが返ります。 add-host と add-aliasを使う代わりに /service/tinydns/root/data を直接編集して、 以下の行を追加することもできます。: {{{ =lion.heaven.af.mil:1.8.7.4 =tiger.heaven.af.mil:1.8.7.5 =bear.heaven.af.mil:1.8.7.6 +www.heaven.af.mil:1.8.7.4 +ftp.heaven.af.mil:1.8.7.4 }}} data を直接編集するのではなく、 add-host と add-alias プログラムを 使うのには ふたつの理由があります。 第一は add-hostによって、 すでに使ったコンピュータ名を再度使ってしまったり、 IP アドレスを二重に使ってしまったりすることを防げます。 第二は突然の停電でdata が壊れることがないように するには以下の手順が必要になります。 data.tmpにコピーし、data.tmpを編集して、 data.tmp をディスクに sync してから、 mv を使って、data.tmp を dataに リネームします; add-host と add-alias はこれらすべてを 自動的に行います。 名前の選び方の続き IP アドレス ひとつについて一回だけ、 異なるコンピュータ名を各 IP アドレス を与えるように add-hostを実行すべきです。 add-alias はコンピュータ名に対して実行してはいけません; ひとつのコンピュータ名にはただひとつのIP アドレスを 対応させるべきです。 コンピュータ名を付けるときのいくかの推奨候補です: 動物: lion, tiger, bear, など しかしもしあなたが動物のことを学ぶ生物研究者ならこれらは 使ってはいけません! コンピュータ名は他の文脈では通常使わない単語にすべきです。 惑星: mercury, venus, mars, など But don't use these if you're an astronomer! 神々: zeus, athena, hermes, など 元素: hydrogen, helium, lithium, など 花: tulip, rose, lilac, など コンピュータに二つめの IP アドレスを追加するときには、 あたかも第二のIP アドレスが実際には別のコンピュータであるかのように add-host 新しい名前を使う方が普通はいい考えでしょう: ./add-host zebra.heaven.af.mil 1.8.7.240 こうすれば、 その IP アドレスが別のコンピュータに本当に移動しても なにも変更する必要がないでしょうから。 == コンピュータのアドレスを調べる == tinydns が名前に対して正しい IP アドレス を返しているか を系統的に確認する方法です: 例えば、www.heaven.af.milの IP アドレス が 1.8.7.4 となっているかどうか。 第一に/service/tinydns/root/data 内のアドレスが tinydns-data 形式になっているかを確認する: +www.heaven.af.mil:1.8.7.4 IP アドレスは +, =, @, ., & 行を使って割付けできます。 第二に tinydns-get を使って、 アドレスが /service/tinydns/root/data.cdbにあることを 確認する: {{{ cd /service/tinydns/root tinydns-get a www.heaven.af.mil }}} 以下の行のような出力があるでしょう。 answer: www.heaven.af.mil 86400 A 1.8.7.4 ただし、数はおそらく 86400 ではないでしょう。 この答が得られなかったり、古かったりするときのよくある理由: dataを変更したあとにmake を実行していない; data内に関連ネームサーバを示す . 行 ( または Z 行) がない。 逆引きを確認したければ、 a www.heaven.af.milを ptr 4.7.8.1.in-addr.arpaで置きかえます。 第三に tinydns が使う IP アドレスが コンピュータのアドレスであることを確認する: {{{ cat /service/tinydns/env/IP netstat -n -i }}} 第四では tinydns サービスが起動されていることを確認する: svstat /service/tinydns tinydns-get が 512 バイト以上の返事をするなら、 TCP サービスが必要になる; その時は axfrdns サービスが起動されているか確認する。 第五に tinydns に名前を問い合わせる: dnsq a www.heaven.af.mil 1.8.7.200 dnsq a www.heaven.af.mil 1.8.7.201 ここの 1.8.7.200 と 1.8.7.201 は あなたの DNS サーバの IP アドレスです。 dnsq の出力は前述のtinydns-getの出力と 一致していなければなりません。 第六に DNS cache にアドレスを問い合わせる: dnsqr a www.heaven.af.mil dnscache がアドレスを見つけられなかったら、 ほとんど確実に親サーバが関連ドメインをあなたの tinydnsに委譲していないからです。 /service/dnscache/log/main/current のログを調べて、 dnscache がどのサーバに問い合わせているか、 どういう情報を送っているかを見なさい。 全体をデバッグスキャンするには dnstraceを使いなさい。 DNS サーバをテストするのに nslookupを使ってはなりません。 == メイルサーバのアドレスを公開する == インターネットのメイル配送エージェント(MTA)が heaven.af.milへメイルを送りたい場合、 heaven.af.mil の IP アドレス を検索します。 そして、その IP アドレスの SMTP サーバに接続しようとします。 add-mx を使って、別の IP アドレスを設定できます: cd /service/tinydns/root ./add-mx heaven.af.mil 1.8.7.193 make (mx とは メイル中継機 "mail exchanger"を示しています) add-mxを使う代わりに data を直接編集して以下の行を追加してもよろしい: @heaven.af.mil:1.8.7.193:a If you add several mail servers for heaven.af.milに対して、複数のメイルサーバを設定するなら、 最初のものには a、次には b という風にしなさい。 add-mx はこれを自動的に行います。 == 他のサーバに委譲する方法 == ある名前を子供のサーバに委譲するには 委譲すべき名前と子供サーバの IP アドレスとともに add-childnsを使います。 cd /service/tinydns/root ./add-childns elysium.heaven.af.mil 1.2.3.144 make add-childnsを使うのではなく、 data を直接編集して、以下の行を加えるのでもかまいません。 &elysium.heaven.af.mil:1.2.3.144:a heaven.af.mil をいくつかの IP アドレスに委譲するなら、 最初は a で、次は b というようにします。 add-childns はこれを自動的に行います。 デフォルトのサーバ名 a.ns.elysium.heaven.af.mil 以外の名前を選択することもできます。 BIND の不良 (日本語訳) をひき起さないために、 親サーバも子サーバと同じ名前を使うようにしなければなりません。 例えば、子サーバが以下のように指定しているとき、 .elysium.heaven.af.mil:1.2.3.144:dns1.elysium.heaven.af.mil 親サーバも同じ名前を使わなくてはなりません: &elysium.heaven.af.mil:1.2.3.144:dns1.elysium.heaven.af.mil 他のdata 行によって その名前にすでに IP アドレス が割付けられている場合、 IP アドレスを省略します。 &elysium.heaven.af.mil::dns1.elysium.heaven.af.mil == 複数の独立した DNS サーバを設定する == (異った IP アドレスでなら) 異ったデータファイルを持つ複数のサーバを動かすことができます。 例えば、 heaven.af.mil の情報を公表する二台のサーバと panic.mil の情報を公表する二台のサーバと 合わせて四台のサーバを設定したとしましょう。 heaven.af.milについての変更は第一のサーバで行い、 第二のサーバにコピーされるとします。。 Changes to panic.milについての変更は第三のサーバで行い、 第四のサーバにコピーされるとします。 いうまでもないことですが、一台のサーバで heaven.af.mil と panic.milの両方を扱うこともできます。 しかしながら、ギガバイトもある DNS データを持っているなら、 複数の独立したサーバにデータを分割して動かすことを検討すべきです。 == 独立した DNS サーバにゾーンをひとつ移す == IP アドレス 1.8.7.200 と 1.8.7.201 の DNS サーバ にあるheaven.af.mil ゾーンを IP アドレス 1.8.11.50 と 1.8.11.51 の 別の DNS サーバへ移す方法を 説明します。 {{{ 1. heaven.af.mil のデータを旧サーバから新サーバへコピーする。 2. 新サーバ上で、a.ns.heaven.af.mil の IP アドレスを 1.8.7.200 から 1.8.11.50 へ変更するために /service/tinydns/root/data内の .heaven.af.mil:1.8.7.200:a を .heaven.af.mil:1.8.11.50:a に書きかえる。 同様に b.ns.heaven.af.mil の IP アドレスを 1.8.7.201 から 1.8.11.51 へ変更する。 make を実行して、新サーバが新しい IP アドレスを返答するようにする。 3. 親サーバでも同様の修正をする。 4. 旧サーバでも同様の修正をする。 キャッシュはいつまでも旧サーバに問合せ続けるかもしれないので、 この修正は重要である。 キャッシュには親サーバに問い合わせて整合性をチェックする義務はないので。 5. キャッシュが旧サーバにアクセスしなくなるまで、2、3 日待つ。 この間に heaven.af.mil のデータを変更したときには 旧サーバでも同様の修正をすること。 6. heaven.af.milのデータを旧サーバから削除する。 これで出来上がり。 }}} 2003-08-13 訳:前野年紀