DNSサーバを自前で建ててみた。
VPSで使っている自分のドメインのネームサーバはさくらインターネットのサービスを利用しており、なんの不都合もないのだが、
DNSサーバってどうやって動いてるのか知りたかったので。
まだちゃんと動いていないのだが、
起動させるだけでけっこう苦労したので
とりあえずそこまでの記録。
インストールしようとしたら、すでに入っていた。
# yum install bind bind-chroot
読み込んだプラグイン:fastestmirror, refresh-packagekit, security
インストール処理の設定をしています
(略)
パッケージ 32:bind-9.8.2-0.62.rc1.el6_9.2.x86_64 はインストール済みか最新バージョンです
パッケージ 32:bind-chroot-9.8.2-0.62.rc1.el6_9.2.x86_64 はインストール済みか最新バージョンです
設定ファイルはnamed.confということはすぐわかったが、
/etc/named.conf
/var/named/chroot/etc/named.conf
の二つがある。
「chroot環境」というものがあり、よくわからないがそっちの方がよいらしく、
すでにそれになっていた。
/etc/sysconfig/named
というファイルもある。書いてあるのは
ROOTDIR=/var/named/chroot
だけである。
WEBの情報をたよりに named.confを設定して起動してみると、エラーが出た。
/etc/named.conf:20: both "recursion no;" and "allow-recursion" active for view external
とりあえず recursion yesにした。
次のエラーは、ファイルが見つからないというものだ。
zone example.com/IN: loading from master file example.com.lan failed: file not found
zone example.com/IN: not loaded due to errors.
これはnamed.confのzoneの部分に書いたファイル名だ。
zone "." IN {
type hint;
file "named.ca";
};
zone "example.com" IN {
type master;
file "example.com.lan";
allow-update { none; };
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
};
view "external" {
match-clients { any; };
match-destinations { any; };
allow-query { any; };
recursion yes;
zone "example.com" IN {
type master;
file "example.com.wan";
allow-update { none; };
};
};
これの置いてある場所が正しくないようだ。
結論から言うと置くべき場所はデフォルト設定のままであれば下記だ。
/var/named/chroot/var/named/
/var/namedが二回も出てきて気持ち悪いが。
どうしてこうなるかというと、
まず/etc/sysconfig/named に書かれている ROOTDIRがあって、
ROOTDIR=/var/named/chroot
そこを起点として、
/var/named/chroot/etc/named.conf に書かれている
directory "/var/named";
これがくっつくので、
/var/named/chroot/var/named/ となる
/var/named/chroot/etc/named.conf に2行のinclude文がある。
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
これらのファイルは、/var/named/chroot/etc にある。
named.rfc1912.zonesの中身
# cat named.rfc1912.zones
zone "localhost.localdomain" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "named.localhost";
allow-update { none; };
};
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "1.0.0.127.in-addr.arpa" IN {
type master;
file "named.loopback";
allow-update { none; };
};
zone "0.in-addr.arpa" IN {
type master;
file "named.empty";
allow-update { none; };
};
ここにもzone情報があって、
named.localhost
named.loopback
named.empty
というファイル名が書いてある。
これらのファイルも、
/var/named/chroot/var/named/
にある。
これらのファイルをそろえて、中身についてはさがせば情報があるので
それを書けばとりあえず起動する。
dig yahoo.co.jp @ns.example.com
VPSで引けたので、一応動いている。
自分のパソコンからVPSのサーバーを指定してnslookupしてみるとtimeoutする。
iptablesで開けたはずなのにと思ってみたら tcp 53になっていたので udpにする。
今度は Query refused となる。
/var/named/chroot/etc/named.conf
のallow-なんとかに、自分のIPアドレス(「確認君」で出るやつ)を書いてやると
引けるようになった。
options {
.......
allow-query { localhost; localnets; xx.xx.xx.xx; };
allow-recursion { localhost; localnets; xx.xx.xx.xx; };
allow-query-cache { localhost; localnets; xx.xx.xx.xx; };
forwarders{ 8.8.8.8; 8.8.4.4; };
recursion yes;
.........
};
私がやりたかったのはこれである。
こういう機能をするDNSサーバは「キャッシュサーバ」と言う。
パソコンとかで設定するDNSサーバとはキャッシュサーバのことだ。
でも、ISPとかのDNSサーバのように、だれでもクエリを許可するにはどうすればよいのだろうか?
また、そうすることの危険性ってないのだろうか?
自分のドメインのゾーン設定についてはあらためて。