.
.
.
.
.
TOPページ(Alt+B)
.
BINDでDNSキャッシュサーバー

インターネット上では、IPアドレスを人間が覚えやすいアルファベットの文字列に置き換えて運用しています。例えばブラウザにwww5.plala.or.jpと入力してページの表示要求を出すと、210.153.0.37というIPアドレスに変換(名前の解決、リゾルバといいます)してあげることによりはじめてそのページが表示されます。名前の解決は通常はプロバイダ側に用意されたDNSサーバーのデータを参照して解決します。ところが、ADSLやケーブル接続などの高速回線を利用しているにもかかわらず、このDNSの機能を持ったサーバーが混んでいることが原因で表示が遅いことがあります。そこで、Windows2000、XPには1度名前解決を行ったデータをローカルマシンにキャッシュしておく機能(DNSリゾルバキャッシュ)が標準で付加されています。これを確認するには「スタート」メニューから「ファイル名を指定して実行」の名前欄に「cmd.exe」と入力して「OK」ボタンを押すとコマンドプロンプト画面が出てきます。

> ipconfig /displaydns

と入力して「Enter」キーを押してください。現在のキャッシュの状況が画面に表示されるはずです。ちなみにキャッシュを開放するには

> ipconfig /flushdns

と入力します。

ところがこのWindows標準のDnsCacheシステムですが、キャッシュの有効期限や保存されるエリアの保存期間などを変更するにはレジストリの操作が必要になります。これらのキーは「HKEY_LOCAL_MACHINE」-「SYSTEM」-「CurrentControlSet」-「Services」-「Dnscache」-「Parameters」以下にありますが、レジストリの操作は危険を伴いますし、変更してもあまりこれといった効果が感じられません。

そこで、PC-UNIXの世界では定番となっているISCBINDを使って、専用のDNSキャッシュサーバーを立ててみましょう。これなら簡単な設定ファイルで様々なカスタマイズが可能ですし、レジストリの操作も必要ありません。DNSキャッシュサーバーは自分自身で名前の解決を行う機能は持っていません。最初の1回はプロバイダ等のDNSサーバーに依頼し、その内容を指定した期間キャッシュします。2回目以降はそのキャッシュを使って名前の解決を行います。

まずはISCのBINDのページからWindows用のバイナリを入手します。2004年10月現在、BINDにはVersion8.4.5と9.2.4、9.3.0がありますが、安定性という点からみても8.4.5が良いでしょう。8.4.5のDownloadsページからBIND 8.4.5 Windows NT / Windows 2000 Binariesをクリックしダウンロードします。ダウンロードしたBIND8.4.5.zipを解凍し、その中にあるBINDInstall.exeを実行するとインストールが開始します。

ISC

bind

デフォルトではC:\WINDOWS\System32\dnsにインストールされます。さらにその中にbinとetcというサブディレクトリが出来上がっているはずです。binディレクトリには各種バイナリ、etcディレクトリにはこれから作成する各設定ファイルを格納します。etcディレクトリは属性を読み取り専用にしておきます。Optionsの項目は読んで頂ければお分かりだと思いますが、上から自動的にBINDサービスを開始する、アンインストールしても各種設定ファイルは残す、インストール後直ぐにBINDサービスを開始する、が選択可能ですが、そのままにしておいて問題ないでしょう。
次に各種設定ファイルを作成します。BINDをDNSキャッシュサーバーとして動作させるのに必須なのはブートファイル(named.conf)、ルートサーバー情報ファイル(named.ca)の2つ、更に推奨されるファイルとして逆引きループバックファイル(named.local)、ネームサーバー指定ファイル(resolv.conf)があります。各ファイルの詳細は以下の通り。

named.conf BINDの動作や担当するゾーンのデータベース全般についての設定を行う。このファイルを元にBINDはネームサーバーとして稼動する。 必須
named.ca 世界中にあるルートサーバーの情報を記入したファイル。ftp://ftp.internic.net/domain/から入手可能。時々更新されるのでチェックが必要。(2008年2月4日付が最終更新日) 必須
named.local ネームサーバーが名前解決に用いるデータベースで、ゾーンファイルの1つ。このnamed.localはローカルループバックのネットワーク内(127.0.0.1)のホストを定義する。 推奨
resolv.conf リゾルバが設定されたネームサーバーを指定するファイル。Windowsでは「ローカルエリア接続のプロパティ」の「TCP/IP接続」-「DNSサーバー指定」欄に指定することでこのファイルの代用をする。 推奨

・ゾーン
広大なインターネット空間にあるすべてのホスト名を一つのネームサーバーだけで解決することは不可能です。そこで考え出されたのがDNSという分散型データベースシステムを用いた名前の解決システムです。このシステムでは、それぞれのネームサーバーが担当する名前解決の範囲が設定されており、この範囲のことをゾーンと呼びます。このゾーンは階層構造になっており、上位のゾーンから下位のゾーンへと各ゾーンを担当するネームサーバーに名前解決を依頼していきます。

以下に各ファイルのサンプルを記しておきます。サンプルファイルはコピーしてそのまま利用できますが、赤色部分は自分の環境に合わせて修正する必要があります。ルーター有りの場合は現在のマシンのIPアドレスを192.168.1.10、ルーターのIPアドレスを192.168.1.1(導入している場合)、ドメイン名(適当に付ければいいです)をns.myhome.netと仮定しています。

named.confの例

ルーターなしの場合

acl localnet {
        127.0.0.1;
};

options {
        directory "c:\windows\system32\dns\etc";
        allow-query { localnet; };
          version "bind";
};

logging {
        channel my_file {
        file "c:\windows\system32\dns\etc\named.run" versions 5 size 1m;
        severity debug 0;
        print-category yes;
        print-severity yes;
        print-time yes;
        };
        category default {my_file;};
        category queries {my_file;};
        category lame-servers {my_file;};
        category config {my_file;};
};

zone "." {
        type hint;
        file "named.ca";
};

zone "0.0.127.in-addr.arpa" {
        type master;
        file "named.local";
};

ルーター有りの場合

acl localnet {
        127.0.0.1;
        192.168.1.0/24;
};

options {
        directory "c:\windows\system32\dns\etc";
        forward first;
        forwarders {
        xxx.xxx.xxx.x;
        };
        allow-query { localnet; };
          version "bind";
};

logging {
        channel my_file {
        file "c:\windows\system32\dns\etc\named.run" versions 5 size 1m;
        severity debug 0;
        print-category yes;
        print-severity yes;
        print-time yes;
        };
        category default {my_file;};
        category queries {my_file;};
        category lame-servers {my_file;};
        category config {my_file;};
};

zone "." {
        type hint;
        file "named.ca";
};

zone "0.0.127.in-addr.arpa" {
        type master;
        file "named.local";
};

・解説
acl localnetでまず自分のネットワークを定義します。これはルーターを導入してのインターネット接続の際には必要ですが、パソコンが一台しかないような環境では必要ありません。optionsではこれらのファイルの保存場所を指定し、forwardには自分のプロバイダのセカンダリDNSサーバを指定します。これはルーターのIPアドレスでも構いません。但し、フォワードを許可していないところもあります。その場合はその項目がエラーとしてロギングされますが、特に問題はありません。loggingではログを専用ディレクトリに記録するよう設定します。これを指定しない場合、全てのログはWindowsイベントビューワのアプリケーションログに記録されますので、特定のDNSサーバーに設定ミスがあった場合、膨大なエラーログが記録されることになり、アプリケーションログ項目がBIND関係のログで埋め尽くされてしまいます。「versions 5 size 1m」と指定するとログサイズが1MBになったら自動的にローテーションし、それを5回繰り返す(5個まで保存する)ことになります。zone指定の項目は2つでnamed.caとnamed.localを指定します。

named.ca

ftp://ftp.internic.net/domain/named.cacheにあるものをダウンロード保存して使います。

named.local

$TTL    86400
@    IN    SOA   ns.myhome.net. administrator.myhome.net. (
                        2002100901 ; シリアルナンバー
                        10800 ; リフレッシュ
                        3600 ; リトライ
                        604800 ; レコード有効期限
                        86400 ) ; ゾーンファイル有効期限

    IN    NS     ns.myhome.net.

1   IN    PTR    localhost.

・解説
最初の@(アットマーク)はnamed.confのzoneで指定されたデフォルトドメインを意味します。ここでは"0.0.127.in-addr.arpa"を指します。SOAに続いて自ドメイン、メールアドレス(適当に)を指定し、シリアルナンバー、リフレッシュ時間、リトライ時間、レコード、ゾーンファイルの各有効期限(全て秒単位、1日は86400秒)を指定します。個人でインターネットを楽しむ程度なら、このままでちょうど良いでしょう。IN NSのNSはネームサーバーの略で自マシンを指定します。PTRはPoint TeRの略で、IPアドレスを指定されたホスト名にマッピングします。ここでの注意点はホスト名を絶対指定する際に最後にピリオドを付けなければならないという点です。DNSキャッシュサーバーとして動作させるにはこの逆引きループバックファイルは特に必須というわけではありません。実際にはルートサーバー情報を記入したファイル(named.ca)のみあれば有効に機能します。

resolv.conf

domain myhome.net
nameserver 127.0.0.1
nameserver xxx.xxx.xxx.xxx

・解説
まず自ドメイン名を指定し、次にネームサーバーとして自分自身を指定します。127.0.0.1ではなく、自分自身のローカルIPである192.168.1.10でも構いません。念のため、プロバイダのセカンダリDNSサーバーを下行に指定しておきます。ルーターがある場合はルーターのIPアドレスを指定しておきます。こうしておくことによりBINDが何らかの要因で機能しなくなっても名前の解決を行うことができます。云ってみれば、保険のようなものです。

上記ファイルをまとめたもの[bind_conf.zip] MD5: 81c523a45e0ed9742256e0d6a2cafa6a

出来上がったこれらのファイルはdnsディレクトリの下にあるetcディレクトリに格納します。作業が完了したら「スタート」メニューにあるBIND Ctrlを起動し、「Stop」、「Start」ボタンの順に押してBINDを再起動します。

Bind Control Panel

etcディレクトリに新たに作成されたnamed.runファイル(BINDのログファイル)をメモ帳等にドラッグし、内容を確認します。

16-Oct-2002 11:55:52.000 load: info: hint zone "" (IN) loaded (serial 0)
16-Oct-2002 11:55:52.000 load: info: master zone "0.0.127.in-addr.arpa" (IN) loaded (serial 2002100901)
16-Oct-2002 11:55:52.000 default: info: listening on [192.168.1.10].53 (TCP/IP Interface 1)
16-Oct-2002 11:55:52.000 default: info: listening on [127.0.0.1].53 (Loopback Interface (interface 2))
16-Oct-2002 11:55:52.000 default: info: Forwarding source address is [0.0.0.0].1552
16-Oct-2002 11:55:52.000 default: notice: Ready to answer queries.

Ready to answer queriesと記録されていれば、起動は成功です。念のためnslookupで動作確認をしておきます。コマンドプロンプト画面を出し、nslookupと入力し、

Default Server: localhost
Address: 127.0.0.1

Default ServerとAddressに自分自身が表示されることを確認します。ルーターを導入していれば127.0.0.1もしくは自マシンのローカルIPアドレスが表示されます。ルーターなしの場合はプロバイダから割り当てられたグローバルアドレスとなります。

次に適当なホスト名(存在するもの)を入力し、回答が得られることを確認します。同じように適当なIPアドレス(存在するもの)を入力し、回答が得られることを確認します。

> netscape.com
Server: localhost
Address: 127.0.0.1

Name: netscape.com
Address: 64.12.180.22
Name: netscape.com
Address: 64.12.151.211
Name: netscape.com
Address: 64.12.151.215
Name: netscape.com
Address: 64.12.180.19

更にもう一度同じコマンドを入力すると今度は

> netscape.com
Server: localhost
Address: 127.0.0.1

Non-authoritative answer:
Name: netscape.com
Address: 64.12.180.22
Name: netscape.com
Address: 64.12.151.211
Name: netscape.com
Address: 64.12.151.215
Name: netscape.com
Address: 64.12.180.19

とNon-authoritative answer:が表示されます。これはこのアドレスがキャッシュされたということを意味します。つまりこれが表示されればキャッシュサーバとして動作しているということになります。

> 64.12.151.211
Server: localhost
Address: 127.0.0.1

211.151.12.64.in-addr.arpa name = main-v1.netscape.aol.com.

Authoritative answers can be found from:
151.12.64.in-addr.arpa nameserver = dns-02.ns.aol.com.
151.12.64.in-addr.arpa nameserver = dns-01.ns.aol.com.
dns-01.ns.aol.com internet address = 152.163.159.232
dns-02.ns.aol.com internet address = 205.188.157.232

ルーター使用時の設定

ADSL接続などの際に、セキュリティ向上の目的や、複数台の接続を可能にするため、いわゆるブロードバンドルーターを使用しているケースが増えています。この場合、ローカルのIPアドレスはルーターが各マシンに自動的に割り当てられる(DHCP)ようになっているはずです。BINDでのDNSキャッシュサーバーを利用する場合はIPアドレスを固定状態にしておくと良いでしょう。その方法ですが、「ネットワークとダイアルアップ接続」から「ローカル エリア接続」をクリックすると「ローカル エリア接続状態」が表示されます。そこから「プロパティ」ボタンを押し、「ローカル エリア接続のプロパティ」の全般タブから「インターネットプロトコル(TCP/IP)」をクリックします。

ローカルエリア接続のプロパティ TCP/IPのプロパティ

「インターネット プロトコル」の「プロパティ」の全般タブで「次のIPアドレスを使う」にIPアドレス:192.168.1.10(自マシンのIPアドレス)、サブネットマスク:255.255.255.0、デフォルトゲートウェイ:192.168.1.1(ルーターのIPアドレス)と入力し、「次のDNSサーバーのアドレスを使う」に自マシンのIPアドレス、ルーターのIPアドレスの順に入れていきます。更に「詳細設定」ボタンを押し、「TCP/IP詳細設定」のDNSタブの中の「この接続のDNSサフィックス」欄に「myhome.net」(自分で決めたドメイン名)を入れ、それぞれ「OK」ボタンを押し入力を完了させた後、マシンを再起動します。ルーターに関しては各メーカーによって設定は異なりますが、固定アドレス設定機能(ネットワークボードのMacアドレスをルーターに登録しておくことにより行える)がそれぞれありますので設定しておきます。ただ、特に設定しておかなくてもパソコン側で設定してあれば問題はありません。後はメモリの浪費を避けるため、Windows標準のDnsCacheサービスをSTOPしておきます。方法は「コントロールパネル」から「管理ツール」の中の「サービス」をクリックします。利用可能なサービス一覧及び、動作状況が表示されますので、その中の「DNS Client」をダブルクリックし、DNSClientのプロパティからサービスを停止させ、スタートアップの種類を「手動」に変更し、「OK」ボタンを押します。

サービス

DNS Clientのプロパティ

以上でDNSキャッシュサーバーの設定は完了です。最後にBINDのログファイルで正しく動作していることを確認します。

15-Oct-2003 08:09:08.000 default: notice: Ready to answer queries.
15-Oct-2003 08:30:44.000 queries: info: XX+/192.168.1.10/ad.linksynergy.com/A/IN
15-Oct-2003 08:30:45.000 queries: info: XX+/192.168.1.10/www.accesstrade.net/A/IN
15-Oct-2003 08:30:45.000 queries: info: XX+/192.168.1.10/oz.valueclick.ne.jp/A/IN
15-Oct-2003 08:30:50.000 queries: info: XX+/192.168.1.10/sp.valueclick.ne.jp/A/IN

上記のように「日付、時間、メッセージ、自マシンのIPアドレス、ホスト名/A/IN」というログが記録されていれば成功です。私自身が感じたWindows標準のDNS Clientとの最大の違いは、パソコンを起動直後にインターネット接続した際、3秒程度掛かっていた名前の解決が1秒以内に行えるようになりました。当然、1度キャッシュされた名前は即時に解決されるのは云うまでもありません。

今度はBINDのログについて簡単に見てみましょう。ログを観察していると、様々なエラーが記録されることに気付くでしょう。以下はよく見かけるエラーメッセージです。

Lame server on 'ホスト名' (in 'ホスト名'?): [DNSサーバーのIP].53 'DNSサーバー名'

ホスト名の正引き情報を持っているはずのDNSサーバーが権限がないと返答している。DNS情報の伝播が遅れているいることも考えられるが、大抵は該当DNSサーバーの正引き設定が間違っている。

Lame server on 'xxx.xxx.xxx.xxx.in-addr.arpa' (in 'xxx.xxx.xxx.in-addr.arpa'?): [DNSサーバーのIP].53 'DNSサーバー名'

IPアドレスxxx.xxx.xxx.xxxの逆引き情報を持っているはずのDNSサーバーが権限がないと返答している。DNS情報の伝播が遅れているいることも考えられるが、大抵は該当DNSサーバーの逆引きが間違っている。

query(ホスト名) NS point to CNAME (DNSサーバー名:) learnt (CNAME=xxx.xxx.xxx.xxx:NS=xxx.xxx.xxx.xxx)
query(xxx.xxx.xxx.xxx.in-addr.arpa) NS point to CNAME (DNSサーバー名:) learnt (CNAME=xxx.xxx.xxx.xxx:NS=xxx.xxx.xxx.xxx)

NSレコードが、CNAMEとして定義されている。おそらく該当DNSサーバーの設定ミスと思われる。

上のようなエラーはほとんどが該当DNSサーバーの設定ミスによるものです。いわゆる”大手”といわれるようなサイトでも案外細かいところでミスをしてしまっているものです。

TOPページ(Alt+B)

CopyRight (C) 2000-2013 by T.Shiraishi All right reserved 無断転載禁止/リンクフリー