FreeBSDではじめるIPv6 第6回

(FreeBSD PRESS No.11)

梅本肇 / ume@mahoroba.org

 先号は特別号でしたので、本連載はお休みさせていた だきました。前回の原稿を書いていた時は4.5-RCでした が、気づくともう4.6-PRERELEASEです。月日が経つのが 早いのか、それともFreeBSDのリリースペースが早いの か…
 なんにしても、4.5-RELEASEには、IPv6、特にトンネ ルで使用する際に致命的な問題を抱えていましたので、 4.6-RELEASEが待ち遠しい今日このごろです。
 今回は、日本においても身近になってきた6to4関連の 話題と、前回以降大きく進展があったWebまわりについ て少し紹介したいと思います。

1. 6to4

1.1 6to4とは

 6to4*1)はIPv6をIPv4にカプセル化して流すトンネル 技術のひとつで、2002::/16から始まる6to4のアドレス 空間について、IPv4の経路表を見て経路制御をおこなう のが特徴です。gifではトンネルごとに両端で設定が必 要ですが、6to4では必要ありません。

 6to4は、IPv4アドレスから一意に導出されるIPv6ア ドレスを使用します。先頭16ビットが2002で、次の32 ビットがIPv4アドレスの16進数表現となります。
 例えば、IPv4アドレスが202.227.26.34の場合、 2002:cae3:1a22::/48が6to4アドレスとなります。(図1)

図1 6to4アドレス
2002:cae3:1a22:0000:0000:0000:0000:0001
^^^^ ^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^
 |       |      |            |
 |       |      |            +-- インタフェース識別子
 |       |      +--------------- SLA識別子
 |       +---------------------- IPv4アドレスの16進数表現
 +------------------------------ 6to4プレフィックス
 6to4アドレス空間内のノードに対しては、直接やりと りをおこないます。6to4のアドレス空間と6to4以外の IPv6アドレス空間との通信は6to4リレールータと呼ばれ るルータを経由することによって実現されます。
 6to4アドレス空間とIPv6アドレス空間との通信におい ては、行きと帰りとで別の経路を通ることが一般的です。 行きに通る6to4リレールータはIPv6デフォルト経路で指 定したものとなりますが、帰りは、IPv6的に近い6to4リ レールータを通ることになるからです(図2)。
 これまで、6to4リレールータはMicrosoft社とCicso社 が提供するものをはじめいくつかありましたが、日本か ら利用するには遠く、あまり実用的ではありませんでし た。しかし、最近、KDDI研究所により6to4.jpの実験運 用が開始され*2)、日本においてもかなり快適に利用で きる環境になってきました。
図2 6to4空間とIPv6空間の通信
6to4空間とIPv6空間の通信

1.2 6to4の設定

 FreeBSDでももちろん6to4が利用できます。6to4トン ネルにはstf仮想ネットワークイ・インタフェースを使 用します。/etc/rc.confで6to4に関係する設定項目は以 下の4つです。
stf_interface_ipv4addr=""
自ホストのIPv4アドレスを指定します。この項 目を指定すると、6to4インタフェースが有効に なります。
stf_interface_ipv4plen="0"
接続相手先のIPv4アドレスの範囲を制限したい 場合に、6to4で使用するIPv4アドレスのプレ フィックス長を指定します。有効な値は0から 31で、0を指定すると全てのIPv4アドレス空間 を対象とします。通常は、デフォルトの0から 変更する必要はないでしょう。
stf_interface_ipv6_ifid="0:0:0:1"
6to4で使用するIPv6アドレスのホスト部を指定 します。AUTOを指定した場合、MACアドレスか ら生成されるEUIアドレスを使用します。
stf_interface_ipv6_slaid="0000"
SLA識別子を指定します。

1.3 単一ノードを6to4で接続

 たとえば、単一ノードを6to4で接続する場合の /etc/rc.confは図3のようになります。この場合、図4の ように6to4アドレスが算出されます。
 また、IPv6デフォルト経路を6to4.jpが提供する6to4 ルータに向けています*3)
図3 単一ノードを接続する場合の/etc/rc.confの例
ipv6_enable="YES"
stf_interface_ipv4addr="202.227.26.34"
ipv6_defaultrouter="2002:caff:2d05::1"
図4 /etc/rc.confの設定項目と生成される6to4アドレス
    +--------------------------- stf_interface_ipv4plen="0"
    |
    v
2002:cae3:1a22:0000:0000:0000:0000:0001
^^^^ ^^^^^^^^^ ^^^^ ^^^^^^^^^^^^^^^^^^^
 |       |      |            |
 |       |      |            +-- stf_interface_ipv6_ifid="0:0:0:1"
 |       |      +--------------- stf_interface_ipv6_slaid="0000"
 |       +---------------------- stf_interface_ipv4addr="202.227.26.34"
 +------------------------------ 6to4プレフィックス

1.4 ネットワークを6to4で接続

 6to4アドレスは、IPv4アドレス1個に対して/48の空間 が使用できます。6to4 でネットワークを接続する場合、 図5のような感じになるでしょう*4)
 この時の/etc/rc.confは図6のようになります。6to4 接続をおこなう部分(先頭から3行)は単一ノード接続の 場合と変わりません。後の5行はローカルのネットワー ク側の設定です。
図5 ネットワーク接続
ネットワーク接続
図6 6to4接続ルータの/etc/rc.confの例
ipv6_enable="YES"
stf_interface_ipv4addr="202.227.26.34"
ipv6_defaultrouter="2002:caff:2d05::1"

ipv6_network_interfaces="fxp0"
ipv6_prefix_fxp0="2002:cae3:1a22:1"
ipv6_gateway_enable="YES"
rtadvd_enable="YES"
rtadvd_interfaces="fxp0"
 ローカルのネットワーク側にはstf0に付けたものと異 なったプレフィックスを割り当てます。
 stf0の設定についてはrc.confに項目が用意されてい ますが、それ以外は特に用意されていません。ローカル のネットワーク側に割り当てるプレフィックスを自分で 算出してipv6_prefix_*に書く必要があります。
 先頭16ビットは2002で固定です。次の32ビットはIPv4 アドレスの16進表記です。ここまでは、stf0に割り当て たプレフィックスと変わりません。SLA識別子つまり次 の16ビットを、stf_interface_ipv6_slaidと異なる値に します。stf_interface_ipv6_slaidをデフォルトのまま 使用している場合、0以外にします。図6の例では1を使 用しています。
 残りの設定で、ルーターとして機能するようフォワー ディングを有効にし、ローカルのネットワーク側にRAを 流すようにしています。

1.5 IPv4アドレスが固定でない環境での6to4

 6to4アドレスはIPv4アドレスから一意的に決定されま す。そのため、IPv4アドレスが固定ではない環境では、 IPv6アドレスも変化する可能性があります。
 単一ノードを接続するだけであれば、IPv4アドレスが 固定ではない環境であっても、IPv4でダイアルアップし ているのとそんなに状況は変わらず、快適に利用できま す。しかし、6to4でネットワークを接続しようとすると、 IPv4アドレスが変化するたびに、ルータ・リナンバリン グが発生することになります。
 ルータ・リナンバリングには、DNSとの同期をどうす るかなど課題が多く、現状では、6to4をネットワークで 使用するのは現実的ではないでしょう。

 また、rtadvdは、どういうRAを送出するかについて、全て任せるか全て設定するかのどち らかという考え方で作られています。ダイナミックに割 り当てたプレフィックスに対しては、有効期限をデフォ ルトの値から変更することができません。このデフォル ト値は非常に長く*5)、プレフィックスが変化した場合、 新しいアドレスはすぐに割り当てられますが、古いアド レスがいつまでも残ってしまい、このような環境で使うには具合が良くありません。
 IPv4アドレスが固定ではない環境で6to4をネットワー クでどうしても使いたい場合は、IPv4アドレスが変化し た際に/etc/rtadvd.confを書き出し、rtadvdを再起動す るというスクリプトを用意することになるでしょう。

 加えて、一旦deprecated状態になったアドレスについ て、同じプレフィックスを公告するRAを受け取っても deprecatedが消えないという不具合がありました。この 問題は4.6-RELEASEで直っています。

1.6 ダイアルアップで6to4

 ダイアルアップやIPv4アドレスが固定でないADSLでの 常時接続環境では、PPP接続時にIPv4アドレスが確定す るため、6to4の設定を/etc/rc.confに書いておくことが できません。
 そこで、PPPリンク確立時に6to4の設定をおこなうよ うにするとよいでしょう。
 リスト1は6to4の設定をおこなうスクリプトの例です。 実際に6to4トンネルを設定する部分は/etc/rc.network6 のnetwork6_stf_setupをを呼び出しているだけです。 PPPで割り当てられたIPv4アドレスと、IPv6デフォルト 経路を引数に与えます。
リスト1 /etc/ppp/6to4.sh
#!/bin/sh

if [ -r /etc/defaults/rc.conf ]; then
	. /etc/defaults/rc.conf
	source_rc_confs
elif [ -r /etc/rc.conf ]; then
	. /etc/rc.conf
fi

stf_interface_ipv4addr="$1"
ipv6_defaultrouter="$2"

case ${ipv6_enable} in
[Yy][Ee][Ss])
	if [ -r /etc/rc.network6 ]; then
		. /etc/rc.network6
		network6_stf_setup
		route add -inet6 default ${ipv6_defaultrouter}
	fi
	;;
esac
 PPPリンク確立時に6to4.shを呼び出すよう /etc/ppp/ppp.linkupに記述します。tun0に割り当てら れたIPv4アドレスはMYADDRで得られますので、第1引数 に指定しています。また、第2引数で、IPv6デフォルト 経路を6to4.jpに向けています(リスト2)。
リスト2 /etc/ppp/ppp.linkupの設定例
MYADDR:
 ! sh -c "/etc/ppp/6to4.sh MYADDR 2002:caff:2d05::1"
 PPPリンクが切れた時に6to4の設定を削除します。リ スト3の例では、stfカーネル・モジュール自体をアンロー ドしています。ちょっと野蛮ではありますが、6to4アド レスを求めたりするのをサボることができます。ただし、 kernelにstfを組み込んでいる場合には使えない手です *6)。  なお、kernelにインタフェースが組み込まれていない 場合、必要になった時点でifconfigが自動的にロードし ますので、明示的にif_stfをkldloadする必要はありま せん。
リスト3 /etc/ppp/ppp.linkdownの設定例
MYADDR:
 ! sh -c "kldunload if_stf"
 6to4.shでは/etc/rc.confでipv6_enable="YES"が指定 されている場合のみ6to4の設定をおこなうようにしてあ りますので、/etc/rc.confに指定しておきます。
 また、インタフェース識別子やSLA識別子をデフォル トから変更したい場合は、/etc/rc.confに stf_interface_ipv6_ifidやstf_interface_ipv6_slaid を指定しておきます(図7)。
図7 /etc/rc.confの設定例
ipv6_enable="YES"

2 Webまわりの近況

2.1 Mozilla

 前回は、Mozillaのports/packagesにはIPv4のみの版 とIPv6対応版があるという話をしましたが、その後、大 きく進展がありました。
 IPv6サポートを有効にした場合にあった という問題が解決され、めでたく、ports/www/mozilla ひとつに統合されました。4.6-RELEASEには ports/www/mozilla+ipv6はありませんので、迷わず ports/www/mozillaをインストールしましょう。

2.2 Apache2

 いよいよ、IPv6を正式にサポートしているApacheバー ジョン2が正式版になりました。本稿執筆時点で2.0.36 となっており、ports-currentのports/www/apache2も 2.0.36になりました。
 とはいうものの、対応するサードパーティ・モジュー ルはまだまだ少ないです。また、Apache2対応をうたっ ていたとしても、必ずしもIPv6に対応しているとは言え ないでしょう。
 筆者はまだ試していませんが、mod_php4はApache2に 対応しています。ソースを軽く眺めた感じでは、IPv6も 考慮しており、FTPなどはIPv6をしゃべることができる ようです。しかし、sockets拡張APIの部分はまだIPv6対 応していないように見えます。
 mod_php4はportsからインストールする際に、 WITH_APACHE2=yesを指定すると、Apache2用に作られま す。

3. おわりに

 日本は6bone-JPがあり、これまでも比較的容易にIPv6 接続をおこなえる環境ではありました。しかし、まだま だ敷居が高いと敬遠される方が多かったようです。また、 Freenet6は敷居が低いものの、日本からは遠く快適に利 用できるものではありませんでした。6to4リレールータ の運用が始まったことで、気軽にIPv6を始められるよう になったと思います。まだIPv6 接続されていない方は、 一度試されてみてはいかがでしょうか?


*1) RFC3056
*2) http://www.6to4.jp/
*3) 利用の際には、 http://www.6to4.jp/mod.html にある「ご承諾事項」を承諾の上利用するようにしてください。
*4) もちろん、IPv4ルータと6to4ルータを兼ねる構成もありです。
*5) Valid lifetime: 30日、 Preferred lifetime: 7日
*6) GENERICにはstfは組み込まれていません。


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