IPv6に勤しんでみる bind 正引き

IPv6の続きです。毎回あの難解なv6のアドレスを打つのは大変なのでbindをいれてAAAAを返せるようにしてみようと思います。
ちなみに前回リモートホストからtelnetで80番をたたけなかったのは、いないと思っていたip6tables様にディフェンスされていたせいでした。良い仕事してやがる・・・。
どーもデフォルトで入るみたいですね。とりあえず止まっておいてもらいました。

 # /etc/init.d/ip6tables off
 # chkconfig ip6tables off

ふむ。
いくつかデーモンを入れたらフィルタリングもきっちり書かなきゃですね。

 $ wget http://ftp.isc.org/isc/bind9/9.6.0-P1/bind-9.6.0-P1.tar.gz
 $ tar zxvf bind-9.6.0-P1.tar.gz
 $ cd bind-9.6.0-P1

ISCデザイン変わった? https://www.isc.org/ まあそれはさておき、
デフォルトのままconfigureすればAAAAも書ける気がしますがオプションがあるか一応調べてみておきます。

 $ grep v6 
 
  --enable-ipv6         use IPv6 default=autodetect
  --with-kame=PATH      use Kame IPv6 default path /usr/local/v6
        # POSIX doesn't include the IPv6 Advanced Socket API and glibc hides
        # parts of the IPv6 Advanced Socket API as a result.  This is stupid
        # as it breaks how the two halves (Basic and Advanced) of the IPv6
        # Define _GNU_SOURCE to pull in the IPv6 Advanced Socket API.

ふむ。自動検出のようですが一応enableつけておきますか。
もう一つ--with-kameってのがありますね。PosixはAdvanced Socket APIの機能を隠してるから有効にするっぽい事がかいてます。kameプロジェクト実装のipv6ライブラリのパスを指定してるのかな?...とりあえず試しにこっちはなしでいれてみます。

 $ ./configure --enable-ipv6 --disable-openssl-version-check
 $ make
 $ su
 # make install
 # ./mkinstalldirs /usr/local/bin/
 # /usr/bin/install -c isc-config.sh /usr/local/bin/
 # ./mkinstalldirs /usr/local/bind/bin /usr/local/bind/var/run/ /usr/local/bind/etc
 # /usr/bin/install -c isc-config.sh /usr/local/bind/bin

つづいて設定。インストールまわりは以前かいてたり つ http://d.hatena.ne.jp/clmind/20080719/1216455892
versionは違いますが。
では、まずは正引きから

# vi /usr/local/bind/etc/named.conf
 
key "rndc-key" {
    algorithm hmac-md5;
    secret "xxxxxxxxxxxxxxxxxxxxx";
};

controls {
    inet 127.0.0.1 port 953
    allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
    directory "/usr/local/bind/etc";
    pid-file "/usr/local/bind/var/run/named.pid";

    recursion yes;
    max-ncache-ttl  300;
    max-cache-ttl   3600;

    allow-query {
        any;
    };

    listen-on-v6 {
        any;
    };
};

logging {
    channel "default_syslog" {
        syslog local5;
    };
    category lame-servers {
        null;
    };
    category default {
        default_syslog;
    };
};

zone "v6" IN {
    type master;
    file "v6.zone";
};

optionsでlisten-on-v6を設定しておかないとダメな模様。

# vi v6.zone

$TTL 600
@            IN      SOA ns.v6. root.v6. (
                     20090303 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
             IN      NS     ns.v6.
ns           IN      AAAA   xxxx:xxxx:xxxx:8401::902
v6server     IN      AAAA   xxxx:xxxx:xxxx:8401::902
v6client     IN      AAAA   xxxx:xxxx:xxxx:8401::903

起動してローカルからdigでAAAAを引いてみる。

# dig @xxxx:xxxx:xxxx:8401::902 v6client.v6 AAAA

; <<>> DiG 9.6.0-P1 <<>> @xxxx:xxxxx:xxxx:8401::902 v6client.v6 AAAA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55296
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;v6client.v6.                   IN      AAAA

;; ANSWER SECTION:
v6client.v6.            600     IN      AAAA    xxxx:xxxxx:xxxx:8401::903

;; AUTHORITY SECTION:
v6.                     600     IN      NS      ns.v6.

;; ADDITIONAL SECTION:
ns.v6.                  600     IN      AAAA    xxxx:xxxxx:xxxx:8401::902

;; Query time: 1 msec
;; SERVER: xxxx:xxxxx:xxxx:8401::902#53(xxxx:xxxxx:xxxx:8401::902)
;; WHEN: Tue Mar  3 15:

普通にひけた。digコマンドの@の後ろがv6なのがなんともたまりませんな。
ちゃんと指定できるのか心配でしたが大丈夫でした。

続いてclient側でresolv.confを設定して引いてみる

# vi /etc/resolv.conf

nameserver xxxx:xxxx:xxxx:8401::902
search v6

ゾルバを指定せずにdigで

# dig v6client.v6 AAAA

; <<>> DiG 9.3.4-P1 <<>> v6client.v6 AAAA
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17971
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;v6client.v6.                   IN      AAAA

;; ANSWER SECTION:
v6client.v6.            600     IN      AAAA    xxxx:xxxxx:xxxx:8401::903

;; AUTHORITY SECTION:
v6.                     600     IN      NS      ns.v6.

;; ADDITIONAL SECTION:
ns.v6.                  600     IN      AAAA    xxxx:xxxxx:xxxx:8401::902

;; Query time: 1 msec
;; SERVER: xxxx:xxxxx:xxxx:8401::902#53(xxxx:xxxxx:xxxx:8401::902)
;; WHEN: Tue Mar  3 15:49:31 2009
;; MSG SIZE  rcvd: 102

うむ!(`・ω・´)想定通り

これでtelnetもホスト名で叩けますな。

$ telnet v6server 80

Trying xxxx:xxxx:xxxx:8401::902...
Connected to v6server.v6 (xxxx:xxxx:xxxx:8401::902).
Escape character is '^]'.
GET
<h1>It works!</h1>Connection closed by foreign host.

ちなみに設定してて疑問に思ったのですが、同一ホスト名にAレコードとAAAAレコード両方指定されている場合はブラウザとかはどっち優先するのかなと。

で、調べてみたらfirefoxとかではv6優先みたいですね。まあ最終的には移行するのだから当然か。
IPv6が優先されることでfirefoxが遅いってな記事が結構ありました。
まあこの辺はアプリケーションの実装によるんでしょうね〜。