あってるかはわからない。
Bind って個人的にはあまり参考になるサイトは多くなかった気がするから書いておく。
コンテンツサーバとキャッシュはたしかに分けたほうがいいとは思う、と先に書いておく。分けれる環境なら分けたほうがいいと思う。
環境
結構よくあるパターンだと思う。
実際は DMZ とかでもうちょっと工夫してたりすることもあるけど、暫定的にこの構成で立てるということはよくやると思う。

この記事での環境
ちょっとめんどくさかったですが、一応画像を書いてみました。まぁ、Router が PPPoE 話して NAPT する日本ではおなじみの環境です。
あと、192.168.55.5 用にルータは DNS 用のポート 53 にパケットがきたら 192.168.55.5 へもってくよう設定されてるとします。
(当たり前ですが、TCP も使うので TCP 53 も 192.168.55.5 にもっていくこと)
画像に書き忘れましたが、対象の ZONE は target.zone.com. とします。
server.zone.com. が 192.168.55.5 としておきます。ここも server.local.zone.com. として切ることも多いと思いますが、ここではあえて server.zone.com. の正引きがグローバル IP を返したり、DNS キャッシュ使いたいマシンからではプライベート IP を返す構成とします。
Bind9 の基本的な設定
まず、ZONE ではなく Bind の基本的なことに関して設定します。
Bind はたまにメモリを食いつぶすから危ないとかかかれてますが、バグによるもの以外では特にないので問題ないはず。(調べとくべきですねぇ)
Bind のインストールですが、Debian の場合は # aptitude install bind9 でインストールできます。
Bind8 のほうが速いからそっちを使うというのは Bind を理解できていなければやめたほうがいいと思います。
/etc/bind/named.conf.options にずらずら基本的なことを書いていきます。
options {
directory "/var/cache/bind";
/*
forward first;
forwarders {
123.45.67.88;
123.45.67.89;
};
*/
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { none; };
listen-on {
127.0.0.1;
192.168.55.5;
};
max-cache-size 64000000;
allow-recursion {
127.0.0.0/8;
192.168.0.0/16;
}
まぁこんなかんじです。
上から簡単に説明します。
directory はデフォルトのままです。
forward を使えとかありますが、自分の場合 ISP の DNS が気に食わないから自分で DNS キャッシュ立てるというこが主です。
常時稼動させるなら forward ないほうが快適な場合があります。
forward はオライリーの Bind 第四版を持ってるのでそれで知りました。
first の場合はクエリがきたとき、自分(bind)が知らないものはまず最初に forwarders に問い合わせて、forwarders も知らない(応答しない)場合は自分でルートサーバから再帰的に検索をして解決するという動作になります。
only の場合は first の動作のうち、自分で解決せず forwarders で解決できなかったらそこで終了となります。
つまり ISP の DNS を forwarders に指定する場合は first でも only でも動作はいっしょです。
理由は ISP の DNS は再帰的に検索するからです。
むしろ、first を指定すると解決できないものを自分で解決しようとするので余計に時間がかかります。
no の場合は全部自分で解決する、となります。bind 起動直後だとキャッシュがまったくない状況ですので遠くヨーロッパの DNS サーバに問い合わせたりすることがあるので、
体感速度は最悪になります。常時稼動のサーバなら特に問題にならないはず。
ただし DNS キャッシュサーバを使うマシンが少ない(問い合わせクエリが少ない)場合はそのたびごとにそのドメインの解決をルートサーバから開始するので ISP の DNS を使ったほうがいいでしょう。
自分で DNS をたてたときのメリットは ISP の DNS が調子いいのであれば、同じ問い合わせを何度も繰り返すような環境で RTT が ISP の DNS より短くなる点だけです。
説明がヘタクソなのでわかりづらいですが、ISP の DNS はたいてい東京にあるので、大阪や石川に居る自分の場合は ISP の DNS にキャッシュがある状態で 15ms から 40ms もかかります。もし、このクエリをキャッシュしている自分の DNS があれば 1ms 以下で問い合わせ完了することになります。10ms で帰ってくるとして 1000クエリの問い合わせがあれば 10000ms = 10 秒にもなります。
(リバースプロキシ使う場合は自分の DNS ないと不便ということもあると思います)
話を戻して、listen-on が Bind が bind する IP です。ホント、Bind って名前ダメですよねぇ。
max-cache-size というのはキャッシュする上限です。
これを設定しない場合は bind はメインメモリが足りなくなってもキャッシュし続けます。
TTL が先に切れる場合が多いのでそんな状況にはめったになりませんが、内側からの攻撃でなる可能性があるので設定しといたほうがいいでしょう。
この場合 64MB を上限としています。
また、max-cache-size はどうやって削除するキャッシュを選別しているかというのはオライリーの Bind の本にかいてあったと思います。
(たしか古いキャッシュの TTL を勝手に削減して削除する、というやり方だったと思います。)
allow-recursion は再帰問い合わせを許可するネットワークという設定です。これは非常に重要です。
再帰問い合わせというのは要は DNS キャッシュのことです。
server.zone.com はインターネットからの問い合わせに答えるので、
これを設定しない場合は zone.com 以外の zone (www.yahoo.com とか) の問い合わせに対しても再帰的に検索して結果を返してしまいます。
(ISP によっては自分の ISP 以外のクライアントからも再帰問い合わせを許可している場合が結構ありますが、
あれはちゃんと DNS サーバの管理者が居るということだとおもいます。)
Bind9 View の設定
やっとここまできた。これが書きたかったところで、内側(192.168.55.0/24)からの問い合わせとそれ以外の外側からの問い合わせで返す結果を変えるところです。
これもオライリーの Bind の本に書いてあったとおりです。
まずは /etc/bind/named.conf を設定します。
include "/etc/bind/named.conf.options";
acl localnet {
127.0.0.0/8;
192.168.0.0/16;
};
view "internal" {
match-clients { localnet; };
// prime the server with knowledge of the root servers
zone "." {
type hint;
file "/etc/bind/db.root";
};
zone "localhost" {
type master;
file "/etc/bind/db.local";
};
zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};
zone "168.192.IN-ADDR.ARPA" {
type master;
file "/etc/bind/db.192.168";
};
zone "zone.com" {
type master;
file "/etc/bind/db.zone.com";
};
}
view "external" {
match-clients { any; };
zone "zone.com" {
type master;
file "/etc/bind/external.db.zone.com";
allow-transfer {
92.243.14.172; 195.234.42.1; 87.98.164.164; 88.191.64.64;
};
};
};
view “internal” ちょっとはちょっと端折ってるので、注意してください。なくても動作に問題なかったと思いますが一応。
acl で localnet という内側からの問い合わせようのアクセスコントロールリストを作ります。
View は便利でして、このように match-clients でそれぞれ zone の使い分けができる、という機能です。
この場合、 /etc/bind/db.zone.com には server IN A 192.168.55.5 というレコードが、/etc/bind/external.db.zone.com には server IN A 123.45.67.89 といったグローバル IP が書かれているとすれば、内側からの問い合わせは 192.168.55.5 、外側からの問い合わせは 123.45.67.89 という結果になります。
また、セカンダリ DNS 用に allow-transfer を設定しています。xname.org. をセカンダリで使う場合は上記のようになるはずです。
これがないとセカンダリ DNS の AXFR 等の問い合わせに応答しなくなるのでセカンダリ DNS 側が困ってしまいます。
手抜きでごめんなさい。

Kooss
Ktkr.net
ReJEC.NET