DNSサーバの標準である BINDを64bit+IPv6環境で検証します
BINDは DNSサーバで UNIX系システムでは事実上の標準と言えるほど有名です
ISCがソースの保守を行っていて 年に1回は新機能リリースをやっているようです
今回 BIND9 をインストールして 64bit環境 IPv6環境での動作検証を行います
検証環境
CPU
AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ
16GB
OS
Gentoo-1.12.14ベース Linux-3.0 UTF-8
コンパイラ
gcc-4.5.2
Cライブラリ
glibc-2.13
ODBC
libiodbc-3.52.7
BerkeleyDB
5.1.25.NC
PostgreSQL
9.1
MySQL
5.5.15
Oracle
11g Express Edition Release2
LDAP
OpenLDAP-2.4.23
BIND
9.8.1
ここで なぜ(自宅に)DNSサーバが必要で DNSのIPv6化が何を指しているのかを説明します
まず IPv6ネットワークの状況ですが

フレッツルータから下の部分は 自宅LANの状況です
今回 IPv6対応の DNSサーバを構築するのが目的です
フレッツ網は IPv6も可能ですが インターネット上の他のIPv6網と分断されています (2011年状況)
従って インターネット上の他のIPv6ネットワークへは直接通信が届きません
自宅内に複数の 端末/サーバ/ルータ があってホスト名をつけたい場合
今回のように 「自宅にDNSサーバを立てる必要がある」のです
IPv6通信するのは 赤の矢印の部分です 通信は IPv6ですが
IPv4ホスト名(Aレコード)/IPv6ホスト名(AAAAレコード) どちらも解決できます
インターネットの IPv6通信は分断された状態ですが
フレッツ網の DNSサーバはどうやって 他IPv6網の名前情報にアクセスしているのでしょうか?

上図は IPv4通信の状況です
フレッツのDNSサーバは IPv4を使って IPv6/IPv4名前解決をしていると思われます
(フレッツ網内の仕組みは詳しくないので ひょっとしたら違うかも)
いずれにしても 自宅の IPv6/IPv4 DNS化は下記前提で行います
- フレッツ網内の DNSサーバが IPv6(AAAA)/IPv4(A) どちらも解決可能
- フレッツ網内の DNSサーバへ IPv6通信で問い合わせる (IPv4通信でも可能だが)
- 自宅DNSサーバは IPv6(AAAA)/IPv4(A) 解決可能 かつ IPv6通信/IPv4通信 可能
インストール
$ tar -xzf bind-9.8.1.tar.gz
$ cd bind-9.8.1
$ ./configure --prefix=/ram --localstatedir=/ram/var --with-openssl --enable-threads --enable-atomic --with-randomdev=/dev/urandom --enable-getifaddrs --with-dlz-postgres=yes --with-dlz-mysql=/usr/mysql --with-dlz-bdb=yes --with-dlz-filesystem=yes --with-dlz-ldap=yes --with-dlz-odbc=yes --with-dlz-stub=yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
〜
make[1]: Leaving directory `/ram/bind-9.8.1/doc'
rm -f *.o *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2
rm -rf .depend .libs
rm -f FAQ.tmp
$ make
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make&apos に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます
〜
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:487: undefined reference to `sdlzh_build_querystring'
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:484: undefined reference to `sdlzh_build_querystring'
〜
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_odbc_driver.c:1404: undefined reference to `sdlzh_build_sqldbinstance'
collect2: ld はステータス 1 で終了しました
make[2]: *** [named] エラー 1
make[2]: ディレクトリ `/home/admin/bind-9.8.1/bin/named' から出ます
make[1]: *** [subdirs] エラー 1
make[1]: ディレクトリ `/home/admin/bind-9.8.1/bin' から出ます
make: *** [subdirs] エラー 1
$
大量の undefined referenceエラーが出ました bind-9.8.1固有のバグのようです
contrib/dlz/drivers/sdlz_helper.c を下記のように修正することで回避できます
52
53 #ifdef DLZ
54
↓
52
53 //#ifdef DLZ
54
530
531 #endif
↓
530
531 //#endif
再度 makeします
$ make
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます
〜
making all in /home/admin/bind-9.8.1/doc/doxygen
make[2]: ディレクトリ `/home/admin/bind-9.8.1/doc/doxygen' に入ります
make[2]: ディレクトリ `/home/admin/bind-9.8.1/doc/doxygen' から出ます
make[1]: ディレクトリ `/home/admin/bind-9.8.1/doc' から出ます
$ su
# make install
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます
〜
/bin/sh ./mkinstalldirs /usr/share/man/man1
/usr/bin/install -c isc-config.sh /usr/bin
/usr/bin/install -c -m 644 ./isc-config.sh.1 /usr/share/man/man1
/usr/bin/install -c -m 644 ./bind.keys /usr/etc
$
インストールされるファイルは下記の通りです
bin/:
dig host isc-config.sh nslookup nsupdate
etc/:
bind.keys
include/bind9:
check.h getaddresses.h version.h
include/dns:
acl.h ds.h message.h rdataslab.h tcpmsg.h
adb.h enumclass.h name.h rdatastruct.h time.h
byaddr.h enumtype.h ncache.h rdatatype.h tkey.h
cache.h events.h nsec.h request.h tsig.h
callbacks.h fixedname.h peer.h resolver.h ttl.h
cert.h iptable.h portlist.h result.h types.h
compress.h journal.h private.h rootns.h validator.h
db.h keyflags.h rbt.h rpz.h version.h
dbiterator.h keytable.h rcode.h sdb.h view.h
dbtable.h keyvalues.h rdata.h sdlz.h xfrin.h
diff.h lib.h rdataclass.h secalg.h zone.h
dispatch.h log.h rdatalist.h secproto.h zonekey.h
dlz.h master.h rdataset.h soa.h zt.h
dnssec.h masterdump.h rdatasetiter.h ssu.h
include/dst:
dst.h gssapi.h lib.h result.h
include/isc:
app.h formatcheck.h md5.h quota.h stdtime.h
assertions.h fsaccess.h mem.h radix.h string.h
atomic.h hash.h msgcat.h random.h symtab.h
base64.h heap.h msgs.h ratelimiter.h syslog.h
bind9.h hex.h mutex.h refcount.h task.h
bitstring.h hmacmd5.h mutexblock.h region.h taskpool.h
boolean.h httpd.h namespace.h resource.h thread.h
buffer.h int.h net.h result.h time.h
bufferlist.h interfaceiter.h netaddr.h resultclass.h timer.h
commandline.h iterated_hash.h netdb.h rwlock.h types.h
condition.h lang.h offset.h serial.h util.h
dir.h lex.h once.h sha1.h version.h
entropy.h lfsr.h ondestroy.h sha2.h xml.h
error.h lib.h os.h sockaddr.h
event.h list.h parseint.h socket.h
eventclass.h log.h platform.h stdio.h
file.h magic.h print.h stdlib.h
include/isccc:
alist.h cc.h events.h result.h symtab.h types.h version.h
base64.h ccmsg.h lib.h sexpr.h symtype.h util.h
include/isccfg:
aclconf.h cfg.h grammar.h log.h namedconf.h version.h
include/lwres:
context.h ipv6.h list.h lwpacket.h net.h platform.h version.h
int.h lang.h lwbuffer.h lwres.h netdb.h result.h
lib/:
libbind9.a libdns.a libisc.a libisccc.a libisccfg.a liblwres.a
sbin/:
arpaname dnssec-revoke lwresd named-journalprint
ddns-confgen dnssec-settime named nsec3hash
dnssec-dsfromkey dnssec-signzone named-checkconf rndc
dnssec-keyfromlabel genrandom named-checkzone rndc-confgen
dnssec-keygen isc-hmac-fixup named-compilezone
share/man/man1:
arpaname.1 dig.1 host.1 isc-config.sh.1 nslookup.1 nsupdate.1
share/man/man3:
lwres.3 lwres_gabnresponse_render.3
lwres_addr_parse.3 lwres_gai_strerror.3
lwres_buffer.3 lwres_getaddrinfo.3
lwres_buffer_add.3 lwres_getaddrsbyname.3
lwres_buffer_back.3 lwres_gethostbyaddr.3
lwres_buffer_clear.3 lwres_gethostbyaddr_r.3
lwres_buffer_first.3 lwres_gethostbyname.3
lwres_buffer_forward.3 lwres_gethostbyname2.3
lwres_buffer_getmem.3 lwres_gethostbyname_r.3
lwres_buffer_getuint16.3 lwres_gethostent.3
lwres_buffer_getuint32.3 lwres_gethostent_r.3
lwres_buffer_getuint8.3 lwres_getipnode.3
lwres_buffer_init.3 lwres_getipnodebyaddr.3
lwres_buffer_invalidate.3 lwres_getipnodebyname.3
lwres_buffer_putmem.3 lwres_getnamebyaddr.3
lwres_buffer_putuint16.3 lwres_getnameinfo.3
lwres_buffer_putuint32.3 lwres_getrrsetbyname.3
lwres_buffer_putuint8.3 lwres_gnba.3
lwres_buffer_subtract.3 lwres_gnbarequest_free.3
lwres_conf_clear.3 lwres_gnbarequest_parse.3
lwres_conf_get.3 lwres_gnbarequest_render.3
lwres_conf_init.3 lwres_gnbaresponse_free.3
lwres_conf_parse.3 lwres_gnbaresponse_parse.3
lwres_conf_print.3 lwres_gnbaresponse_render.3
lwres_config.3 lwres_herror.3
lwres_context.3 lwres_hstrerror.3
lwres_context_allocmem.3 lwres_inetntop.3
lwres_context_create.3 lwres_lwpacket_parseheader.3
lwres_context_destroy.3 lwres_lwpacket_renderheader.3
lwres_context_freemem.3 lwres_net_ntop.3
lwres_context_initserial.3 lwres_noop.3
lwres_context_nextserial.3 lwres_nooprequest_free.3
lwres_context_sendrecv.3 lwres_nooprequest_parse.3
lwres_endhostent.3 lwres_nooprequest_render.3
lwres_endhostent_r.3 lwres_noopresponse_free.3
lwres_freeaddrinfo.3 lwres_noopresponse_parse.3
lwres_freehostent.3 lwres_noopresponse_render.3
lwres_gabn.3 lwres_packet.3
lwres_gabnrequest_free.3 lwres_resutil.3
lwres_gabnrequest_parse.3 lwres_sethostent.3
lwres_gabnrequest_render.3 lwres_sethostent_r.3
lwres_gabnresponse_free.3 lwres_string_parse.3
lwres_gabnresponse_parse.3
share/man/man5:
named.conf.5 rndc.conf.5
share/man/man8:
ddns-confgen.8 dnssec-settime.8 named-checkconf.8 nsec3hash.8
dnssec-dsfromkey.8 dnssec-signzone.8 named-checkzone.8 rndc-confgen.8
dnssec-keyfromlabel.8 genrandom.8 named-compilezone.8 rndc.8
dnssec-keygen.8 isc-hmac-fixup.8 named-journalprint.8
dnssec-revoke.8 lwresd.8 named.8
var/run:
DNSサービスを開始/停止するのに使う start/stopスクリプトも作成しておきます
検証環境は Gentooベースのシステムのため下記内容 /etc/init.d/bind (0755) となります
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$
PIDFILE=/var/run/named.pid
depend() {
need net.eth0
provide dns
}
start() {
ebegin "Starting bind"
/usr/local/sbin/named -u daemon
eend $?
}
stop() {
ebegin "Stopping bind"
/bin/kill `cat $PIDFILE`
eend $?
}
デーモンプロセスである named は daemonアカウントで動作させることにしています
ルートネームサーバのアドレスリストを取得しておきましょう
(ただし 今回の構成では実際に利用することはありません)
下記 2通りのいずれかの方法です
- FTP ftp://ftp.nic.ad.jp/internic/domain/named.rootから直接取得
- digコマンドにより取得 dig @A.ROOT-SERVERS.NET. > /etc/namedb/named.root
named.root は下記のような内容になっています
; <<>> DiG 9.4.2 <<>> @A.ROOT-SERVERS.NET.
; (2 servers found)
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21878
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;. IN NS
;; ANSWER SECTION:
. 518400 IN NS m.root-servers.net.
. 518400 IN NS h.root-servers.net.
. 518400 IN NS b.root-servers.net.
. 518400 IN NS g.root-servers.net.
. 518400 IN NS f.root-servers.net.
. 518400 IN NS c.root-servers.net.
. 518400 IN NS a.root-servers.net.
. 518400 IN NS l.root-servers.net.
. 518400 IN NS d.root-servers.net.
. 518400 IN NS i.root-servers.net.
. 518400 IN NS k.root-servers.net.
. 518400 IN NS j.root-servers.net.
. 518400 IN NS e.root-servers.net.
;; ADDITIONAL SECTION:
m.root-servers.net. 3600000 IN A 202.12.27.33
m.root-servers.net. 3600000 IN AAAA 2001:dc3::35
h.root-servers.net. 3600000 IN A 128.63.2.53
h.root-servers.net. 3600000 IN AAAA 2001:500:1::803f:235
b.root-servers.net. 3600000 IN A 192.228.79.201
g.root-servers.net. 3600000 IN A 192.112.36.4
f.root-servers.net. 3600000 IN A 192.5.5.241
f.root-servers.net. 3600000 IN AAAA 2001:500:2f::f
c.root-servers.net. 3600000 IN A 192.33.4.12
a.root-servers.net. 3600000 IN A 198.41.0.4
a.root-servers.net. 3600000 IN AAAA 2001:503:ba3e::2:30
l.root-servers.net. 3600000 IN A 199.7.83.42
l.root-servers.net. 3600000 IN AAAA 2001:500:3::42
d.root-servers.net. 3600000 IN A 128.8.10.90
;; Query time: 69 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Oct 12 22:45:39 2011
;; MSG SIZE rcvd: 512
13個のルートネームサーバが登録されており
うちいくつかのサーバは AAAA つまり IPv6によるクエリに対応していることが分かります
ルートネームサーバの用途としては
自ネームサーバが管理していない 外部ドメインなどの名前解決の問い合わせが来た時に
自力でインターネットに名前解決を問い合わせる 最初の問い合わせ先になります
ただし検証環境の構成では
外部名前解決はプロバイダが提供しているネームサーバに問い合わせることになるので
named.root は実際利用することはありません
続いての準備ですが
rndcコマンドで管理オペレーションをする際の 認証設定を行います
鍵を生成してから 設定ファイルに反映させます
まず鍵の生成ですが 以下のいずれかの方法で行います
dnssec-keygenを使って鍵を作成するのが下記の方法です
$ dnssec-keygen -a HMAC-MD5 -b 512 -n USER -r /dev/urandom mydomain
Kmydomain.+157+15789
$ ls Kmydomain*
Kmydomain.+157+15789.key Kmydomain.+157+15789.private
$ cat Kmydomain.+157+15789.key
mydomain. IN KEY 0 3 157 3******************************************************* *****************************w==
deer@phenom /ram $ cat Kmydomain.+157+15789.private
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 3************************************************************************************w==
Bits: AAA=
Created: 20111013062944
Publish: 20111013062944
Activate: 20111013062944
$
上記2ファイルは 鍵の内容を一部伏せていますが HMAC-MD5自体が共通鍵方式なので内容は同じです
.private側の文字列を後で設定ファイルに取り込みます
別の手段として次の rndc-confgenコマンドを使う方が手順としては楽でしょう
$ su
# rndc-confgen -a -b 512 -k mydomain
wrote key file "/usr/etc/rndc.key"
# cat /usr/etc/rndc.key
# Start of rndc.conf
key "mydomain" {
algorithm hmac-md5;
secret "c************************************************************************************w==";
};
options {
default-key "mydomain";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf
# Use with the following in named.conf, adjusting the allow list as needed:
# key "mydomain" {
# algorithm hmac-md5;
# secret "c************************************************************************************w==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "mydomain"; };
# };
# End of named.conf
直接 rndc.key フォーマットの設定ファイルを出力してくれます
作成した鍵を 設定ファイルに反映させます
まず クライアント用の設定ですが /usr/etc/rndc.key もしくは /usr/etc/rndc.conf
を上記の内容で作成します
dnssec-keygenを使った場合は secretの箇所に .private の Key: 鍵データを貼り付けます
rndc-confgenを使った場合は /usr/etc/rndc.key がそのまま使えます
サーバ用の設定ですが /usr/etc/named.conf に keyセクションと controlsセクションを記述します
bindの設定も含めて下記内容となります
acl "mydomain4" {
127.0.0.1/32;
192.168.1.0/24;
};
acl "mydomain6" {
::1/128;
fe80::/64;
};
options {
directory "/usr/etc";
pid-file "/var/run/named.pid";
port 53;
max-cache-size 4m;
listen-on { mydomain4; };
listen-on-v6 { mydomain6; };
forwarders { 2408:**:****:0:2***:****:****:***9; };
};
key "mydomain" {
algorithm hmac-md5;
secret "c************************************************************************************w==";
};
controls {
inet ::1 allow { ::1; } keys { mydomain; };
};
zone "." in {
type hint;
file "named.root";
};
zone "mydomain" in {
type master;
file "mydomain.zone";
};
zone "0.0.127.in-addr.arpa" {
type master;
file "0.0.127.in-addr.arpa.zone";
};
zone "1.168.192.in-addr.arpa" {
type master;
file "1.168.192.in-addr.arpa.zone";
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" {
type master;
file "0.0.0.fe80.in-addr.arpa.zone";
};
optionsセンテンスの listen-onで IPv4用 IPv6用 のアクセスリストを指定しています
それぞれのアクセスリストには ループバックと DNSクエリを受け付けたいネットワークを指定します
(これで 該当するネットワークインターフェースで DNSクエリを受け付けるようになります)
optionsセンテンスの forwardersには 上流フレッツ網のDNSサーバを指定します
IPv6アドレスで指定していますが IPv4アドレスの指定も可能です
forwardersがないと namedは直接インターネットに問い合わせようとして失敗します
(フレッツ光では インターネットへの直接問い合わせを禁止しています)
keyセンテンスには 先ほど設定した rndc用のキーを指定します
また rndc接続許可アドレスを controlsセンテンスで設定しています
これで rndcコマンドを受け付けるようになります
後は zoneセンテンスで各種 IPv6/IPv4問い合わせに対する設定をしています
IPv6の設定は グローバルアドレスではなくリンクローカルアドレス(fe80::/64)を使っていますが
リンクローカルアドレスを設定するのは ルール違反です
今回 IPv6インターネットが使えるようになるまでの暫定措置と動作確認用です
各ゾーンファイルの内容は下記の通りです
mydomain.zone (正引き用)
$TTL 3600
@ IN SOA phenom.mydomain. postmaster.mydomain. (
2011102402; serial
3600; refresh
100; retry
604800; expire
86400; negative
)
IN NS phenom4.mydomain.
IN MX 10 phenom4.mydomain.
aterm4 IN A 192.168.1.1
aterm IN AAAA fe80::2***:****:****:***9
phenom4 IN A 192.168.1.254
phenom IN AAAA fe80::1***:****:****:***a
0.0.127.in-addr.arpa.zone (IPv4逆引き)
$TTL 3600
@ IN SOA phenom.mydomain. postmaster.mydomain. (
2011102003; serial
3600; refresh
900; retry
604800; expire
86400; negative
)
IN NS phenom4.mydomain.
IN MX 10 phenom4.mydomain.
1 IN PTR localhost-v4.mydomain.
1.168.192.in-addr.arpa.zone (IPv4逆引き)
$TTL 3600
@ IN SOA phenom.mydomain. postmaster.mydomain. (
2011102002; serial
3600; refresh
900; retry
604800; expire
86400; negative
)
IN NS phenom.mydomain.
IN MX 10 phenom.mydomain.
1 IN PTR aterm4.mydomain.
254 IN PTR phenom4.mydomain.
0.0.0.fe80.in-addr.arpa.zone (IPv6逆引き)
$TTL 3600
@ IN SOA phenom.mydomain. postmaster.mydomain. (
2011101802; serial
3600; refresh
900; retry
604800; expire
86400; negative
)
IN NS phenom.mydomain.
IN MX 10 phenom.mydomain.
9.*.*.*.*.*.*.*.*.*.*.*.*.*.*.2 IN PTR aterm.mydomain.
a.*.*.*.*.*.*.*.*.*.*.*.*.*.*.1 IN PTR phenom.mydomain.
IPv6アドレスの一部は伏字にしています
現在 aterm(ルータ)と phenom(DNSサーバ自身)の設定のみですが
後で XBox360 や Wii も設定します
クライアント設定も行っておきましょう
Windowsであれば ネットワークのプロパティ画面から
UNIX系であれば /etc/resolv.conf を設定します
動作確認
namedを起動します
# /etc/init.d/named start
* Starting bind ... [ ok ]
# netstat -a | grep domain
tcp 0 0 phenom4.mydomain:domain *:* LISTEN
tcp 0 0 localhost:domain *:* LISTEN
tcp6 0 0 phenom.mydomain:domain [::]:* LISTEN
tcp6 0 0 localhost:domain [::]:* LISTEN
udp 0 0 phenom4.mydomain:domain *:*
udp 0 0 localhost:domain *:*
udp6 0 0 phenom.mydomain:domain [::]:*
udp6 0 0 localhost:domain [::]:*
Active UNIX domain sockets (servers and established)
#
Linuxクライアントで名前解決できることを確認します
$ ping6 -I eth0 -c 2 aterm
PING aterm(aterm.mydomain) from fe80::1***:****:****:***a eth0: 56 data bytes
64 bytes from aterm.mydomain: icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from aterm.mydomain: icmp_seq=2 ttl=64 time=0.152 ms
--- aterm ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.151/0.151/0.152/0.012 ms
$ ping6 -c 2 ds.test-ipv6.jp
PING ds.test-ipv6.jp(2406:800:3:141::196) 56 data bytes
--- ds.test-ipv6.jp ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
$
自宅内ホストへの ping疎通はOKですが リンクローカルアドレスを設定しているので -I 指定が必要です
インターネット上の IPv6テストサイト(ds.test-ipv6.jp)は疎通しませんでした
IPv6アドレスまでは解決されましたが肝心の IPv6ネットワークが分断されているためです
IPv4も確認しておきましょう
$ ping -c 2 aterm4
PING aterm4.mydomain (192.168.1.1) 56(84) bytes of data.
64 bytes from aterm4.mydomain (192.168.1.1): icmp_req=1 ttl=64 time=0.134 ms
64 bytes from aterm4.mydomain (192.168.1.1): icmp_req=2 ttl=64 time=0.129 ms
--- aterm4.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.129/0.131/0.134/0.011 ms
$ ping -c 2 www.google.com
PING www.l.google.com (74.125.31.104) 56(84) bytes of data.
64 bytes from tb-in-f104.1e100.net (74.125.31.104): icmp_req=1 ttl=44 time=36.6 ms
64 bytes from tb-in-f104.1e100.net (74.125.31.104): icmp_req=2 ttl=44 time=37.4 ms
--- www.l.google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 36.630/37.040/37.450/0.410 ms
$
IPv4 各ネットワークも通常通り疎通します
Windowsの コマンドプロンプトからも確認しておきます
C:\\Users\\admin>nslookup phenom
サーバー: phenom.mydomain
Address: fe80::1***:****:****:***a
名前: phenom.mydomain
Address: fe80::1***:****:****:***a
C:\\Users\\admin>nslookup phenom4
サーバー: phenom.mydomain
Address: fe80::1***:****:****:***a
名前: phenom4.mydomain
Address: 192.168.1.254
C:\\Users\\admin>nslookup ds.test-ipv6.com
サーバー: phenom.mydomain
Address: fe80::1***:****:****:***a
権限のない回答:
名前: ds.test-ipv6.com
Addresses: 2001:470:1:18::2
216.218.228.114
C:\\Users\\admin>
IPv6 IPv4 どちらのクエリにも対応できています
自宅の IPv6環境を構築しました
プロバイダの DNSサーバまでIPv6で通信して IPv6アドレスの解決までできることを確認しました
IPv6が利用可能な環境はすぐ近くまで来ています
IPv6サーバツールへ戻る
CPU | AMD PhenomII X4 905e (2.5GHz 4コア) |
---|---|
メモリ | 16GB |
OS | Gentoo-1.12.14ベース Linux-3.0 UTF-8 |
コンパイラ | gcc-4.5.2 |
Cライブラリ | glibc-2.13 |
ODBC | libiodbc-3.52.7 |
BerkeleyDB | 5.1.25.NC |
PostgreSQL | 9.1 |
MySQL | 5.5.15 |
Oracle | 11g Express Edition Release2 |
LDAP | OpenLDAP-2.4.23 |
BIND | 9.8.1 |
ここで なぜ(自宅に)DNSサーバが必要で DNSのIPv6化が何を指しているのかを説明します
まず IPv6ネットワークの状況ですが
フレッツルータから下の部分は 自宅LANの状況です
今回 IPv6対応の DNSサーバを構築するのが目的です
フレッツ網は IPv6も可能ですが インターネット上の他のIPv6網と分断されています (2011年状況)
従って インターネット上の他のIPv6ネットワークへは直接通信が届きません
自宅内に複数の 端末/サーバ/ルータ があってホスト名をつけたい場合
今回のように 「自宅にDNSサーバを立てる必要がある」のです
IPv6通信するのは 赤の矢印の部分です 通信は IPv6ですが
IPv4ホスト名(Aレコード)/IPv6ホスト名(AAAAレコード) どちらも解決できます
インターネットの IPv6通信は分断された状態ですが
フレッツ網の DNSサーバはどうやって 他IPv6網の名前情報にアクセスしているのでしょうか?
上図は IPv4通信の状況です
フレッツのDNSサーバは IPv4を使って IPv6/IPv4名前解決をしていると思われます
(フレッツ網内の仕組みは詳しくないので ひょっとしたら違うかも)
いずれにしても 自宅の IPv6/IPv4 DNS化は下記前提で行います
- フレッツ網内の DNSサーバが IPv6(AAAA)/IPv4(A) どちらも解決可能
- フレッツ網内の DNSサーバへ IPv6通信で問い合わせる (IPv4通信でも可能だが)
- 自宅DNSサーバは IPv6(AAAA)/IPv4(A) 解決可能 かつ IPv6通信/IPv4通信 可能
インストール
$ tar -xzf bind-9.8.1.tar.gz
$ cd bind-9.8.1
$ ./configure --prefix=/ram --localstatedir=/ram/var --with-openssl --enable-threads --enable-atomic --with-randomdev=/dev/urandom --enable-getifaddrs --with-dlz-postgres=yes --with-dlz-mysql=/usr/mysql --with-dlz-bdb=yes --with-dlz-filesystem=yes --with-dlz-ldap=yes --with-dlz-odbc=yes --with-dlz-stub=yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
〜
make[1]: Leaving directory `/ram/bind-9.8.1/doc'
rm -f *.o *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2
rm -rf .depend .libs
rm -f FAQ.tmp
$ make
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make&apos に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます
〜
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:487: undefined reference to `sdlzh_build_querystring'
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:484: undefined reference to `sdlzh_build_querystring'
〜
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_odbc_driver.c:1404: undefined reference to `sdlzh_build_sqldbinstance'
collect2: ld はステータス 1 で終了しました
make[2]: *** [named] エラー 1
make[2]: ディレクトリ `/home/admin/bind-9.8.1/bin/named' から出ます
make[1]: *** [subdirs] エラー 1
make[1]: ディレクトリ `/home/admin/bind-9.8.1/bin' から出ます
make: *** [subdirs] エラー 1
$
$ tar -xzf bind-9.8.1.tar.gz $ cd bind-9.8.1 $ ./configure --prefix=/ram --localstatedir=/ram/var --with-openssl --enable-threads --enable-atomic --with-randomdev=/dev/urandom --enable-getifaddrs --with-dlz-postgres=yes --with-dlz-mysql=/usr/mysql --with-dlz-bdb=yes --with-dlz-filesystem=yes --with-dlz-ldap=yes --with-dlz-odbc=yes --with-dlz-stub=yes checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking whether make sets $(MAKE)... yes checking for gcc... gcc 〜 make[1]: Leaving directory `/ram/bind-9.8.1/doc' rm -f *.o *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2 rm -rf .depend .libs rm -f FAQ.tmp $ make making all in /home/admin/bind-9.8.1/make make[1]: ディレクトリ `/home/admin/bind-9.8.1/make&apos に入ります make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます 〜 /home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:487: undefined reference to `sdlzh_build_querystring' /home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:484: undefined reference to `sdlzh_build_querystring' 〜 /home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_odbc_driver.c:1404: undefined reference to `sdlzh_build_sqldbinstance' collect2: ld はステータス 1 で終了しました make[2]: *** [named] エラー 1 make[2]: ディレクトリ `/home/admin/bind-9.8.1/bin/named' から出ます make[1]: *** [subdirs] エラー 1 make[1]: ディレクトリ `/home/admin/bind-9.8.1/bin' から出ます make: *** [subdirs] エラー 1 $
大量の undefined referenceエラーが出ました bind-9.8.1固有のバグのようです
contrib/dlz/drivers/sdlz_helper.c を下記のように修正することで回避できます
52 53 #ifdef DLZ 54 ↓ 52 53 //#ifdef DLZ 54
530 531 #endif ↓ 530 531 //#endif
再度 makeします
$ make making all in /home/admin/bind-9.8.1/make make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' に入ります make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます 〜 making all in /home/admin/bind-9.8.1/doc/doxygen make[2]: ディレクトリ `/home/admin/bind-9.8.1/doc/doxygen' に入ります make[2]: ディレクトリ `/home/admin/bind-9.8.1/doc/doxygen' から出ます make[1]: ディレクトリ `/home/admin/bind-9.8.1/doc' から出ます $ su # make install making all in /home/admin/bind-9.8.1/make make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' に入ります make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます 〜 /bin/sh ./mkinstalldirs /usr/share/man/man1 /usr/bin/install -c isc-config.sh /usr/bin /usr/bin/install -c -m 644 ./isc-config.sh.1 /usr/share/man/man1 /usr/bin/install -c -m 644 ./bind.keys /usr/etc $
インストールされるファイルは下記の通りです
bin/: dig host isc-config.sh nslookup nsupdate etc/: bind.keys include/bind9: check.h getaddresses.h version.h include/dns: acl.h ds.h message.h rdataslab.h tcpmsg.h adb.h enumclass.h name.h rdatastruct.h time.h byaddr.h enumtype.h ncache.h rdatatype.h tkey.h cache.h events.h nsec.h request.h tsig.h callbacks.h fixedname.h peer.h resolver.h ttl.h cert.h iptable.h portlist.h result.h types.h compress.h journal.h private.h rootns.h validator.h db.h keyflags.h rbt.h rpz.h version.h dbiterator.h keytable.h rcode.h sdb.h view.h dbtable.h keyvalues.h rdata.h sdlz.h xfrin.h diff.h lib.h rdataclass.h secalg.h zone.h dispatch.h log.h rdatalist.h secproto.h zonekey.h dlz.h master.h rdataset.h soa.h zt.h dnssec.h masterdump.h rdatasetiter.h ssu.h include/dst: dst.h gssapi.h lib.h result.h include/isc: app.h formatcheck.h md5.h quota.h stdtime.h assertions.h fsaccess.h mem.h radix.h string.h atomic.h hash.h msgcat.h random.h symtab.h base64.h heap.h msgs.h ratelimiter.h syslog.h bind9.h hex.h mutex.h refcount.h task.h bitstring.h hmacmd5.h mutexblock.h region.h taskpool.h boolean.h httpd.h namespace.h resource.h thread.h buffer.h int.h net.h result.h time.h bufferlist.h interfaceiter.h netaddr.h resultclass.h timer.h commandline.h iterated_hash.h netdb.h rwlock.h types.h condition.h lang.h offset.h serial.h util.h dir.h lex.h once.h sha1.h version.h entropy.h lfsr.h ondestroy.h sha2.h xml.h error.h lib.h os.h sockaddr.h event.h list.h parseint.h socket.h eventclass.h log.h platform.h stdio.h file.h magic.h print.h stdlib.h include/isccc: alist.h cc.h events.h result.h symtab.h types.h version.h base64.h ccmsg.h lib.h sexpr.h symtype.h util.h include/isccfg: aclconf.h cfg.h grammar.h log.h namedconf.h version.h include/lwres: context.h ipv6.h list.h lwpacket.h net.h platform.h version.h int.h lang.h lwbuffer.h lwres.h netdb.h result.h lib/: libbind9.a libdns.a libisc.a libisccc.a libisccfg.a liblwres.a sbin/: arpaname dnssec-revoke lwresd named-journalprint ddns-confgen dnssec-settime named nsec3hash dnssec-dsfromkey dnssec-signzone named-checkconf rndc dnssec-keyfromlabel genrandom named-checkzone rndc-confgen dnssec-keygen isc-hmac-fixup named-compilezone share/man/man1: arpaname.1 dig.1 host.1 isc-config.sh.1 nslookup.1 nsupdate.1 share/man/man3: lwres.3 lwres_gabnresponse_render.3 lwres_addr_parse.3 lwres_gai_strerror.3 lwres_buffer.3 lwres_getaddrinfo.3 lwres_buffer_add.3 lwres_getaddrsbyname.3 lwres_buffer_back.3 lwres_gethostbyaddr.3 lwres_buffer_clear.3 lwres_gethostbyaddr_r.3 lwres_buffer_first.3 lwres_gethostbyname.3 lwres_buffer_forward.3 lwres_gethostbyname2.3 lwres_buffer_getmem.3 lwres_gethostbyname_r.3 lwres_buffer_getuint16.3 lwres_gethostent.3 lwres_buffer_getuint32.3 lwres_gethostent_r.3 lwres_buffer_getuint8.3 lwres_getipnode.3 lwres_buffer_init.3 lwres_getipnodebyaddr.3 lwres_buffer_invalidate.3 lwres_getipnodebyname.3 lwres_buffer_putmem.3 lwres_getnamebyaddr.3 lwres_buffer_putuint16.3 lwres_getnameinfo.3 lwres_buffer_putuint32.3 lwres_getrrsetbyname.3 lwres_buffer_putuint8.3 lwres_gnba.3 lwres_buffer_subtract.3 lwres_gnbarequest_free.3 lwres_conf_clear.3 lwres_gnbarequest_parse.3 lwres_conf_get.3 lwres_gnbarequest_render.3 lwres_conf_init.3 lwres_gnbaresponse_free.3 lwres_conf_parse.3 lwres_gnbaresponse_parse.3 lwres_conf_print.3 lwres_gnbaresponse_render.3 lwres_config.3 lwres_herror.3 lwres_context.3 lwres_hstrerror.3 lwres_context_allocmem.3 lwres_inetntop.3 lwres_context_create.3 lwres_lwpacket_parseheader.3 lwres_context_destroy.3 lwres_lwpacket_renderheader.3 lwres_context_freemem.3 lwres_net_ntop.3 lwres_context_initserial.3 lwres_noop.3 lwres_context_nextserial.3 lwres_nooprequest_free.3 lwres_context_sendrecv.3 lwres_nooprequest_parse.3 lwres_endhostent.3 lwres_nooprequest_render.3 lwres_endhostent_r.3 lwres_noopresponse_free.3 lwres_freeaddrinfo.3 lwres_noopresponse_parse.3 lwres_freehostent.3 lwres_noopresponse_render.3 lwres_gabn.3 lwres_packet.3 lwres_gabnrequest_free.3 lwres_resutil.3 lwres_gabnrequest_parse.3 lwres_sethostent.3 lwres_gabnrequest_render.3 lwres_sethostent_r.3 lwres_gabnresponse_free.3 lwres_string_parse.3 lwres_gabnresponse_parse.3 share/man/man5: named.conf.5 rndc.conf.5 share/man/man8: ddns-confgen.8 dnssec-settime.8 named-checkconf.8 nsec3hash.8 dnssec-dsfromkey.8 dnssec-signzone.8 named-checkzone.8 rndc-confgen.8 dnssec-keyfromlabel.8 genrandom.8 named-compilezone.8 rndc.8 dnssec-keygen.8 isc-hmac-fixup.8 named-journalprint.8 dnssec-revoke.8 lwresd.8 named.8 var/run:
DNSサービスを開始/停止するのに使う start/stopスクリプトも作成しておきます
検証環境は Gentooベースのシステムのため下記内容 /etc/init.d/bind (0755) となります
#!/sbin/runscript # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header$ PIDFILE=/var/run/named.pid depend() { need net.eth0 provide dns } start() { ebegin "Starting bind" /usr/local/sbin/named -u daemon eend $? } stop() { ebegin "Stopping bind" /bin/kill `cat $PIDFILE` eend $? }
デーモンプロセスである named は daemonアカウントで動作させることにしています
ルートネームサーバのアドレスリストを取得しておきましょう
(ただし 今回の構成では実際に利用することはありません)
下記 2通りのいずれかの方法です
- FTP ftp://ftp.nic.ad.jp/internic/domain/named.rootから直接取得
- digコマンドにより取得 dig @A.ROOT-SERVERS.NET. > /etc/namedb/named.root
named.root は下記のような内容になっています
; <<>> DiG 9.4.2 <<>> @A.ROOT-SERVERS.NET. ; (2 servers found) ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21878 ;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;. IN NS ;; ANSWER SECTION: . 518400 IN NS m.root-servers.net. . 518400 IN NS h.root-servers.net. . 518400 IN NS b.root-servers.net. . 518400 IN NS g.root-servers.net. . 518400 IN NS f.root-servers.net. . 518400 IN NS c.root-servers.net. . 518400 IN NS a.root-servers.net. . 518400 IN NS l.root-servers.net. . 518400 IN NS d.root-servers.net. . 518400 IN NS i.root-servers.net. . 518400 IN NS k.root-servers.net. . 518400 IN NS j.root-servers.net. . 518400 IN NS e.root-servers.net. ;; ADDITIONAL SECTION: m.root-servers.net. 3600000 IN A 202.12.27.33 m.root-servers.net. 3600000 IN AAAA 2001:dc3::35 h.root-servers.net. 3600000 IN A 128.63.2.53 h.root-servers.net. 3600000 IN AAAA 2001:500:1::803f:235 b.root-servers.net. 3600000 IN A 192.228.79.201 g.root-servers.net. 3600000 IN A 192.112.36.4 f.root-servers.net. 3600000 IN A 192.5.5.241 f.root-servers.net. 3600000 IN AAAA 2001:500:2f::f c.root-servers.net. 3600000 IN A 192.33.4.12 a.root-servers.net. 3600000 IN A 198.41.0.4 a.root-servers.net. 3600000 IN AAAA 2001:503:ba3e::2:30 l.root-servers.net. 3600000 IN A 199.7.83.42 l.root-servers.net. 3600000 IN AAAA 2001:500:3::42 d.root-servers.net. 3600000 IN A 128.8.10.90 ;; Query time: 69 msec ;; SERVER: 198.41.0.4#53(198.41.0.4) ;; WHEN: Wed Oct 12 22:45:39 2011 ;; MSG SIZE rcvd: 512
13個のルートネームサーバが登録されており
うちいくつかのサーバは AAAA つまり IPv6によるクエリに対応していることが分かります
ルートネームサーバの用途としては
自ネームサーバが管理していない 外部ドメインなどの名前解決の問い合わせが来た時に
自力でインターネットに名前解決を問い合わせる 最初の問い合わせ先になります
ただし検証環境の構成では
外部名前解決はプロバイダが提供しているネームサーバに問い合わせることになるので
named.root は実際利用することはありません
続いての準備ですが
rndcコマンドで管理オペレーションをする際の 認証設定を行います
鍵を生成してから 設定ファイルに反映させます
まず鍵の生成ですが 以下のいずれかの方法で行います
dnssec-keygenを使って鍵を作成するのが下記の方法です
$ dnssec-keygen -a HMAC-MD5 -b 512 -n USER -r /dev/urandom mydomain Kmydomain.+157+15789 $ ls Kmydomain* Kmydomain.+157+15789.key Kmydomain.+157+15789.private $ cat Kmydomain.+157+15789.key mydomain. IN KEY 0 3 157 3******************************************************* *****************************w== deer@phenom /ram $ cat Kmydomain.+157+15789.private Private-key-format: v1.3 Algorithm: 157 (HMAC_MD5) Key: 3************************************************************************************w== Bits: AAA= Created: 20111013062944 Publish: 20111013062944 Activate: 20111013062944 $
上記2ファイルは 鍵の内容を一部伏せていますが HMAC-MD5自体が共通鍵方式なので内容は同じです
.private側の文字列を後で設定ファイルに取り込みます
別の手段として次の rndc-confgenコマンドを使う方が手順としては楽でしょう
$ su # rndc-confgen -a -b 512 -k mydomain wrote key file "/usr/etc/rndc.key" # cat /usr/etc/rndc.key # Start of rndc.conf key "mydomain" { algorithm hmac-md5; secret "c************************************************************************************w=="; }; options { default-key "mydomain"; default-server 127.0.0.1; default-port 953; }; # End of rndc.conf # Use with the following in named.conf, adjusting the allow list as needed: # key "mydomain" { # algorithm hmac-md5; # secret "c************************************************************************************w=="; # }; # # controls { # inet 127.0.0.1 port 953 # allow { 127.0.0.1; } keys { "mydomain"; }; # }; # End of named.conf
直接 rndc.key フォーマットの設定ファイルを出力してくれます
作成した鍵を 設定ファイルに反映させます
まず クライアント用の設定ですが /usr/etc/rndc.key もしくは /usr/etc/rndc.conf
を上記の内容で作成します
dnssec-keygenを使った場合は secretの箇所に .private の Key: 鍵データを貼り付けます
rndc-confgenを使った場合は /usr/etc/rndc.key がそのまま使えます
サーバ用の設定ですが /usr/etc/named.conf に keyセクションと controlsセクションを記述します
bindの設定も含めて下記内容となります
acl "mydomain4" { 127.0.0.1/32; 192.168.1.0/24; }; acl "mydomain6" { ::1/128; fe80::/64; }; options { directory "/usr/etc"; pid-file "/var/run/named.pid"; port 53; max-cache-size 4m; listen-on { mydomain4; }; listen-on-v6 { mydomain6; }; forwarders { 2408:**:****:0:2***:****:****:***9; }; }; key "mydomain" { algorithm hmac-md5; secret "c************************************************************************************w=="; }; controls { inet ::1 allow { ::1; } keys { mydomain; }; }; zone "." in { type hint; file "named.root"; }; zone "mydomain" in { type master; file "mydomain.zone"; }; zone "0.0.127.in-addr.arpa" { type master; file "0.0.127.in-addr.arpa.zone"; }; zone "1.168.192.in-addr.arpa" { type master; file "1.168.192.in-addr.arpa.zone"; }; zone "0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" { type master; file "0.0.0.fe80.in-addr.arpa.zone"; };
optionsセンテンスの listen-onで IPv4用 IPv6用 のアクセスリストを指定しています
それぞれのアクセスリストには ループバックと DNSクエリを受け付けたいネットワークを指定します
(これで 該当するネットワークインターフェースで DNSクエリを受け付けるようになります)
optionsセンテンスの forwardersには 上流フレッツ網のDNSサーバを指定します
IPv6アドレスで指定していますが IPv4アドレスの指定も可能です
forwardersがないと namedは直接インターネットに問い合わせようとして失敗します
(フレッツ光では インターネットへの直接問い合わせを禁止しています)
keyセンテンスには 先ほど設定した rndc用のキーを指定します
また rndc接続許可アドレスを controlsセンテンスで設定しています
これで rndcコマンドを受け付けるようになります
後は zoneセンテンスで各種 IPv6/IPv4問い合わせに対する設定をしています
IPv6の設定は グローバルアドレスではなくリンクローカルアドレス(fe80::/64)を使っていますが
リンクローカルアドレスを設定するのは ルール違反です
今回 IPv6インターネットが使えるようになるまでの暫定措置と動作確認用です
各ゾーンファイルの内容は下記の通りです
mydomain.zone (正引き用)
$TTL 3600 @ IN SOA phenom.mydomain. postmaster.mydomain. ( 2011102402; serial 3600; refresh 100; retry 604800; expire 86400; negative ) IN NS phenom4.mydomain. IN MX 10 phenom4.mydomain. aterm4 IN A 192.168.1.1 aterm IN AAAA fe80::2***:****:****:***9 phenom4 IN A 192.168.1.254 phenom IN AAAA fe80::1***:****:****:***a
0.0.127.in-addr.arpa.zone (IPv4逆引き)
$TTL 3600 @ IN SOA phenom.mydomain. postmaster.mydomain. ( 2011102003; serial 3600; refresh 900; retry 604800; expire 86400; negative ) IN NS phenom4.mydomain. IN MX 10 phenom4.mydomain. 1 IN PTR localhost-v4.mydomain.
1.168.192.in-addr.arpa.zone (IPv4逆引き)
$TTL 3600 @ IN SOA phenom.mydomain. postmaster.mydomain. ( 2011102002; serial 3600; refresh 900; retry 604800; expire 86400; negative ) IN NS phenom.mydomain. IN MX 10 phenom.mydomain. 1 IN PTR aterm4.mydomain. 254 IN PTR phenom4.mydomain.
0.0.0.fe80.in-addr.arpa.zone (IPv6逆引き)
$TTL 3600 @ IN SOA phenom.mydomain. postmaster.mydomain. ( 2011101802; serial 3600; refresh 900; retry 604800; expire 86400; negative ) IN NS phenom.mydomain. IN MX 10 phenom.mydomain. 9.*.*.*.*.*.*.*.*.*.*.*.*.*.*.2 IN PTR aterm.mydomain. a.*.*.*.*.*.*.*.*.*.*.*.*.*.*.1 IN PTR phenom.mydomain.
IPv6アドレスの一部は伏字にしています
現在 aterm(ルータ)と phenom(DNSサーバ自身)の設定のみですが
後で XBox360 や Wii も設定します
クライアント設定も行っておきましょう
Windowsであれば ネットワークのプロパティ画面から
UNIX系であれば /etc/resolv.conf を設定します
動作確認
namedを起動します
# /etc/init.d/named start
* Starting bind ... [ ok ]
# netstat -a | grep domain
tcp 0 0 phenom4.mydomain:domain *:* LISTEN
tcp 0 0 localhost:domain *:* LISTEN
tcp6 0 0 phenom.mydomain:domain [::]:* LISTEN
tcp6 0 0 localhost:domain [::]:* LISTEN
udp 0 0 phenom4.mydomain:domain *:*
udp 0 0 localhost:domain *:*
udp6 0 0 phenom.mydomain:domain [::]:*
udp6 0 0 localhost:domain [::]:*
Active UNIX domain sockets (servers and established)
#
# /etc/init.d/named start * Starting bind ... [ ok ] # netstat -a | grep domain tcp 0 0 phenom4.mydomain:domain *:* LISTEN tcp 0 0 localhost:domain *:* LISTEN tcp6 0 0 phenom.mydomain:domain [::]:* LISTEN tcp6 0 0 localhost:domain [::]:* LISTEN udp 0 0 phenom4.mydomain:domain *:* udp 0 0 localhost:domain *:* udp6 0 0 phenom.mydomain:domain [::]:* udp6 0 0 localhost:domain [::]:* Active UNIX domain sockets (servers and established) #
Linuxクライアントで名前解決できることを確認します
$ ping6 -I eth0 -c 2 aterm PING aterm(aterm.mydomain) from fe80::1***:****:****:***a eth0: 56 data bytes 64 bytes from aterm.mydomain: icmp_seq=1 ttl=64 time=0.151 ms 64 bytes from aterm.mydomain: icmp_seq=2 ttl=64 time=0.152 ms --- aterm ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.151/0.151/0.152/0.012 ms $ ping6 -c 2 ds.test-ipv6.jp PING ds.test-ipv6.jp(2406:800:3:141::196) 56 data bytes --- ds.test-ipv6.jp ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 999ms $
自宅内ホストへの ping疎通はOKですが リンクローカルアドレスを設定しているので -I 指定が必要です
インターネット上の IPv6テストサイト(ds.test-ipv6.jp)は疎通しませんでした
IPv6アドレスまでは解決されましたが肝心の IPv6ネットワークが分断されているためです
IPv4も確認しておきましょう
$ ping -c 2 aterm4 PING aterm4.mydomain (192.168.1.1) 56(84) bytes of data. 64 bytes from aterm4.mydomain (192.168.1.1): icmp_req=1 ttl=64 time=0.134 ms 64 bytes from aterm4.mydomain (192.168.1.1): icmp_req=2 ttl=64 time=0.129 ms --- aterm4.local ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.129/0.131/0.134/0.011 ms $ ping -c 2 www.google.com PING www.l.google.com (74.125.31.104) 56(84) bytes of data. 64 bytes from tb-in-f104.1e100.net (74.125.31.104): icmp_req=1 ttl=44 time=36.6 ms 64 bytes from tb-in-f104.1e100.net (74.125.31.104): icmp_req=2 ttl=44 time=37.4 ms --- www.l.google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 36.630/37.040/37.450/0.410 ms $
IPv4 各ネットワークも通常通り疎通します
Windowsの コマンドプロンプトからも確認しておきます
C:\\Users\\admin>nslookup phenom サーバー: phenom.mydomain Address: fe80::1***:****:****:***a 名前: phenom.mydomain Address: fe80::1***:****:****:***a C:\\Users\\admin>nslookup phenom4 サーバー: phenom.mydomain Address: fe80::1***:****:****:***a 名前: phenom4.mydomain Address: 192.168.1.254 C:\\Users\\admin>nslookup ds.test-ipv6.com サーバー: phenom.mydomain Address: fe80::1***:****:****:***a 権限のない回答: 名前: ds.test-ipv6.com Addresses: 2001:470:1:18::2 216.218.228.114 C:\\Users\\admin>
IPv6 IPv4 どちらのクエリにも対応できています