FreeBSDではじめるIPv6 第7回

(FreeBSD PRESS No.14)

梅本肇 / ume@mahoroba.org

 4.7-RELEASEがリリースされ、5.0の声もチラホラ聞こ えてくるようになりました。皆様はいかにお過ごしでしょ うか?
 今回は、設定によって欲しくなるかもしれないアドレ ス設定まわりのちょっとしたTipsを紹介したいと思いま す。加えて、DNS周辺の近況を紹介したいと思います。

1 リンクローカル・アドレス

1.1 自分好みのリンクローカル・アドレスを付ける

 IPv6では、インタフェースをupすると、自動的にリン クローカル・アドレスが付きます。多くの場合これは嬉 しい機能なのですが、邪魔に感じるケースもあるでしょ う。
 例えば、経路情報のnext hopにはIPv6では一般的にリ ンクローカル・アドレスを使用します。RIPngでは明示 的にnext hopを指定する必要はありませんが、静的に経 路を設定したり、BGP4+でピアを張ったりする場合には、 相手側のリンクローカル・アドレスを指定することにな ります。
 ここで、リンクローカル・アドレスの生成にはEUI-64 アドレスが使用されるため、ネットワークカードが壊れ て交換したりした場合に、MACアドレスが変わってしま い、面倒です。
 リンクローカル・アドレスもグローバルアドレスと同 様に複数付けることができますので、ピアを張るために 使用するアドレスを手動で付けると良いでしょう。
 ただし、ホスト識別子はRFC2373*1)2.5.1でフォーマッ トが定められており、任意の値を指定できるわけではあ りませんので、注意ください。これは、主に、EUI-64を 用いたアドレスと識別できるようにするためです。

1.2 EUI-64ベースのリンクローカル・アドレスを付けない

 リンクローカル・アドレスを手動で設定する場合、 EUI-64ベースのリンクローカル・アドレスは自動的に付 かないようにしたいかもしれません。
 ネットワークインタフェースをupする前にリンクロー カル・アドレスを設定しておくと、EUI-64を用いたリン クローカル・アドレスは付かなくなります。これをおこ なうには、スタートアップ・スクリプトではIPv4→IPv6 の順に設定をおこないますので、IPv4の設定を行う前に リンクローカル・アドレスを設定しておく必要がありま す。IPv4アドレスを付けないのであれば、ifconfig_*を 使って、例えば、
ifconfig_fxp0="inet6 fe80::1 alias"
のように指定してしまってもかまわないでしょう。しか し、IPv4アドレスも付ける場合は、ここでは指定できま せん。
/etc/start_if.インタフェース名
という名称でシェルスクリプトを用意しておくと、指定 されたネットワークインターフェースが初期化される前 に、このシェルスクリプトが実行されますので、ここで 指定すると良いでしょう。(リスト1)
リスト1 /etc/start_if.fxp0の例
ifconfig fxp0 inet6 fe80::1 prefixlen 64 alias

1.3 グローバルアドレスのホスト識別子

 以前、自動生成されるグローバルアドレスのホスト識 別子にはMACアドレスから生成されるEUI-64アドレスが 使用されると書きました。しかし、正確には、KAMEの実 装ではリンクローカル・アドレスのホスト識別子が使わ れます。
 つまり、1.2で述べた方法を使用し手動でリンクロー カル・アドレスを設定しておけば、グローバルアドレス を付けた際に、手動で設定したリンクローカル・アドレ スのホスト識別子を使用することができます。
 これをうまく使うと、EUI-64ベースのアドレスは使用 したくないが、プレフィックスはRAで受け取ったものを 使用するといったことができます。この場合、もちろん ホスト識別子がネットワーク内で重複しないように管理 する必要があります。

1.4 リンクローカル・アドレスを自動的に付けない

 FreeBSDでは、基本的に、インタフェースがupすると リンクローカル・アドレスが自動的に付けられます。
 実はこの振る舞いはsysctl(8)で変えることができま す。デフォルトではnet.inet6.ip6.auto_linklocal=1と なっており、インタフェースがupすると自動的にリンク ローカル・アドレスが付きますが、この値を0に設定す ると付かなくなります。
 ただし、IPv6ではリンクローカル・アドレスは必須で すので、必ず手動で付けてください。

1.5 ifconfig eui64

 初期のKAMEにはprefix(8)コマンドがありました。 EUI-64を用いたIPv6アドレスを設定する際に、 ifconfig(8)の代わりにprefix(8)を使用することで、ホ スト識別子を自動的に計算してくれました。FreeBSDも 以前は使用しておりましたが、最近の4.Xでは互換性の ために残されているだけで、スタートアップ・スクリプ トなどでは一切使用していません。また、5-CURRENTで はprefix(8)はインストールされません。
 最近のifconfig(8)には、prefix(8)に代わり、eui64 オプションが追加されています。このオプションを指定 することで、EUI-64ベースのホスト識別子を計算してく れます。
 eui64オプションを指定する場合、IPv6アドレスには プレフィックス部分の64ビットを指定します。例えば、 リスト2の例では、プレフィックスとして 3ffe:505:2:ff::を指定しています。
リスト2 eui64オプションの使用例
ifconfig fxp0 inet6 3ffe:505:2:ff:: eui64 alias
 eui64オプションは実際にはホスト識別子をリンクロー カル・アドレスから取得します。例えば、リンクローカ ル・アドレスがfe80::280:88ff:fe03:4841の場合、リス ト2の例では、3ffe:505:2:ff:280:88ff:fe03:4841が設 定されます。

2 DNSの近況

2.1 IP6.INTとIP6.ARPA

 従来から、逆引きとして、実験用にIP6.INTゾーンが 使用されていましたが、RFC3172*2)では正式に IP6.ARPAゾーンを使用すると規定しています。
 A6レコードやビットストリングラベルを規定した RFC2874*3)では、IP6.ARPAゾーンはビットストリング ラベル形式で使用することを想定していました。
 しかし、RFC3172では、IP6.ARPAゾーンでRFC1886*4) で規定したニブル形式、つまりIP6.INTゾーンの形式を そのままIP6.ARPAゾーンで使用することになっています。
 RFC3172はIP6.INTゾーンを規定したRFC1886セクショ ン2.5をobsoleteしています。しかし、現状では、 3ffe::から始まる実験アドレスの空間はIP6.ARPAゾーン から委譲されていません。そのため、リソルバが IP6.ARPAゾーンを参照するように変更してしまうと、 3ffe::から始まるアドレス空間に対して一切逆引きがで きないことになってしまいます。また、正式アドレスを 使用しているユーザも、IP6.ARPAに移行しているとは限 らないでしょう。
 FreeBSDでは、10月23に5-CURRENTに、11月2日に 4-STABLEにRFC3172に対応する修正がcommitされました。 ただし、上記問題があり混乱が予想されますので、まず IP6.ARPAゾーンを検索し、なければIP6.INTも検索する ようになっています。この動作は、KAME由来で、他の BSDと同様です。

2.2 IP6.ARPAへの移行

 FreeBSDでは、当面、従来通りIP6.INTを使用していて も、上述のfallbackがありますので、逆引きできなくな ることはないはずです。しかし、逆引きが若干遅くなる かもしれません。また、今後、IP6.ARPAしか参照しない プラットフォームが出てくることも予想されますから、 IP6.ARPAへの移行をおこなった方が良いでしょう。
 ここで、完全にIP6.ARPAに移行してしまうと、従来の IP6.INTしか参照しないプラットフォームからは逆引き できないことになりますので、しばらくは、IP6.INTも 公告するようにしておいた方が賢明でしょう。
 例えば、2001:200:301::/48を使用している場合、 named.confでリスト3のように指定していることと思い ます。このとき、db.2001:200:301で$ORIGINを使用して いなければ、IP6.INTゾーンもIP6.ARPAゾーンもPTRレコー ドの形式は同じですから、単純に、リスト4のように IP6.INTをIP6.ARPAに変更したものをnamed.confに追加 するだけで、両方を公告するようにできます。
リスト3 IP6.INTを公告する例
zone "1.0.3.0.0.0.2.0.1.0.0.2.IP6.INT" {
    type master;
    file "db.2001:200:301";
};
リスト4 IP6.ARPAを公告する例
zone "1.0.3.0.0.0.2.0.1.0.0.2.IP6.ARPA" {
    type master;
    file "db.2001:200:301";
};
 ただし、$ORIGINを使用している場合、ゾーンファイ ルを共有することはできませんので、別々に用意するか、 $ORIGINを使わないようにする必要があるでしょう。

2.3 dig(1),nslookup(1)のサポート状況

 最近の4-STABLEや5-CURRENTのリゾルバはIP6.ARPAを サポートしていることは先程述べました。では、dig(1) やnslookup(1)はどうなっているのでしょうか。
 4.7-RELEASE標準添付のBINDは8.3.3-RELです。 8.3.3-RELでは、dig(1)やnslookup(1)はIPv6アドレスの 逆引きをおこなうと、IP6.ARPAを検索します。
 図1は4.7-RELEASE標準添付のdig(1)で逆引きをおこなっ た結果です。IP6.ARPAを検索していることがおわかりいた だけるでしょう。
 ここでSERVER:が0.0.0.0になっているのにお気づき頂 けたでしょうか。実は、BIND8のdig(1)は、実際に使用 したDNSサーバのアドレスを表示しているわけではあり ません。/etc/resolv.confのnameserver行にIPv6アドレ スを指定している場合、実際にはIPv6でクエリをおこなっ ていますが、表示部分がきちんとIPv6対応できているわ けではありませんので、表示がこのようになってしまっていま す。
図1 4.7-RELEASE標準添付のdig(1)での逆引き
ume@lyrics:1067% /usr/bin/dig -x 2001:200:301:0:200:f8ff:fe05:3eae

; <<>> DiG 8.3 <<>> -x 
;; res options: init recurs defnam dnsrch no-tld-query
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3
;; QUERY SECTION:
;;	e.a.e.3.5.0.e.f.f.f.8.f.0.0.2.0.0.0.0.0.1.0.3.0.0.0.2.0.1.0.0.2.ip6.arpa, type = ANY, class = IN

;; ANSWER SECTION:
e.a.e.3.5.0.e.f.f.f.8.f.0.0.2.0.0.0.0.0.1.0.3.0.0.0.2.0.1.0.0.2.ip6.arpa.  1H IN PTR  peace.mahoroba.org.

;; AUTHORITY SECTION:
1.0.3.0.0.0.2.0.1.0.0.2.ip6.arpa.  1H IN NS  ns.mahoroba.org.

;; ADDITIONAL SECTION:
ns.mahoroba.org.	1H IN A		202.227.26.36
ns.mahoroba.org.	1H IN AAAA	2001:200:301:0:240:c7ff:fe97:6f89
ns.mahoroba.org.	1H IN AAAA	3ffe:505:2:0:240:c7ff:fe97:6f89

;; Total query time: 33 msec
;; FROM: lyrics.mahoroba.org to SERVER: default -- 0.0.0.0
;; WHEN: Mon Nov 11 05:19:09 2002
;; MSG SIZE  sent: 90  rcvd: 268
 図2は4.7-RELEASE標準添付のnslookup(1)で逆引きを おこなった結果です。この結果からはちゃんと逆引きで きているということしかわかりません。ネームサーバ側 でクエリ・ログを出すように設定し、どのようなクエリ をおこなったかを確認したのが図3です。IP6.ARPAを検 索していることがおわかりいただけると思います。
図2 4.7-RELEASE標準添付のnslookup(1)での逆引き
ume@lyrics:1066% nslookup 2001:200:301:0:200:f8ff:fe05:3eae
Server:  localhost
Address:  ::1

Name:    peace.mahoroba.org
Address:  2001:200:301:0:200:f8ff:fe05:3eae
図3 ネームサーバ側のクエリ・ログ
Nov 11 05:18:04 cheer named[63279]: client 2001:200:301:0:280:88ff:fe03:4841#53: query: e.a.e.3.5.0.e.f.f.f.8.f.0.0.2.0.0.0.0.0.1.0.3.0.0.0.2.0.1.0.0.2.ip6.arpa IN PTR
 では、BIND9はどうなっているのでしょうか。本稿執 筆時点での正式版は9.2.1です。ports/net/bind9からイ ンストールすると9.2.1がインストールされますので、 9.2.1について見ていきたいと思います。
 図4は9.2.1のdig(1)で逆引きをおこなった結果です。 IP6.ARPAをビットストリングラベル形式で検索し、失敗 しています。これは、RFC2874に従った動作です。
図4 BIND 9.2.1のdig(1)の実行例
ume@lyrics:1068% /usr/local/bin/dig -x 2001:200:301:0:200:f8ff:fe05:3eae

; <<>> DiG 9.2.1 <<>> -x 2001:200:301:0:200:f8ff:fe05:3eae
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 59008
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

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

;; AUTHORITY SECTION:
ip6.arpa.		10800	IN	SOA	dns1.icann.org. . 682095 1937010017 1937007986 3225253717 815071232

;; Query time: 62 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon Nov 11 05:19:28 2002
;; MSG SIZE  rcvd: 93
 では、-nオプションを付けて試してみましょう。-nオ プションを付けるとニブル形式でクエリを出します。逆 引きができるようになりました。ただし、IP6.INTを検 索していることがわかります。(図5)
図5 BIND 9.2.1のdig(1)の実行例 (-nオプション)
ume@lyrics:1069% /usr/local/bin/dig -n -x 2001:200:301:0:200:f8ff:fe05:3eae

; <<>> DiG 9.2.1 <<>> -n -x 2001:200:301:0:200:f8ff:fe05:3eae
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8038
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3

;; QUESTION SECTION:
;e.a.e.3.5.0.e.f.f.f.8.f.0.0.2.0.0.0.0.0.1.0.3.0.0.0.2.0.1.0.0.2.ip6.int. IN PTR
;; ANSWER SECTION:
e.a.e.3.5.0.e.f.f.f.8.f.0.0.2.0.0.0.0.0.1.0.3.0.0.0.2.0.1.0.0.2.ip6.int. 3600 IN PTR peace.mahoroba.org.

;; AUTHORITY SECTION:
1.0.3.0.0.0.2.0.1.0.0.2.ip6.int. 3600 IN NS	ns.mahoroba.org.

;; ADDITIONAL SECTION:
ns.mahoroba.org.	3600	IN	A	202.227.26.36
ns.mahoroba.org.	3600	IN	AAAA	2001:200:301:0:240:c7ff:fe97:6f89
ns.mahoroba.org.	3600	IN	AAAA	3ffe:505:2:0:240:c7ff:fe97:6f89

;; Query time: 8 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon Nov 11 05:19:48 2002
;; MSG SIZE  rcvd: 267
 表1,2に結果をまとめます。表1がdig(1)について、表 2がnslookup(1)についてまとめたものです。それぞれ、 4.7-RELEASE添付のBIND 8.3.3-RELのものと、BIND 9.2.1のものを比較しています。
表1 dig(1)の比較
4.7-RELEASEBIND 9.2.1 (-n指定)BIND 9.2.1
ゾーンIP6.ARPAIP6.INTIP6.ARPA
形式ニブルニブルビットストリングラベル
IPv6によるクエリ△ (SERVER:表示が0.0.0.0になる)
表2 nslookup(1)の比較
4.7-RELEASEBIND 9.2.1
ゾーンIP6.ARPAIP6.ARPA
形式ニブルビットストリングラベル
IPv6によるクエリ
 BIND 8.3.3-RELのdig(1)やnslookup(1)はIPv6対応し ています。これまで、IPv6でのクエリをおこなうために BIND9をインストールされている方が多かったと思いま すが、クエリをおこなうだけのためでしたら、BIND9を あえてインストールする必要性はなくなったと思って差 し支えないでしょう。むしろ、現時点では、BIND9より BIND8の方が、最新の仕様に基づいていると言えます。
 しかし、BIND8のnamed(8)は残念ながらIPv6トランス ポートをサポートしていません。IPv6でDNSサーバを運 用する場合は、従来通りBIND9をインストールする必要 があります。
 なお、現在開発が進められているBIND 9.3はRFC3172 に対応します。最近のスナップショット*5)では既に IP6.ARPAゾーンをニブル形式で検索するようになってい ます。

3 おわりに

アドレスを設定する場合のちょっとしたTipsを紹介しま した。また、DNSの逆引きの近況について説明しました。 現在DNSの逆引きについてはちょっと混乱した状況にあ りますが、少しでも理解の助けになれば幸いです。


*1) IP Version 6 Addressing Architecture
*2) Delegation of IP6.ARPA
*3) DNS Extensions to Support IPv6 Address Aggregation and Renumbering
*4) DNS Extensions to support IP version 6
*5) 本稿執筆時点で最新は ftp://ftp.isc.org/isc/bind9/snapshots/bind-9.3.0s20021115.tar.gz


All Rights Reserved, Copyright (C) 2002,2003 Hajimu UMEMOTO
Last Modified May 7, 2003
ume@mahoroba.org