組織内ネットワークをIPv6で作ろう

(BSD Magazine No.08)

梅本肇 / ume@mahoroba.org

 あなたの組織のネットワークをIPv6対応にしよう。本稿では、IPv6に対応した組織内のネットワークを作る方法を解説する。

使用するIPv6アドレス

 まだ組織が外部のネットワークにつながっていない場合、IPv6アドレスをどうするか悩むことだろう。IPv4ならプライベートアドレスを使うところ、IPv6ならサイトローカルアドレスを使えば良いだろうと考えがちだが、ちょっと待ってほしい。
 サイトローカルアドレスにはグローバルアドレスと異なり、スコープの概念がある。このため、グローバルアドレスの代用にはならないのである。ぜひともグローバルなIPv6アドレスを取得し、使用していただきたい。 どうしても無理ならIPv4アドレスから導出される6to4アドレスを使用願いたい。
 本稿では、グローバルアドレスを取得済であると仮定する。

既存ネットワークのIPv6化

 まだまだIPv6をしゃべることができるルータは少ない。現状では、IPv6をしゃべることができないルータで構築されたネットワークに無理やりIPv6を流すケースが多いと思う。
 既存ネットワークをIPv6対応にする際、一番簡単なのは、ルータをIPv6対応した最近の*BSD箱に置き換えることだろう。IPv6と共にIPv4のルータとしての設定をしておけば、どちらのルータとしても使えるようになる。
 しかし、既存ネットワークに手を加えるのはなかなか難しいかもしれない。次善策としては、既存ルータと並列に*BSDで構築したIPv6ルータを入れることだろう(図1)。この場合、構築したルータはIPv4のルータとしては動かないようにしておく。
 たとえばFreeBSDをルータとして設定するには、/etc/rc.confはリスト1のようになる。
図1 ルータによる接続
ルータによる接続
リスト1 ルータとして設定時の/etc/rc.confの例
ipv6_enable="YES"
ipv6_network_interfaces="fxp0 fxp1"
ipv6_prefix_fxp0="3ffe:505:2:1000"
ipv6_prefix_fxp1="3ffe:505:2:1001"
ipv6_gateway_enable="YES"
ipv6_router_enable="YES"
 この方法も、IPv4ネットワークに影響を与えないものの、やはり物理的に既存ネットワークに変更を加えることになるので、選択できないかもしれない。  第3の方法は、IPv6 over IPv4トンネルを使う方法である(図2)。この場合、既存ネットワークにはまったく変更を加える必要がない。
図2 トンネルによる接続
トンネルによる接続
 トンネルを使用する場合host-aの設定はリスト2のようになる。また、host-bの設定はリスト3のようになる。
リスト2 トンネル接続時の/etc/rc.confの例(host-a)
ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
ipv6_prefix_fxp0="3ffe:505:2:1000"
ipv6_gateway_enable="YES"
ipv6_router_enable="YES"
gif_interfaces="gif0"
gifconfig_gif0="192.168.0.1 192.168.1.1"
リスト3 トンネル接続時の/etc/rc.confの例(host-b)
ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
ipv6_prefix_fxp0="3ffe:505:2:1001"
ipv6_gateway_enable="YES"
ipv6_router_enable="YES"
gif_interfaces="gif0"
gifconfig_gif0="192.168.1.1 192.168.0.1"
 やはり、ネイティブにIPv6を流したいところだが、もしあなたの組織が寛容でない場合、あなたの組織でIPv6が市民権を得るまではこの方法でじっと我慢しよう。

経路制御

 *BSDにはroute6dが標準で入っている。RIPngで経路制御を行うのなら基本的にこれで十分であろう。
 複雑な設定が必要とか、BGP4+やOSPF6を使用したい場合は、Zebra*01)の導入を検討すると良い。
 サイト境界になるルータでは、サイト外に対してはサイトに割り当てられているアドレスを集約して公告するようにしよう。route6dでは-Aオプションで集約に含まれる特定の経路をフィルタし、集約された経路を特定のインターフェイスに公告するようにできる。たとえば、外側のインターフェイスがgif0で3ffe:505:2::/48に集約する場合、
-A 3ffe:505:2::/48,gif0
となる。
 また、サイトローカルアドレスなどサイト内でのみ有効なアドレスを使用している場合、サイト外に経路が流出することがないよう、サイト境界になるルータの経路制御は注意する必要がある。route6dでは-Oオプションで特定インターフェイスへの経路通知を制限することができる。たとえば、外側のインターフェイスがgif0で3ffe:505:2::/48以外を公告しないようにする場合、
-O 3ffe:505:2::/48,gif0
となる。
 FreeBSDでは/etc/rc.confで
ipv6_router_enable="YES"
と指定すると、デフォルトでroute6dが起動されるようになっている。オプションを指定したい場合はipv6_router_flagsに指定する。

Plug & Play

 Plug & PlayはIPv6の特徴のひとつである。エンドノードはネットワークに接続した時点でRouter Solicitations(RS)をff02::2に投げる。すると、ルータはRouter Advertisement(RA)を返す。RAからプレフィックスとデフォルト経路を得て、自分のIPv6アドレスを知ることができる。
 実装的に言うと、エンドノードでrstolを実行するとRSが投げられ、rtadvdがRSに応えてRAを返す。
 rtadvdはRAを流したいインターフェイスを引数に指定してルータで起動する。
 FreeBSDでは/etc/rc.confでIPv6ルータとして設定されている(ipv6_gateway_enable="YES")とrtadvdが起動されるようになっている。
 ちなみに、ルータでかつrtadvdを起動したくない場合はrtadvd_enable="NO"を指定する。
 デフォルトではipv6_network_interfacesで指定されたすべてのインターフェイスにRAを流すようになっている。RAを流したいインターフェイスがipv6_network_interfacesと異なる場合はrtadvd_interfacesで指定する。
 また、デフォルトでは、引数に指定されたインターフェイスに割り振られているIPv6 アドレスのプレフィックスをアナウンスするようになっている。
 rtadvdは設定ファイルとして/etc/rtadvd.confを読むようになっているが、一般的に設定ファイルは必要ない。
 エンドノードでは、単にrtsolを実行すれば良いので、/etc/rc.confで
ipv6_enable="YES"
とするだけで良い。
 ただし、この場合、ifconfig -lを実行して得られるインターフェイス一覧からlo0、gif*、stf*、faith*を除いたもののうち最初のインターフェイスを使用すると仮定される。ほとんどの場合大丈夫であると思われるが、これで不具合がある場合は、ipv6_network_interfacesで使用したいインターフェイスを明示的に指定すると良い。

DNS

 DNSのIPv6サポートには、
  1. AAAAレコードを扱える
  2. IPv6でクエリできる
の2つがある。IPv4でのAレコードに相当するのがAAAAレコードである。  BIND8では1.は満たしているが2.はサポートされていない。2.はBIND9でサポートされている*02)
 BIND9では、named.confに
options {
    listen-on-v6 { any; };
};
と書くことでIPv6でのクエリを受け付けるようになる。すなわち、各ホストで/etc/resolv.confでのnameserver行にIPv6アドレスを書くことができるようになる。
 BIND9を使用する場合、できるだけ新しいものを使用することをお勧めする。ちなみに本稿執筆時点での最新は9.1.1である。
 では、ゾーンファイルを書いてみよう。基本的な考え方はIPv4の場合と同じで、ほんの少し、IPv6アドレスの指定の仕方を覚えるだけである。
 正引きはIPv4ではAレコードを使って登録するが、これに相当するのがAAAAレコードと呼ばれるレコードである。たとえば、
3ffe:505:2:1000:240:96ff:fe48:4ea8
というIPv6アドレスを持つhost-aを登録するには、リスト4のようになる。
リスト4
host-a	IN	AAAA	3ffe:505:2:1000:240:96ff:fe48:4ea8 
 逆引きは、IPv6アドレスを4ビット毎に区切り、16進表記で逆順に並べる。またIPv4の場合に使用するIN-ADDR.ARPA.は、IPv6ではIP6.INT.となる。たとえば上記のhost-aだとリスト5のようになる。
リスト5
8.a.e.4.8.4.e.f.f.f.6.9.0.4.2.0.0.0.0.1.2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT.
 実際に逆引きのゾーンファイルを登録するには、自サイトに割り当てられているIPv6アドレスを管理するゾーンファイルを用意する。ここでは、3ffe:505:2::/48のゾーンをdb.3ffe:505:2というファイル名で作成することにする。ゾーンファイルには、リスト6のように、逆引きの記述から2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT.を除いた部分を書く。あと、もちろんSOAレコードなども書いておいておくのをお忘れなく。
リスト6
8.a.e.4.8.4.e.f.f.f.6.9.0.4.2.0.0.0.0.1 IN PTR host-a.example.com.
 では3ffe:505:2::/48のゾーンを有効にしよう。named.confに、リスト7のように指定する。
リスト7
zone "2.0.0.0.5.0.5.0.e.f.f.3.IP6.INT" {
    type master;
    file "db.3ffe:505:2";
};
 *BSDに標準的に付いてくるnslookupやdigはIPv6によるクエリはサポートしていない。そのため、/etc/resolv.confのnameserver行にIPv6アドレスを指定しても無視されてしまう。IPv6でクエリができていないと勘違いしないでほしい。BIND9付属のnslookupやdigはIPv6によるクエリをサポートしているので、そちらで試していただきたい(図3)。また、libcのリゾルバを使用している通常のアプリケーションはIPv6でクエリを行えるはずである。
図3 BIND9版nslookupによる出力例
ume@piano:353> /usr/local/bin/nslookup -sil -type=any www.imasy.or.jp.
Server:         2001:200:300:1:220:edff:fe88:788c
Address:        2001:200:300:1:220:edff:fe88:788c#53

Non-authoritative answer:
www.imasy.or.jp has AAAA address 3ffe:505:0:1:220:edff:fe88:788c
www.imasy.or.jp has AAAA address 2001:200:300:1:220:edff:fe88:788c
Name:   www.imasy.or.jp
Address: 202.227.24.5

Authoritative answers can be found from:
imasy.or.jp     nameserver = tasogare.imasy.or.jp.
imasy.or.jp     nameserver = light.imasy.or.jp.
light.imasy.or.jp       internet address = 202.227.24.4
light.imasy.or.jp       has AAAA address 2001:200:300:1:2a0:c9ff:fe61:6521
light.imasy.or.jp       has AAAA address 3ffe:505:0:1:2a0:c9ff:fe61:6521
tasogare.imasy.or.jp    internet address = 202.227.24.5
 なお、*BSDのリゾルバはIPv6でクエリを行えるようになっているので、*BSDのみのネットワークならIPv6だけでも生活できる。しかし、現状ではWindows 2000のリゾルバはIPv6によるクエリをサポートしていない。組織内にWindows 2000がいる場合はIPv6のみのネットワークを構築できないので注意願いたい。

パケットアナライザ

 ちゃんとIPv6でアクセスできているか、あるいはIPsecを使用するように設定した際にパケットが暗号化されているか不安になるものである。確認するにはパケットアナライザが役に立つ。
 *BSDに添付されているtcpdumpはIPv6対応しているので標準的に使用できる。たとえば、インターフェイスwi0に流れるパケットを見るには
tcpdump -i wi0 -s 256 -X
という感じで実行する。  また、EtherealというGUIベースのアナライザがある(図4)。
図4 Ethereal
Ethereal
 Etherealの使い方はいたって簡単である。メニューからCapture→StartをクリックするとCapture Preferencesダイアログが現れる。OKをクリックするとキャプチャが開始さ れる(図5)。Stopをクリックするとキャプチャを終了しキャプチャ結果が表示される(図6)。
図5 Preferencesダイアログ
Ethereal
図6 Captureダイアログ
Ethereal
 特定のパケットをフィルタしたりできるのでいろいろ試してみてほしい。

おわりに

 組織のネットワークをIPv6対応する際に必要となる経路制御やDNSの設定について簡単に紹介した。本稿がIPv6導入の手がかりになれば幸いである。


*01) http://www.zebra.org/
*02) KAMEがBIND8用のパッチを提供している。


All Rights Reserved, Copyright (C) 2001 Hajimu UMEMOTO
Last Modified Nov 12, 2001
ume@mahoroba.org