キャッシュ専用DNSサーバーの構築

この記事は1年以上前に投稿されたものです。
内容が古い可能性がありますのでご注意ください。

自宅LAN内にキャッシュ専用DNSサーバーを構築します。
ここでは「BIND」を用いたDNSサーバーを構築します。

DNSサーバーの方針

サーバー構成を検討する」にて少し書きましたが、私の環境下ではプロバイダーのDNS名前解決が遅いように感じられたので、それならば自宅サーバーにDNSを設置してそちらをメインに参照するようにしたい、というのがそもそもの動機です。
※ただ、後にルーターでの名前解決が引っかかっているのが原因かも、と思うようになりました。(プロバイダーのDNSサーバーの解決は早いと聞いたため)

内部にDNSサーバーを設置するとなると「内引き」DNSサーバーが想定されますが、私が使用しているルーターは(推測ですが)DNS問い合わせを一度プロバイダーのDNSサーバーまで投げるようで、結局名前解決して戻ってきますので内引きは設定しないことにしました。
※私の環境では、自宅LAN内から自宅サーバーにサブドメインでもプライベートIPでもアクセスできます。

また「外引き」DNSサーバーですが、構築するには

  • 最低2つの固定グローバルIPアドレス(プライマリ/セカンダリ用)または1つの固定グローバルIPアドレス(プライマリ用)+外部のセカンダリDNSサーバーの併用
  • ダイナミックDNS下において構築する場合、ダイナミックDNSサービス提供元にて独自ドメインの搭載かつnsレコード設定が出来ること

という条件があるようで、今回のケースではとても構築できないので見送りました。
以上の理由で、ここでは「キャッシュ専用DNSサーバー」を構築します。

BINDの設定

インストール時に、または「sudo tasksel」時に「DNS server」を選択していれば、既にBIND9がインストールされています。
BIND9の設定ファイルは「/etc/bind/」ディレクトリ以下にあります。
設定を編集するファイルは「named.conf.local」「named.conf.options」の2つです。

ubuntuの特徴として、インストール後の各パッケージの設定は基本設定ファイルはほとんどいじらず、追加の設定ファイルを作成して基本設定ファイルに上書きにて読み込むという形式が多いです。この方針は基本設定ファイルを原則汚さないので、個人的に好みの管理方法です。

尚、ubuntuにおけるBINDインストール直後の設定では、少し追加設定をするだけで簡単にキャッシュ専用DNSサーバーを構築することが出来ます。

1.named.conf.optionsの編集

named.confではnamed.conf.optionsの方が先に読み込まれますので、こちらにゾーン設定以外の主要な設定を記述します。

[html]sudo cp /etc/bind/named.conf.options named.conf.options.original
#↑バックアップしておきます
sudo nano /etc/bind/named.conf.options
※named.conf*ファイルでは、エスケープに//も使えます。(文頭限定の模様)

//ACL (Access Control List)の作成
//ネットワークをここで指定することで、適用範囲を明示することができます
acl local-net {
127.0.0.1; #←自宅サーバー自身を指定
192.168.xxx.0/24; #←自宅LANを指定
192.168.xxx.0/24; #←自宅LANを指定(複数ある場合)
};

options {

version “unknown”; #←追加(BINDのバージョンを隠す)

// query-source address * port 53; #←コメントアウトしたままにしておく

// forwarders {
//      0.0.0.0;
// };

//↓上記3行のコメントを外し、以下のように設定します

forward first;
//forwardersで指定したDNSサーバーからの応答が一定時間帰ってこない場合、自力で名前解決を行います

forwarders {
192.168.xxx.xxx; #←ルーターのIPアドレスを指定します
};

recursion yes;
//上記内容を追加します。DNSの再帰的な問い合わせを許可します(リゾルバからの問い合わせに応じて名前を解決/非解決するまで、別のDNSサーバーに繰り返し問い合わせます)

allow-query {
local-net;
};
//上記内容を追加します。サーバーに対する問い合わせに答える範囲を設定します。自宅LAN内に限定したいので、最初に設定したACLの名前を記載します。

allow-recursion {
local-net;
};
//上記内容を追加します。再帰的な問い合わせを許可するアドレス範囲を設定します。allow-queryと同じく、自宅LAN内に限定します。

allow-transfer {
none;
};
//上記内容を追加します。サーバーからのゾーン転送を許可するアドレスのリストを指定します。ここではセカンダリDNS等設置していないため、転送しないようにします。

auth-nxdomain no;    # conform to RFC1035
listen-on-v6 { any; };
};[/html]

2.named.conf.localの編集

[html]sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.original
#↑バックアップを作成

sudo nano /etc/bind/named.conf.local

//include “/etc/bind/zones.rfc1918”;
//↑コメントを解除して有効にします
include “/etc/bind/zones.rfc1918”;

//下記内容を追加します。
//allow-updateはサーバーにDNS動的更新リクエストを許可するホストを指定するためのオプションです。どのホストに対しても更新リクエストを許可しないようにします。

zone “localhost” {
allow-update { none; };
};
zone “127.in-addr.arpa” {
allow-update { none; };
};
zone “0.in-addr.arpa” {
allow-update { none; };
};
zone “255.in-addr.arpa” {
allow-update { none; };
};[/html]

ここまで設定したら、BINDを再起動します。

[html]sudo /etc/init.d/bind9 restart[/html]

3.ルーター内のDNS設定の変更

ルーターの管理画面にアクセスし、DNSサーバーの設定を以下のように変更します。

  • プライマリ:自宅サーバーのプライベートIPアドレス
  • セカンダリ:ルーターのIPアドレス

4.サーバーおよびクライアントPCの再起動

ここまでの設定を反映させるために、サーバー→クライアントPCの順に再起動します。

[html]sudo reboot[/html]

5.クライアントPCの設定

クライアントPC内でデフォルトで使用するDNSサーバーの設定を変更します。
Windowsの場合、「マイ ネットワーク」→「ネットワーク接続」→「ローカル エリア接続」を右クリックして、「プロパティ」を選択します。

Windowsでの設定(その1)

インターネット プロトコル(TCP/IP)を選択し、「プロパティ」をクリックします。

Windowsの設定(その2)

「次のDNSサーバーのアドレスを使う」を選択し、以下の情報を入力します。

  • 優先 DNSサーバー:自宅サーバーのプライベートIPアドレス
  • 代替 DNSサーバー:ルーターのIPアドレス

上記内容を入力したら、「OK」を押していってダイアログを全て閉じます。

6.resolv.confの設定

自宅サーバーにクライアントPCからログインし、resolv.confの内容を変更します。

[html]sudo cp /etc/resolv.conf /etc/resolv.conf.original
#↑バックアップを作成

sudo nano /etc/resolv.conf

#先ほどの再起動で、当ファイルにはルーターにて設定したDNSアドレスが記述されているので、全てコメントアウトする
#nameserver 192.168.xxx.xxx
#nameserver 192.168.xxx.xxx
nameserver 127.0.0.1 #←nameserverに自宅サーバー自身を設定

sudo /etc/init.d/bind9 restart
#↑BINDを再起動[/html]

これでキャッシュ専用DNSサーバーが起動します。

一度アクセスしたページはDNS情報がキャッシュされていきますので、次から同じドメインにアクセスした際に自宅サーバーへの問い合わせだけで済み、名前解決の速度が速くなるはずです。
※TTL(DNSレコードの有効期限)にも依存しますので、サイトによってはキャッシュが実感しにくいケースもあるかと思います。

実際に応答を確認してみる

Windowsの場合、「コマンド プロンプト」からnslookupコマンドにて、Unix系の場合、端末よりdigコマンドで確認してみます。

Windowsの場合、「Non-authoritative answer」と表示されればキャッシュが有効になっています。

Unix系の場合、Query Timeを見るとキャッシュが効いているかどうか判断できます。
(Query Timeが一桁の場合、まずキャッシュが効いていると思います)

DNSサーバー構築時の注意点

  • BINDを再起動すると、キャッシュが全てクリアされます。
  • 自宅LAN内専用のキャッシュDNSサーバーを設置した場合、内部でしか使用しないのでルーターのポート及びiptablesの穴を開ける必要はありません。
  • 内引き設定を行っていないので、Windowsのnslookupを使った際に「Can’t find server name~」と表示されます。その場合、「server 自宅サーバーのプライベートIPアドレス」を入力してnslookupのデフォルトサーバーを変更してチェックしてみて下さい。

参考サイト様

「キャッシュ専用DNSサーバーの構築」への2件のフィードバック

  1. ピンバック: Apacheの設定 « SkyGarden出張所

  2. ピンバック: このブログについて « SkyGarden出張所

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA