CentOS5のBIND9でIPv6用DNSサーバを設定

IPv6の名前解決という場合、IPv4上のDNSクエリでIPv6ホストのアドレスを解決する場合と、クエリ自体もIPv6で行う場合の二つが考えられる。BIND9はどちらも対応済みなので設定を加えるだけで動作する。ちなみにWindows XPは前者の形でしかクエリできない。

まず/var/named/chroot/etc/named.confの設定をする。

[root@intra etc]# cat named.conf
acl "internal" {
        127.0.0.1;
        192.168/16;
        ::1;
        fd00::/8;
};

options {
        directory "/var/named";
        allow-query{ internal; };
        listen-on-v6 {internal;};

};

controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
        inet ::1 allow { ::1; } keys { rndckey; };
};

include "/etc/rndc.key";

view "internal" {
        match-clients { localhost; localnets; internal; };
        recursion yes;
        include "/etc/named.rfc1912.zones";
        zone "grandarbre.net" {
                type master;
                file "grandarbre.net.lan";
                allow-update { none; };
        };
        zone "0.168.192.in-addr.arpa" {
                type master;
                file "0.168.192.in-addr.arpa.db";
                allow-update { none; };
        };
        zone "1.168.192.in-addr.arpa" {
                type master;
                file "1.168.192.in-addr.arpa.db";
                allow-update { none; };
        };
        zone "0.0.0.0.8.6.1.0.2.9.1.0.0.0.d.f.ip6.arpa" {
                type master;
                file "0.168.192.fd00.ip6.arpa.db";
                allow-update { none; };
        };
        zone "1.0.0.0.8.6.1.0.2.9.1.0.0.0.d.f.ip6.arpa" {
                type master;
                file "1.168.192.fd00.ip6.arpa.db";
        allow-update { none; };
        };
};

optionsの中のlisten-on-v6はBIND自身がIPv6によるクエリを受け取る設定。

IPv6用の逆引き設定は、IPv6アドレスを16進数の1文字毎にばらして逆に並べ、最後にip6.arpaをつける。上記の例では32文字(128ビット)中の上位16文字(64ビット)までをマッチさせている。

次に正引きのゾーンファイル。ここではIPv4とIPv6を分けずに/var/named/chroot/var/named/grandarbre.net.lanに記述している。特徴的なのはAレコードではなくAAAAレコードを使っていることのみ。ちなみに下記では同じホストに対してIPv4とIPv6で別のホスト名を付与しているが、同じホスト名にしてもいい。

[root@intra named]#cat grandarbre.net.lan
$TTL    86400
@       IN      SOA     grandarbre.net. root.grandarbre.net.(
                        2009021803      ; serial
                        3600            ; refresh (1 hour)
                        900             ; retry (15 minutes)
                        604800          ; expire (1 week)
                        86400           ; negative (1 day)
)
        IN      NS              grandarbre.net.
        IN      MX      10      grandarbre.net.
intra	IN	A		192.168.0.3
gateway IN      A               192.168.0.254
www     IN      A               192.168.1.1

intra6  IN      AAAA            fd00:192:168:0::3
gateway6 IN     AAAA            fd00:192:168:0::254
www6    IN      AAAA            fd00:192:168:1::1

そしてIPv6用の逆引きゾーンファイル。named.confで16文字をマッチさせたので、ここでは残りの16文字を逆順に記述する。

[root@intra named]#cat 0.168.192.fd00.ip6.arpa.db
$TTL    86400
@       IN      SOA     grandarbre.net. root.grandarbre.net.(
                        2009021805      ; serial
                        3600            ; refresh (1 hour)
                        900             ; retry (15 minutes)
                        604800          ; expire (1 week)
                        86400           ; negative (1 day)
)
        IN      NS      grandarbre.net.
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN      PTR     intra6.grandarbre.net.
4.5.2.0.0.0.0.0.0.0.0.0.0.0.0.0 IN      PTR     gateway6.grandarbre.net.
[root@intra named]# cat 1.168.192.fd00.ip6.arpa.db
$TTL    86400
@       IN      SOA     grandarbre.net. root.grandarbre.net.(
                        2009021805      ; serial
                        3600            ; refresh (1 hour)
                        900             ; retry (15 minutes)
                        604800          ; expire (1 week)
                        86400           ; negative (1 day)
)
        IN      NS      grandarbre.net.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN      PTR     www6.grandarbre.net.

これで設定は完了。BINDを再起動しよう。

[root@intra named]# service named configtest
zone localdomain/IN: loaded serial 42
zone localhost/IN: loaded serial 42
zone 0.0.127.in-addr.arpa/IN: loaded serial 1997022700
zone 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: loaded serial 1997022700
zone 255.in-addr.arpa/IN: loaded serial 42
zone 0.in-addr.arpa/IN: loaded serial 42
zone grandarbre.net/IN: loaded serial 2009021803
zone 0.168.192.in-addr.arpa/IN: loaded serial 2008122800
zone 1.168.192.in-addr.arpa/IN: loaded serial 2009021200
zone 0.0.0.0.8.6.1.0.2.9.1.0.0.0.d.f.ip6.arpa/IN: loaded serial 2009021805
zone 1.0.0.0.8.6.1.0.2.9.1.0.0.0.d.f.ip6.arpa/IN: loaded serial 2009021805
[root@intra named]# service named restart
named を停止中:                                            [  OK  ]
named を起動中:                                            [  OK  ]

BINDがDNSクエリを待ち受けていることを確認する。

[root@intra named]# netstat -a | grep :domain
tcp        0      0 intra.grandarbre.net:domain *:*                         LISTEN
tcp        0      0 localhost.localdomai:domain *:*                         LISTEN
tcp        0      0 intra6.grandarbre.ne:domain *:*                         LISTEN
tcp        0      0 localhost6.localdoma:domain *:*                         LISTEN
udp        0      0 intra.grandarbre.net:domain *:*
udp        0      0 localhost.locald:domain     *:*
udp        0      0 intra6.grandarbr:domain     *:*
udp        0      0 localhost6.local:domain     *:*

それでは他のホストから名前解決が出来ることを確認しよう。digで正引きがうまく動かなかったのでhostコマンドで名前解決をしてみた。

[ishii@www ~]$ host intra6
intra6.grandarbre.net has IPv6 address fd00:192:168::3
[ishii@www ~]$ host fd00:192:168::3
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.6.1.0.2.9.1.0.0.0.d.f.ip6.arpa domain name pointer intra6.grandarbre.net.

次に、DNSクエリ自体をIPv6でやってみよう。やり方は簡単で、/etc/resolv.confのnameserverをIPv6アドレスに書き換える。

[root@localhost etc]# cat resolv.conf
search grandarbre.net
nameserver fd00:192:168:0::3
[root@localhost etc]# host intra6
intra6.grandarbre.net has IPv6 address fd00:192:168::3
[root@localhost etc]# host fd00:192:168::3
3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.6.1.0.2.9.1.0.0.0.d.f.ip6.arpa domain name pointer intra6.grandarbre.net.

うまくいった。なおDNSサーバ側で動いているip6tablesはデフォルトではDNSクエリを通さないので、/etc/sysconfig/ip6tables以下のような記述を追加してservice iptables restartしておく。

-A RH-Firewall-1-INPUT -m udp -p udp -s fd00::/8 --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m tcp -p tcp -s fd00::/8 --dport 53 -j ACCEPT