2013年3月10日日曜日

CentOS で 宅内 DNS の構築

開発機のアドレスが正しくアサインされてなかったことに気づいてあわててルーターの設定を直していたのですが、そのときにいつも http://192.168.0.1 と打ってまして、これなんとかならないのかなぁと思っておりました。よく使うマシンとかは hosts に書いてるんですが、家には何台かマシンがあり、全部のファイルを管理するのは嫌なので。そこでせっかく Linux マシンがあることだし、宅内用に DNS を構築してみることにしました。

まずはいつものように
# yum install bind

(snip)

Installed:
  bind.x86_64 32:9.8.2-0.17.rc1.el6.3
でインストールします。設定ファイルは /etc/named* と /var/named/* に配置されます。まず /etc/named.conf の options に以下のエントリを追加してローカルネットにのみ使用されるようにします。
        allow-query{
                127.0.0.1;
                192.168.0.0/24;
        };
        allow-recursion{
                127.0.0.1;
                192.168.0.0/24;
        };
        allow-transfer{
                127.0.0.1;
                192.168.0.0/24;
        };
次にLAN内以外の名前解決のため、ほかの(もともと使っていた)DNSサーバーを指定します。うちの場合はルーターを指定すればよいので以下のようになります。
        forwarders {
                192.168.0.1;
        };
さて解決したいアドレス群たちは別ファイルにします。named.conf で directory のところに指定されたディレクトリ、恐らく /var/named になっていると思いますが、そこにファイルを作成することになります。named.conf にはそのエントリだけです。
zone "mydomain.net" {
        type master;
        file "mydomain.net";
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "0.168.192.in-addr.arpa";
};
です。もちろん mydomain.net はご自分のドメインに書き換えてくださいね。

さてそれぞれのファイル自身の書き方が難しいです。named やら named.conf やらの man を見たんですが見つかりませんでした。このへんを参考にさせていただいて書いてみました。まずは正引き、つまり名前をIPアドレスに変換するほうです。
$TTL 1D
@       IN SOA  server.mydomain.net. root.server.mydomain.net. (
                                        2013030901      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   server.mydomain.net.
        IN MX 10        server.mydomain.net.
router  IN A    192.168.0.1
server  IN A    192.168.0.2

なにやら呪文のようですが・・・。アドレスの最後の . が結構肝みたいです。このファイル自体が "mydomain.net" 用というのを named.conf で指定したので、省略が利用できます。たとえば @ はそれ自身、つまり mydomain.net そのものの代わりです。また、 . で終わらないもの(上では router とか)は後ろに .mydomain.net がつくと解釈されます。なので、router の行では 「router.mydomain.net を 192.168.0.1 とする」という定義になります。

今度は逆引き、つまりIPアドレスを名前に変換するほうです。記法は基本一緒です。
$TTL 1D
@       IN SOA  server.mydomain.net. root.server.mydomain.net. (
                                        2013030901      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   server.mydomain.net.
        IN PTR  mydomain.net.
        IN A    255.255.255.0

1       IN PTR  router.mydomain.net.
2       IN PTR  server.mydomain.net.

ここでも同じです。さきほど 0.168.192.in-addr.arpa 用に定義したファイルなので、1 とかは 1.0.168.192.in-addr.arpa を定義したことになります。

これらのファイルが記述できたら、ツールで確認ができます。
# named-checkzone mydomain.net /var/named/mydomain.net 
zone mydomain.net/IN: loaded serial 2013030901
OK
# named-checkzone 0.168.192.in-addr.arpa 0.168.192.in-addr.arpa
zone 0.168.192.in-addr.arpa/IN: loaded serial 2013030901
OK
よさそうですね。いざ起動します。
# service named start
一応 /var/log/message を確認して大丈夫なことを確認して・・ってあれれ?
Mar  9 23:25:37 named[11531]: zone 0.168.192.in-addr.arpa/IN: loading from master file 0.168.192.in-addr.arpa failed: permission denied
Mar  9 23:25:37 named[11531]: zone 0.168.192.in-addr.arpa/IN: not loaded due to errors.
なるほど、ほかのファイルたちは group が named になってるのに私は root のままにしてました。
# chgrp named mydomain.net 
# chgrp named 0.168.192.in-addr.arpa 
# service named restart
今度は無事起動したようです。/etc/resolv.conf のエントリを /etc/sysconfig/network-scripts 等から変更し、ネットワークの再起動をします。確認します。
# nslookup router
Server:  127.0.0.1
Address: 127.0.0.1#53

Name: router.mydomain.net
Address: 192.168.0.1

# nslookup 192.168.0.1
Server:  127.0.0.1
Address: 127.0.0.1#53

1.0.168.192.in-addr.arpa name = router.mydomain.net.

# nslookup www.google.com
Server:  127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
Name: www.google.com
Address: 173.194.38.81
Name: www.google.com
Address: 173.194.38.82
Name: www.google.com
Address: 173.194.38.83
Name: www.google.com
Address: 173.194.38.84
Name: www.google.com
Address: 173.194.38.80

内部のアドレス、外部のアドレスとも問題なく解決されました。あとはこのサーバーをDNSサーバーとしてクライアントに登録するだけで利用できます。

実際に使ってみたところだめでした。 orz
原因の1つめは named.conf をよーく見ると
listen-on port 53 { 127.0.0.1; };

とありました。つまりそのサーバーだけでしか使えなくなっています。 上のテストはサーバー上だったので使えていたのですね。 まずはこれを修正します。 そうしたら一応使えてるっぽいんですが、なぜか1度目は失敗します。
C:\>nslookup www.formula1.com
サーバー:  server.mydomain.net
Address:  192.168.0.2

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** server.mydomain.net への要求がタイムアウトしました

C:\>nslookup www.formula1.com
サーバー:  server.mydomain.net
Address:  192.168.0.2

権限のない回答:
名前:    pc-b.bitgravity.com
Address:  64.185.181.238
Aliases:  www.formula1.com
          f1tata.pc.cdn.bitgravity.com
また /var/log/messages に戻ると、大量のエラーが。
Mar 10 00:14:14 named[13184]: validating @0x7fe418008ea0: . NS: got insecure response; parent indicates it should be secure
どうもルーターが dnssec に対応してないようですね。どうせLAN内だから別にいいか。(本当はどうかわからないですが。)/etc/named.conf の dnssec-validation を no に変えたところ無事動きました。

ネットワークの設定はいろいろ大変ですね。ここまでやってようやく http://router でルーターの管理画面に入れたわけですが、そこまでの価値があったのかどうかw まあ自己満足でOKとします。

0 件のコメント:

コメントを投稿