連載
» 2004年01月14日 00時00分 UPDATE

実用 BIND 9で作るDNSサーバ(12):IPv6対応DNSサーバの実現 (1/2)

BIND 9でIPv6対応DNSサーバを立ち上げる際に、どのような設定が必要なのか? アドレスの記述方法から正引き/逆引きの設定までを分かりやすく解説する。(編集局)

[鶴長鎮一,@IT]

 前回までに紹介したDynamic DNSやTSIGなどでBIND 9の先進性の一端をうかがうことができますが、BIND 9にはさらに魅力的な機能が盛り込まれています。今回は、IPv6機能を紹介します。

IPv6の基本

 IPv6について、いまさら補足する必要はないでしょう。@ITでも、以下の記事でLinuxでIPv6環境を構築する方法が紹介されています。

 DNSサーバ自体をIPv6環境に移行する方法については、上記の記事を参照してください。本記事では、IPv6アドレスが引けることを前提とします。サーバがIPv4/v6どちらの環境にあるかは問題にしません。

 では、いくつかのキーワードを予備知識としてまとめておきます。

IPv6アドレス

 128bitのアドレス空間を使用することが可能で、2の128乗個のアドレスを生成できます。IPv4と同様、予約されているアドレスもあるため、すべてが使用できるわけではありません。それでも、IPv4に比べて2の96乗倍という巨大なアドレス空間を利用できます。128bit幅になり、10進数でIPアドレスを表記するようなことをせずに16進数を4けたごとに「:」で区切ります。

3ffe:0200:0000:010a:0000:0000:0000:0001

 IPv4のように、生IPアドレスでpingやtracerouteを行うのは現実的ではありません。それ故に、IPv6においてはDNSが果たす役割が大きくなります。

アドレスの省略表記

 IPv6アドレスは、省略表記が可能です。例えば分割された各セクションは、先頭に0が続く場合は省略可能で、セクションすべてが0であれば「::」と空欄にすることもできます。ただし、空欄を用いることができるのは1アドレスに1カ所のみです。

3ffe:0200:0000:010a:0000:0000:0000:0001 = 3ffe:200:0:10a:0:0:0:1

 先頭または末尾に0が連なる場合も、省略表記が可能です。

0000:0000:0000:0000:0000:0000:0000:Fe12 = ::Fe12
Fe12:0000:0000:0000:0000:0000:0000:0000 = Fe12::

アドレス(グローバルユニキャストアドレス)の生成

 IPv6は固定IPを割り当てることもできますが、DHCPのようなプロトコルを用いることなく自動構成されます。

 図1のように、アドレスを上位64bitと下位64bitに分けます。上位64bitはこの後説明するRA(Router Advertisement)によって取得したもの、下位64bitはそれぞれ端末のネットワークインターフェイスのMACアドレスを基に生成したもので構成されます。上位64bitを「ネットワークプレフィックス」、下位64bitを「インターフェイスID」と呼びます。

図1 IPv6のアドレス構成 JPNIC IPv6割り当て/割り振りポリシー・ドキュメント(暫定)より 図1 IPv6のアドレス構成
JPNIC IPv6割り当て/割り振りポリシー・ドキュメント(暫定)より
http://www.nic.ad.jp/ja/translation/ipv6/v6-rir-policy.html

 MACアドレスは48bitですが、24bit目の後ろに「1111 1111 1111 1110」(16進数でff fe)を挿入して64bitとし、7bit目(ユニバーサル/ローカルビット)を1にセットにすることでインターフェイスIDを生成します。IPv4のようにサブネットに分ける場合は、ネットワークプレフィックス内で上位48bitと下位16bitに分け、下位16bitをSLA IDとして使用することもあります。

 ここでは自動構成機能によって決まるグローバルユニキャストアドレスを説明しましたが、ほかにも制御用に使用されるリンクローカルアドレス、サイト内だけで有効なサイトローカルアドレスがあります。

RA(Router Advertisement)

 ルータはネットワークプレフィックス情報を含むRAパケットを一定間隔で流します。RAパケットを受け取ったIPv6端末は、これを基にユニークなグローバルユニキャストアドレスを生成します。ネットワークプレフィックスはネットワーク固有の値である必要があるため、管理者はそのように設定を行います。

 RAは、ネットワークプレフィックス以外にプレフィックスの最終有効期間や推奨有効期間およびデフォルトルータとその有効期間なども通知しますが、DHCPのようにDNSやドメイン名を通知したり、端末のMACアドレスごとに特別な設定を行うことはできません。端末がRAを待たずにネットワークプレフィックスを取得するには、RS(Router Solicitation)パケットを送出して、ネットワークプレフィックスを要求します。

IPv4-mappedアドレスとIPv4-compatibleアドレス

 IPv4-mapped(IPv4射影IPv6)アドレスはIPv4アドレスを含むIPv6アドレスで、IPv6端末やホストがIPv4ノードと通信する際に使用します。IPv4アドレスの前に80bitの0と16bitの1(すなわち先頭96bitが0:0:0:0:0:ffff:)を付加することで生成します。

IPv4アドレス 192.168.20.1
IPv4-mappedアドレス 0:0:0:0:0:ffff:192.168.20.1
または
::ffff:192.168.20.1
IPv4-mappedアドレス生成例

 IPv4-mappedアドレスは、IPv6しかサポートしないアプリケーション()がIPv4アドレスを処理するために内部的に用いるもので、DNSには一切記述しません。

注:アプリケーションはIPv6にしか対応していなくても、ホスト自身はIPv4とIPv6の両方に対応している必要があります。

 同様に、IPv6アドレスの下位32bitにIPv4アドレスを埋め込んだものに、IPv4-compatible(IPv4互換IPv6)アドレスがあります。こちらは、IPv6ホスト間がIPv4ルータなどで分断されているような場合に通信を可能にするもので、IPv4アドレスの前に96bitの0を付加します。

IPv4アドレス 192.168.20.2
IPv4-compatibleアドレス 0:0:0:0:0:0:192.168.20.2
または
192.168.20.2
IPv4-compatibleアドレス生成例

 IPv4-mapped/IPv4-compatibleアドレス共に、IPv4からIPv6への移行を容易にするために考案されたものです。

AAAAレコード

 BIND 9でIPv6アドレスを引けるようにしてみましょう。ここでは、以下のようなホスト情報を登録します。

登録するホスト情報
ホスト名 pc1v6.example.jp
ネットワークプレフィックス fec0:0:1:2::/64
IPアドレス fec0:0:1:2:3:4:fe8b:5d40
注:サイトローカルアドレスを使用します。

正引きの設定

 正引きの設定は、IPv6でも基本的にはIPv4と変わりません。ここでは、IPv4を前提としていた第2回と違う点を確認していきます。使用するファイルは/etc/named.conf、/var/named/local.zone、/var/named/example.zone()です。

注:$jailを用いている場合などはファイルパスが異なります。環境に応じて適宜読み替えてください。以下同。

options {
        directory "/var/named";
        pid-file "/var/run/named/named.pid";
        listen-on-v6{
                any; (1)
        }
};

zone "localhost" {
         type master;
         file "local.zone";
};

zone "example.jp" {
        type master;
        file "example.zone";
};
/etc/named.conf

$TTL 86400
@            IN      SOA localhost. root.localhost. (
                     2003121301 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
              IN      NS      localhost.
              IN      A       127.0.0.1
              IN      AAAA    ::1 (2)
local.zone

$TTL 86400
@            IN      SOA dns.example.jp. root.example.jp. (
                     2003121301 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
             IN      NS     dns.example.jp.
dns          IN      A      192.168.10.1
pc1v6        IN      AAAA   fec0:0:1:2:3:4:fe8b:5d40 (3)
example.zone

 /etc/named.confのoptions{};に、(1)を追加してIPv6アドレスからの問い合わせに答えられるようにします。IPv4のアクセス制限では、アドレスやネットワークごとに細かい設定ができますが、IPv6の場合は「any」か「none」のみの指定になります。named.conf内のlocalhost/example.jpゾーン節の記述については、IPv4と同じです。

 local.zoneファイルには、(2)を追加します。IPv6は、ループバックアドレスとして「0:0:0:0:0:0:0:1」(省略形式は「::1」)を用います。IPv4のループバックアドレスと混在していますが、特に問題ありません。

 ホスト名「pc1v6」の正引きの登録は、(3)のようにAAAA(「クワッドエー」と発音します)レコードを用いて行います。Aレコードと同様、「AAAA」に続けてIPv6アドレスを指定します。

 namedプロセスを再起動後、登録が完了しているかを確認します。digコマンドを使用し、AAAAレコードを検索するために引数の最後に「AAAA」を指定します。

$ dig pc1v6.example.jp AAAA
;; ANSWER SECTION:
pc1v6.example.jp. 86400  IN      AAAA    fec0:0:1:2:3:4:fe8b:5d40
注:DNSサーバを指定する場合は「$ dig @DNSサーバ pc1v6.example.jp AAAA」。

逆引きの設定

 続いて逆引きの設定を行います。第4回の説明と違う点を確認します。

 使用するファイルは、/etc/named.confと新規に用意する/var/named/localv6.zone、/var/named/efec0:0:1:2::.revです。正引きの際に使用したIPv6アドレスは、16進数を用いて4けたごとに「:」で区切ったものを用いましたが、IPv4と同じく、逆引きではIPアドレスの順序を反転させたものを使用し、ドメインツリーをたどれるようにします。その際、4bit(16進数1文字)ごとに「.」を挿入し、「:」を削除します。これで32個のサブドメインに分割されたことになります。

 IPv4は末尾に「in-addr.arpa」を連結しましたが、IPv6は「ip6.arpa」を連結します。ただし、歴史的経緯から「ip6.int」を使用するアプリケーションが存在しているため()、互換性のためにip6.intについても記載しますが、将来的には使用されなくなります。

fec0:0:1:2:3:4:fe8b:5d40
   ↓
fec0:0000:0001:0002:0003:0004:fe8b:5d40
「0省略」されている個所を0で満たす
   ↓
f.e.c.0.0.0.0.0.0.0.0.1.0.0.0.2.0.0.0.3.0.0.0.4.f.e.8.b.5.d.4.0
「:」を削除し、4bit(16進数1文字)ごとに「.」を挿入
   ↓
0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f
順序を反転させる
   ↓
0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.
ip6.arpa
  または
0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.
ip6.int
末尾にip6.arpa/ip6.intを連結

注:IPv6用の逆引きドメイン名としてip6.intが予約されていましたが、後にip6.arpaへの移行が決定されました。

集中連載:DNSの仕組みと運用(3)「DNS導入に向けての予備知識」

RFC 3152(http://www.rfc-editor.org/rfc/rfc3152.txt

 逆引きアドレスの記述方法が分かったところで、各種ファイルの記述例を見ていきましょう。

options {
        directory "/var/named";
        pid-file "/var/run/named/named.pid";
        listen-on-v6{
                any;
        }
};

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.int" {  (4)
         type master;
         file "localv6.rev"; (5)
};
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" { (6)
         type master;
         file "localv6.rev"; (7)
};

zone "2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.ip6.arpa." { (8)
    type master;
    file "fec0:0:1:2::.rev";
};
zone "2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.ip6.int." { (9)
    type master;
    file "fec0:0:1:2::.rev";
};
/etc/named.conf

$TTL 86400
@            IN      SOA localhost. root.localhost. (
                     2003121301 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
             IN      NS      localhost.
1            IN      PTR     localhost.
localv6.rev

$TTL 86400
@            IN      SOA dns.example.jp. root.example.jp. (
                     2003121301 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
        IN      NS      dns.example.jp.
0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0    IN   PTR   pc1v6.example.jp. (注)(10)
fec0:0:1:2::.rev
注:1行で記入します。

 IPv6のループバックアドレスの逆引きを登録するため、セクション(4)(6)を追加します。参照する「localv6.rev」は、(4)(6)で同じものを使用します((5)(7))。

 (8)(9)でネットワークプレフィックス「fec0:0:1:2::/64」の逆引きゾーンを指定します。ip6.arpa/ip6int両対応とし、ゾーンファイルは両ゾーンで共通の「fec0:0:1:2::.rev」を使用します。fec0:0:1:2::.revはIPv4アドレスと同様に、PTRレコードを用います(10)

 ゾーンファイルが完成したら、動作確認をします。digコマンドで引数にIPv6アドレスを-xオプションとともに使用しますが、その際に-nオプションを忘れずに付加しましょう(理由は後述)。

$ dig -n -x fec0:0:1:2:3:4:fe8b:5d40

;; QUESTION SECTION:
;0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.
ip6.int. IN PTR

;; ANSWER SECTION:
0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.
ip6.int. 86400 IN PTR pc1v6.example.jp.
注:DNSサーバを指定する場合は、「$ dig @DNSサーバ -n -x fec0:0:1:2:3:4:fe8b:5d40」。

 QUESTION SECTIONで、ip6.intを参照しているのが分かります。ip6.arpaを参照しないのは-nオプションを指定しているためですが、digコマンドで-nオプションを外すと次のようになり、digでの逆引きができません。

$ dig -x fec0:0:1:2:3:4:fe8b:5d40

;; QUESTION SECTION:
;\[xFEC000000001000200030004FE8B5D40/128].ip6.arpa. IN PTR ←見慣れないアドレス
(省略)

 -nオプションを外すと、「\[xFEC000000001000200030004FE8B5D40/128].ip6.arpa」が検索アドレスとして生成されているのが分かります。これは「Bitstring Format」と呼ばれるものです。ip6.intゾーンを引く場合は「Nibble Format」と呼ばれる「0.4.d.5.b.8.e.f.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.0.c.e.f.ip6.arpa」を使用しますが、BIND 9(9.2.x以前)に付属するdigでは、ip6.arpaゾーンを引くためにBitstring Formatで指定されたゾーンファイルが必要です。多くのアプリケーションはip6.int/ip6.arpaともにNibble Formatを使用するため、ここまでの設定で何ら支障はありません。

Bitstring Format対応の逆引き設定

 digでip6.arpaを引けるようにする設定を紹介します。ただし、BIND 9.3のdigではip6.arpaを引く場合でもNibble Format対応となる予定です。

 RFC 3364(http://www.rfc-editor.org/rfc/rfc3364.txt)において、IPv6アドレスの表記にはNibble Formatを使うべきとされており、Bitstring Formatの使用は推奨されていません。ここで紹介する方法はdigでIPv6アドレスの逆引きができるようにするもので、Bitstring Formatの確認と併せて参考としてお読みください。

 Bitstring Formatに対応させるため、named.confとfec0:0:1:2::arpa.revファイルを新規に用意します。アドレスの指定部分以外は同じです。

zone "\[xfec0000000010002/64].ip6.arpa." {
        type master;
        file "fec0:0:1:2::arpa.rev";
};
/etc/named.conf

$TTL 86400
@            IN      SOA dns.example.jp. root.example.jp. (
                     2003121301 ; serial
                     3600       ; refresh 1hr
                     900        ; retry 15min
                     604800     ; expire 1w
                     86400      ; min 24hr
)
             IN      NS         dns1.example.jp.
\[xfec000000001000200030004FE8B5D40/128].ip6.arpa.  IN   PTR 
  pc1v6.example.jp. (注)
fec0:0:1:2::arpa.rev
注:1行で記入します。

 では、digで確認します。

$ dig @127.0.0.1 -x fec0:0:1:2:3:4:fe8b:5d40

;; QUESTION SECTION:
;\[xFEC000000001000200030004FE8B5D40/128].ip6.arpa. IN PTR

;; ANSWER SECTION:
\[xFEC000000001000200030004FE8B5D40/128].ip6.arpa. 86400 IN PTR 
pc1v6.example.jp. ←正しく返っている

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。