以下のURLから、最新版のパッケージをダウンロードする。2005年6月11日現在は、bind-9.3.1 が最新であるので、そちらを使用する。
ダウンロードが完了したら、パッケージを展開する。
$ tar zxpvf bind-9.3.1.tar.gz
configure、make、make install を行なう。特に設定すべきオプションもなく、簡単にインストールは完了する。
$ cd bind-9.3.1 $ ./configure (中略) $ make (中略) # make install
それなりに時間が掛かる。5分くらいで終了する。
BINDを操作するためのユーザーを作成する。既に作成済みの場合は、不要である。
# groupadd named # useradd -g named -d /var/named -s /bin/false named
BINDのホームディレクトリを作成する。BINDのユーザー同様、作成済みの場合は不要である。OSインストール時に、DNSサーバがインストールされていれば、この辺りは全て設定されていると思われる。
# mkdir /var/named/ # chown named.named /var/named/
BINDの肝は、全て設定にある。参考にしたサイトを紹介する。
全ての基本。各設定ファイルの名前や場所を記載する。場所は、/etc/named.conf となる。セミコロンの付け忘れには、注意する。セミコロンを付け忘れた箇所の設定内容は、反映されない。
options { directory "/var/named"; // 自分で解決出来ない場合は、プロバイダのDNSへ尋ねに行く forwarders { 210.XXX.XX.XX; 210.XXX.XX.XX; }; }; zone "." IN { // キャッシュサーバの設定 type hint; file "named.ca"; }; zone "localhost" IN { // ローカルホストの正引き設定 type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { // ローカルホストの逆引き設定 type master; file "named.local"; allow-update { none; }; }; zone "omoshiro-joho.com" IN { // omoshiro-joho.comの正引き設定 type master; file "omoshiro-joho.com"; }; zone "0.168.192.in-addr.arpa" IN { // omoshiro-joho.comの逆引き設定 type master; file "0.168.192.in-addr.arpa"; };
ドメイン名以下の各ホストに対し、IPアドレスを設定する。設定するファイルは、/var/named/omoshiro-joho.com である。ドメイン名は、最後をドットで終えることに注意する。
$TTL 86400 // ネームサーバと管理者のメールアドレス(@を.に変えている) @ IN SOA pokota.omoshiro-joho.com. root.pokota.omoshiro-joho.com. ( 42 ; serial (d. adams) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum IN NS pokota.omoshiro-joho.com. // ネームサーバ IN A 192.168.0.3 // サブドメインを付けない場合の対応IPアドレス router IN A 192.168.0.1 // IPアドレスとホスト名の対応付け pokota IN A 192.168.0.3 miyu IN A 192.168.0.5 princess IN A 192.168.0.4 ftp IN CNAME pokota // 別名 dns IN CNAME pokota
A | 実際のアドレスを表している |
NS | ネームサーバを表している |
CNAME | 別名を表している |
IPアドレスからホスト名を設定する。設定するファイルは、/var/named/0.168.192.in-addr.arpa である。ドメイン名は、最後をドットで終えることに注意する。
$TTL 86400 @ IN SOA pokota.omoshiro-joho.com. root.pokota.omoshiro-joho.com. ( 1997022700 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire 86400 ) ; Minimum IN NS pokota.omoshiro-joho.com. // ネームサーバ IN PTR omoshiro-joho.com. // 解決するドメイン IN A 255.255.255.0 // サブネットマスク 1 IN PTR router.omoshiro-joho.com. // 192.168.0.1 のホスト名を設定 3 IN PTR pokota.omoshiro-joho.com. // 192.168.0.3 のホスト名を設定 5 IN PTR miyu.omoshiro-joho.com. // 192.168.0.5 のホスト名を設定 4 IN PTR princess.omoshiro-joho.com. // 192.168.0.4 のホスト名を設定
PTR | 逆引きを表す |
既存設定ファイルの内容が、DNSの内容と衝突しないように、変更を行なう。特にhostsファイルでは、自身のホスト名の設定を取り消す。詳細な内容については、上述で紹介したリンク先参照とする。
マシンを再起動して、設定内容を確実に反映させる。その後、BINDを起動する。そういえば、結局 named ユーザーではなく、root で起動してる(汗。
# service named start
もしくは、
# /usr/local/sbin/named
これで、試しにブラウザから、miyu.omoshiro-joho.com と打ってみて、対象ホストのWebサイトが表示されたら成功である。外部のページも見れるか確認をする。見れない場合は、named.conf の forwarders 箇所を見直す。
もし、うまく行った場合も、/var/log/messages の出力を見て、問題がないか確認する。
続いて別ホストから、このDNSサーバを参照できるようにする。各クライアントから直接DNSサーバを指定しても良いが、ルータに指定して各クライアントがそれを参照する形の方が、後々便利である。
この際、既存のDNSサーバは、プライマリ・セカンダリ共に、削除をしておく(まだセカンダリDNSを作成していないので、空白にしておく)。プライマリが生きていれば、セカンダリの指定が何であろうが問題ないと思ったが、そうでもないようだ。ルータのDNSに、プライマリを自前のDNS、セカンダリを既存のDNSにしたところ、DNSサーバ以外の内部クライアントから、内部DNSが参照できなくなった(外部は参照できる)。ルータ上のセカンダリDNS指定を削除することで、この現象は解決した。
DNSの動作テストには、dig (/usr/local/bin/dig) というコマンドを利用する。
まずは、内部DNSで、ドメインを正引きできるか確認する。
[bokupi@pokota bokupi]$ /usr/local/bin/dig miyu.omoshiro-joho.com ; <<>> DiG 9.3.1 <<>> miyu.omoshiro-joho.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35250 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;miyu.omoshiro-joho.com. IN A ;; ANSWER SECTION: miyu.omoshiro-joho.com. 86400 IN A 192.168.0.5 ;; AUTHORITY SECTION: omoshiro-joho.com. 86400 IN NS pokota.omoshiro-joho.com. ;; ADDITIONAL SECTION: pokota.omoshiro-joho.com. 86400 IN A 192.168.0.3 ;; Query time: 5 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Jun 18 13:45:37 2005 ;; MSG SIZE rcvd: 93
続いて、内部DNSで、IPアドレスを逆引きできるか確認する。
[bokupi@pokota bokupi]$ /usr/local/bin/dig -x 192.168.0.5 ; <<>> DiG 9.3.1 <<>> -x 192.168.0.5 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2330 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;5.0.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 5.0.168.192.in-addr.arpa. 86400 IN PTR miyu.omoshiro-joho.com. ;; AUTHORITY SECTION: 0.168.192.in-addr.arpa. 86400 IN NS pokota.omoshiro-joho.com. ;; ADDITIONAL SECTION: pokota.omoshiro-joho.com. 86400 IN A 192.168.0.3 ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Jun 18 13:48:25 2005 ;; MSG SIZE rcvd: 115
続いては、外部のドメインを正引きできるか確認する。これは、forwarder が正しく機能していることの確認となる。
[bokupi@pokota bokupi]$ /usr/local/bin/dig www.yahoo.co.jp ; <<>> DiG 9.3.1 <<>> www.yahoo.co.jp ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61227 ;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;www.yahoo.co.jp. IN A ;; ANSWER SECTION: www.yahoo.co.jp. 125 IN A 202.93.91.214 www.yahoo.co.jp. 125 IN A 202.93.91.215 www.yahoo.co.jp. 125 IN A 202.93.91.216 www.yahoo.co.jp. 125 IN A 202.93.91.217 www.yahoo.co.jp. 125 IN A 202.93.91.218 www.yahoo.co.jp. 125 IN A 202.93.91.219 www.yahoo.co.jp. 125 IN A 202.229.198.216 www.yahoo.co.jp. 125 IN A 202.229.199.136 www.yahoo.co.jp. 125 IN A 202.229.199.147 www.yahoo.co.jp. 125 IN A 203.141.35.113 www.yahoo.co.jp. 125 IN A 210.80.242.236 www.yahoo.co.jp. 125 IN A 210.80.243.14 www.yahoo.co.jp. 125 IN A 210.81.3.241 www.yahoo.co.jp. 125 IN A 210.81.150.5 ;; AUTHORITY SECTION: yahoo.co.jp. 880 IN NS dnsg01.yahoo.co.jp. yahoo.co.jp. 880 IN NS dnsn201.yahoo.co.jp. ;; ADDITIONAL SECTION: dnsg01.yahoo.co.jp. 15541 IN A 211.14.12.10 dnsn201.yahoo.co.jp. 48601 IN A 202.229.198.120 ;; Query time: 46 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Jun 18 13:50:31 2005 ;; MSG SIZE rcvd: 332
続いては、外部のIPを逆引きできるか確認する。これは、forwarder が正しく機能していることの確認となる。
[bokupi@pokota bokupi]$ /usr/local/bin/dig -x 202.93.91.214 ; <<>> DiG 9.3.1 <<>> -x 202.93.91.214 ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12601 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;214.91.93.202.in-addr.arpa. IN PTR ;; ANSWER SECTION: 214.91.93.202.in-addr.arpa. 900 IN PTR i.top.vip.bbt.yahoo.co.jp. ;; AUTHORITY SECTION: 91.93.202.in-addr.arpa. 900 IN NS dnsg01.yahoo.co.jp. 91.93.202.in-addr.arpa. 900 IN NS dnsn201.yahoo.co.jp. ;; ADDITIONAL SECTION: dnsg01.yahoo.co.jp. 900 IN A 211.14.12.10 dnsn201.yahoo.co.jp. 900 IN A 202.229.198.120 ;; Query time: 33 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Sat Jun 18 13:51:44 2005 ;; MSG SIZE rcvd: 158
参考にしたサイトは以下の通り。
内部向けの設定に、外部向け正引きの設定を追加する。具体的に必要となるのは、次の3点。
// generated by named-bootconf.pl // ローカルネットの範囲を指定する acl localnet { 192.168.0.0/24; 127.0.0.1; }; options { directory "/var/named"; /* * If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND 8.1 uses an unprivileged * port by default. */ // query-source address * port 53; // 問い合わせ元制限(デフォルとして指定) allow-query { localnet; // 冒頭で指定している }; // 再帰検索制限(キャッシュサーバ利用) allow-recursion { localnet; }; // 転送先制限 allow-transfer { localnet; }; forwarders { 192.168.0.1; // ルータ 210.135.90.1; // プロバイダのプライマリDNS 210.135.65.2; // プロバイダのセカンダリDNS }; }; logging { // 所定のエラーログの出力を、抑制する category lame-servers { null; }; }; // 内部向けの設定(view に続く文字列は、何でも良い) view "lan" { // マッチするのは、LAN環境のクライアントのみ match-clients { localnet; }; // // a caching only nameserver config // zone "." IN { type hint; file "named.ca"; }; zone "localhost" IN { type master; file "localhost.zone"; allow-update { none; }; }; zone "0.0.127.in-addr.arpa" IN { type master; file "named.local"; allow-update { none; }; }; zone "omoshiro-joho.com" IN { type master; file "omoshiro-joho.com"; }; zone "0.168.192.in-addr.arpa" IN { type master; file "0.168.192.in-addr.arpa"; }; }; // 外部向けの設定 view "wan" { // 全てのクライアントにマッチ // (ただし、LAN環境のクライアントは、先に書かれた"lan"viewで処理される) match-clients { any; }; // 外部向けドメイン正引きの設定 zone "omoshiro-joho.com" IN { type master; file "omoshiro-joho.com.global"; allow-query { any; }; }; };
上側に記述されたviewから順番に、match-clients で指定された条件にマッチする view を探していく。
$TTL 86400 @ IN SOA omoshiro-joho.com. root.pokota.omoshiro-joho.com. ( 42 ; serial (d. adams) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum IN NS omoshiro-joho.com. @ IN A 61.122.77.57
基本的に内部向けの正引き設定と同じである。今回は、サブドメインを何も指定しないため、A レコードは、@(ホスト名なしを意味する)に対して、グローバルIPを割り当てればOK。
DNSの動作テストには、dig (/usr/local/bin/dig) というコマンドを利用する。特に外部向けDNSは、正しく動作しないと自ドメインへのアクセスが不能になり、多大な影響をもたらすため、確実に動作テストを履行する。
$ /usr/local/bin/dig @61.122.77.57 omoshiro-joho.com
しかし、ルータなどを介して NAT を行なっている場合、正しい結果は得られない。ルータのWAN側IPアドレスである 61.122.77.57 を、LAN側IPアドレスとしてしまうためである。そこで、このコマンドは、外部から発行する必要がある。無料でそのようなサービスを実施しているサイトがあるので、下記に紹介しておく。
上記のサイトで、実行すると、下記のような結果レポートが出力される。
発行コマンド 「dig @61.122.77.57 omoshiro-joho.com」 ------------------------------------------------------------------------ ; <<>> DiG 9.2.4 <<>> @61.122.77.57 omoshiro-joho.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36430 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;omoshiro-joho.com. IN A ;; ANSWER SECTION: omoshiro-joho.com. 86400 IN A 61.122.77.57 ;; AUTHORITY SECTION: omoshiro-joho.com. 86400 IN NS omoshiro-joho.com. ;; Query time: 158 msec ;; SERVER: 61.122.77.57#53(61.122.77.57) ;; WHEN: Sat Jun 18 16:10:59 2005 ;; MSG SIZE rcvd: 65
digの実行ボタンの横の欄にドメイン名を、DNSサーバを指定場合の欄に、今回設定したDNSサーバのIPアドレスを入力する。すると、今回設定したDNSサーバが自身のドメイン名に関する問い合わせに対し、正しく応答しているかを確認できる。
レジストラのサイトなどに用意されている、ドメイン管理ツールにて、自ドメインのネームサーバを変更する。うちでは、ネットグルーヴ社からドメインを取得したので、そこの管理ツールをベースにした内容を、記載する。
まず、取得したドメインと同じドメインベースのDNSサーバを指定する場合は、先に「ホスト登録」を行なう必要がある。ここでサブドメインを何も指定しないとエラーになるので、適当に ns など入れて、次の画面で ns を消すことで、サブドメインなしのドメイン名で登録できる。
最後に、ホスト登録したネームサーバを、ドメインのプライマリネームサーバとして、設定する。
セカンダリサーバとは、プライマリサーバに障害が起きた場合の、予備用のDNSサーバである。プライマリサーバの情報を、逐次コピーしている。セカンダリサーバは自前で用意するのではなく、無料で公開されているサービスを利用する。
これまで利用していた無料DNSサービスの、zoneeditを利用する。zoneedit では、セカンダリDNSサービスも提供している。登録方法については、やや分かりづらいので、下記サイトを参照する。
単純に設定の流れを述べると、上部メニューから「Advanced」と選択し、下部にある「Make this Zone a Slave/Secondary」を選択する。すると、セカンダリサーバの設定画面となるので、マスターDNSを自宅サーバに変更する。
以下に、修正部分を抜粋する。
view "wan" { match-clients { any; }; zone "omoshiro-joho.com" IN { type master; file "omoshiro-joho.com.global"; allow-query { any; }; // セカンダリDNS の IPアドレスを指定 allow-transfer { 216.122.4.160; }; // 変更したら、セカンダリDNSサーバへ通知する notify yes; };
NSレコードに、セカンダリDNSサーバを追加する。
$TTL 86400 @ IN SOA omoshiro-joho.com. root.pokota.omoshiro-joho.com. ( 42 ; serial (d. adams) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum IN NS omoshiro-joho.com. // セカンダリDNSサーバを指定する IN NS ns13.zoneedit.com. IN A 61.122.77.57
ドメインレジストラのサイトへ行き、セカンダリネームサーバを設定する、zoneeditで表示された NameServer1 を指定すればよい。
これまでと同様に、dig コマンドを利用する。NS レコードに、zoneeditのネームサーバと、自身のネームサーバが表示されていることを確認する。反映されるまで、しばらく時間がかかるので、注意すること。
[bokupi@pokota bokupi]$ /usr/local/bin/dig @216.122.4.160 omoshiro-joho.com ; <<>> DiG 9.3.1 <<>> @216.122.4.160 omoshiro-joho.com ; (1 server found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44658 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;omoshiro-joho.com. IN A ;; ANSWER SECTION: omoshiro-joho.com. 86400 IN A 61.122.77.57 ;; AUTHORITY SECTION: omoshiro-joho.com. 86400 IN NS ns13.zoneedit.com. omoshiro-joho.com. 86400 IN NS omoshiro-joho.com. ;; Query time: 179 msec ;; SERVER: 216.122.4.160#53(216.122.4.160) ;; WHEN: Sat Jun 18 22:58:54 2005 ;; MSG SIZE rcvd: 93
複数のドメインを管理することもできる。
まず、named.conf に、追加したいドメインについて記述する。
view "wan" { match-clients { any; }; (中略) // 追加したいドメイン zone "tv-senshi.net" IN { type master; file "tv-senshi.net.global"; allow-query { any; }; }; };
tv-senshi.net.global というファイルを作成する。
TTL 86400 @ IN SOA tv-senshi.net. root.pokota.omoshiro-joho.com. ( 42 ; serial (d. adams) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum IN NS tv-senshi.net. @ IN A 61.122.77.57
これまでと同様に、ネームサーバの登録を行なう。なお "tv-senshi.net" は、メインで使うドメインではないため、セカンダリDNSは設けていない。
インストールや運用のさいに遭遇した問題点を書いておきます。
view による分岐処理が成功せず、常に最初の view の中身を実行してしまうため、外部からの問い合わせに対し、"192.168.0.3" といったローカルアドレスを返していた。
原因は、bind9 ではなく、既存の bind8 を起動していたためであった。bind8 は view には対応しておらず、起動時に文法エラーのメッセージが出ていた。実際の動作においては、view を無視する形で動作していた模様である。
以下のようなログが出て、起動に失敗。これは、/var/run の所有者が root なのに、named ユーザーで起動したため、pid ファイルを作成する(deamon)ことができずに、発生している。kernel2.2 系で bind9 を利用時に起きる問題のようだが、応急処置として、/var/run のパーミッションを 0777 とした。
couldn't open pid file '/var/run/named.pid' : Permission denied