いやぁぁ。(2000 年の)インタロップも無事に終り、od-driver パッチは本家に吸収されそうで 秋山さん はコミッタになるし。で、僕はと言うと・・。IPv6 でもやっちゃおうかな;-)。
そんなこんなで、自宅にグローバルな IPv6 が入りました。ふっふっふっ。ちっとその辺りを書いて見たいと思います。割と簡単に利用出来ます。しっかりやると実は結構大変だったりするのですが;-)。ではごゆっくりと、IPv6 の世界を堪能してください;-P。
あ、今回のターゲットは、4.0-RELEASE(対応 OS として、4.1、4.1.1-RELEASE に付いても書き込んでいます) に付いてです。3 系 KAME に付いては当てはまらない所が多いかも知れません。その事を覚えといてください。
また、4.0-RELEASE では、IPv4 と IPv6 のデュアルスタック、4.1-RELEASE 以降はは IPv6 オンリーで運用可能ですが、ここでは、IPv4 と IPv6 のデュアルスタックでの運用に付いて書いています。
・カーネルを IPv6 対応に。
KAME キットが 4.0-RELEASE で吸収された為に簡単に IPv6 を利用する事ができます。カーネルのコンフィグファイルに以下の行を入れて新しいカーネルを作るとグーです。
----------------
options INET6 # IPv6 通信プロトコル
:
pseudo-device gif 4 # IPv6 と IPv4 をトンネリング
----------------
そして、/etc/rc.conf にちろっと以下の行を設定をします。ipv6_network_interfaces="rl0" が書いてると ipv6_default_interface="rl0" は不要だそうです。ま、ご自分の環境でいろいろためしてみてください。
----------------
ipv6_enable="YES"
ipv6_network_interfaces="rl0"
ipv6_default_interface="rl0"
----------------
リブートした時に、以下のメッセージが出ればカーネルが IPv6 対応した事になります。ただしっ!!このメッセージは不評だった為、実際に出力されるのは、4.0-RELEASE だけです。5.0-CURRENT や 4.1-RELEASE 以降のバージョンではこのメッセージは出なくなりました。KAME も随分前の SNAP から出なくしています。
----------------
rl0: starting DAD for fe80:0001::0200:e8ff:feeb:1ce3
rl0: DAD complete for fe80:0001::0200:e8ff:feeb:1ce3 - no duplicates found
----------------
マルチキャストして、「同じ IPv6 を持つノードが存在せぇへんかったでぇ。ほんならわてが使うでぇぇ。」等と、関西弁で宣言しています;-)。
後は、ifconfig -a とか netstat -nr して IPv6 が付いた事を確認しましょう。
--- ifconfig -a ---
rl0: flags=8843 mtu 1500
inet 192.168.1.5 netmask 0xffffff00 broadcast 192.168.1.255
inet6 fe80::200:e8ff:feeb:1ce3%rl0 prefixlen 64 scopeid 0x1
inet6 3ffe:505:2019:1:200:e8ff:feeb:1ce3 prefixlen 64
inet6 3ffe:505:2019:1:: prefixlen 64 anycast
ether 00:00:e8:eb:1c:e3
media: autoselect (100baseTX ) status: active
supported media: autoselect 100baseTX 100baseTX 10baseT/UTP 10baseT/UTP 100baseTX
lp0: flags=8810 mtu 1500
ppp0: flags=8010 mtu 1500
lo0: flags=8049 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
gif0: flags=8050 mtu 1280
inet6 fe80::200:e8ff:feeb:1ce3%gif0 prefixlen 64 scopeid 0x5
gif1: flags=8010 mtu 1280
inet6 fe80::200:e8ff:feeb:1ce3%gif1 prefixlen 64 scopeid 0x6
gif2: flags=8010 mtu 1280
inet6 fe80::200:e8ff:feeb:1ce3%gif2 prefixlen 64 scopeid 0x7
gif3: flags=8010 mtu 1280
inet6 fe80::200:e8ff:feeb:1ce3%gif3 prefixlen 64 scopeid 0x8
stf0: flags=8000 mtu 1280
inet6 fe80::200:e8ff:feeb:1ce3%stf0 prefixlen 64 scopeid 0x9
faith0: flags=8000 mtu 1500
tun0: flags=8051 mtu 1500
----------------
--- netstat -nr (IPv6 部分)---
Internet6:
Destination Gateway Flags Netif Expire
::/96 ::1 UGRSc lo0
::1 ::1 UH lo0
::ffff:0.0.0.0/96 ::1 UGRSc lo0
3ffe:505:2019:1::/64 link#1 UC rl0
3ffe:505:2019:1:200:e8ff:feeb:1ce3 0:0:e8:eb:1c:e3 UHLW lo0
3ffe:505:2019:1:280:45ff:fe06:36c6 0:80:45:6:36:c6 UHLW rl0
fe80::/10 link#1 UCS rl0
fe80::%rl0/64 link#1 UC rl0
fe80::%lo0/64 fe80::1%lo0 Uc lo0
fe80::%gif0/64 fe80::200:e8ff:feeb:1ce3%gif0 Uc gif0
fe80::200:e8ff:feeb:1ce3%gif0 ::1 UH lo0
fe80::%gif1/64 fe80::200:e8ff:feeb:1ce3%gif1 Uc gif1
fe80::200:e8ff:feeb:1ce3%gif1 ::1 UH lo0
fe80::%gif2/64 fe80::200:e8ff:feeb:1ce3%gif2 Uc gif2
fe80::200:e8ff:feeb:1ce3%gif2 ::1 UH lo0
fe80::%gif3/64 fe80::200:e8ff:feeb:1ce3%gif3 Uc gif3
fe80::200:e8ff:feeb:1ce3%gif3 ::1 UH lo0
fe80::%stf0/64 fe80::200:e8ff:feeb:1ce3%stf0 Uc stf0
fe80::200:e8ff:feeb:1ce3%stf0 ::1 UH lo0
ff01::/32 ::1 U lo0
ff02::/16 link#1 UCS rl0
ff02::%rl0/32 link#1 UC rl0
ff02::%lo0/32 fe80::1%lo0 UC lo0
ff02::%gif0/32 fe80::200:e8ff:feeb:1ce3%gif0 UC gif0
ff02::%gif1/32 fe80::200:e8ff:feeb:1ce3%gif1 UC gif1
ff02::%gif2/32 fe80::200:e8ff:feeb:1ce3%gif2 UC gif2
ff02::%gif3/32 fe80::200:e8ff:feeb:1ce3%gif3 UC gif3
ff02::%stf0/32 fe80::200:e8ff:feeb:1ce3%stf0 UC stf0
----------------
さ、これでだいじょうぶかな?こんな感じで IPv6 Ready です;-)。
・IPv6 のお勉強。
さささ、続いてIPv6 のアドレス形態に付いてのお勉強ですが、ここでは一切がっさい省略します。書くのが面倒なので・・(^^;;この辺りを知りたい方は、
http://playground.iijlab.net/iij.news/
でお勉強してください;-P。おおまかな点に付いてはこれで解るはずです。かずさん が書いたので間違いも無いです。ま、これだけではなんなんで、一番覚える必要のあるのは、
・リンクローカルアドレス
・サイトローカルアドレス
・グローバルアドレス
です。すごく簡単に説明すると、
リンクローカルアドレスは、fe80 で始まる IPv6 アドレスです。正確に言うと "1111 1110 10" で始まる IPv6 アドレスで、ノードを識別する為のアドレスです。
サイトローカルアドレスは fec0 で始まるアドレスでが、正確に言うと "1111 1110 11" で始まる IPv6 アドレスです。複数のノードの集まりを識別するアドレスですが、ルータから外に出る事はありません。
グローバルアドレスはそのままですね。IPv6 的な言い方をすると、「集約可能グローバルユニキャストアドレス」と言います。長いですね;-)。私の利用しているのは、3ffe で始まる、学術利用の IPv6 アドレスです。
さ、これらの他に、覚え無ければならない言葉として、
・ユニキャストアドレス
・エニィキャストアドレス
・マルチキャストアドレス
があります。そこに スコープ ID なんてのも入って来ます。えっとぉぉ・・。上の URL の説明だけで全部載ってたかなぁ・・(^^;;。
マルチキャストアドレスは ff00::/8 です。IPv4 の頃はブロードキャストアドレスと言っていたりしました。後、ループバックアドレスは、IPv4 の頃は 127.0.0.1 でしたが IPv6 になると ::1 になります。簡単な表記だ;-)。これらの他にリンクローカル全ルータ、つまりあるリンク上のすべてのルータが参加するマルチキャスト・アドレスです。 として、ff02::1 を知っておくと便利です;-)。ping6 -w -c1 ff02::1 なんてのはすごく幸せです;-)。
・実際に使ってみるか。
IPv6 に対応したフログラムはいろいろ有ります。例えば、ping6 とか、telnet は標準で対応しています。ftp は -4 と言うオプションがあります。と、言う事は裏を返すと既に対応している。と、言う事ですね。後は、libwarp も対応しているので hosts.aliow にもいろいろ書けるし。
けどもまぁ、人情としては真っ先に ping を打ってみるべ。と、言う事になりますね。ふみふみ。こんな感じになります。おーー。通るやんけ。うけけ(^^)V。今は、リンクローカルな IPv6 アドレスに ping6 しています。オプションに -I NIC を付けます。
----------------
% ping6 -I rl0 fe80::200:e8ff:feeb:1ce3
PING6(56=40+8+8 bytes) fe80::200:e8ff:feeb:1ce3 --> fe80::200:e8ff:feeb:1ce3
16 bytes from fe80::200:e8ff:feeb:1ce3, icmp_seq=0 hlim=64 time=0.188 ms
16 bytes from fe80::200:e8ff:feeb:1ce3, icmp_seq=1 hlim=64 time=0.143 ms
^C
% ping6 fe80::200:e8ff:feeb:1ce3%rl0
PING6(56=40+8+8 bytes) fe80::200:e8ff:feeb:1ce3 --> fe80::200:e8ff:feeb:1ce3
16 bytes from fe80::200:e8ff:feeb:1ce3, icmp_seq=0 hlim=64 time=0.176 ms
16 bytes from fe80::200:e8ff:feeb:1ce3, icmp_seq=1 hlim=64 time=0.2 ms
^C
----------------
上の例の他に、下の ping6 の例は最後に %rl0 等と "%" の後に NIC を付ける方法があります。ま、どっちにしてもパケットが通った様ですね。素晴らしい。ぱちぱちぱち。んだば次は、telnet だべ。と思いつつ、
----------------
% telnet fe80::200:e8ff:feeb:1ce3
Trying fe80::200:e8ff:feeb:1ce3...
telnet: Unable to connect to remote host: No route to host
% telnet -I rl0 fe80::200:e8ff:feeb:1ce3
telnet: illegal option -- I
Usage: telnet [-8] [-E] [-L] [-N] [-S tos] [-a] [-c] [-d] [-e char] [-l user]
[-n tracefile] [-r] [-s src_addr] [-P policy] [host-name [port]]
% telnet fe80::200:e8ff:feeb:1ce3%rl0
Connected fe80::200:e8ff:feeb:1ce3%rl0
Escape character is '^]'.
FreeBSD/i386 (koro.running-dog.net) (ttyp4)
login:
----------------
なんだぁ?ダメじゃん・・。実は、リンクローカルアドレスを使う分には ping6 しか使えません。リンクローカルアドレスしか無い環境では正しい IPv6 環境は構築出来ないし何も出来ません。まず、ここで第一の大きな暗礁に乗り上げます。しくしく。
上の例でちょっと見てみると、一番上の telnet はリンクローカルな IPv6 アドレスに対して telnet していますが、これは失敗。次に ping6 みたいに -I NIC オプションを付けたら「そんなオプションねぇよ。」と怒られ、最後に、リンクローカルアドレス + % スコープ ID で試してみた所接続しました。ふぅぅ。良かった。
と、言う事で fe80::200:e8ff:feeb:1ce3%rl0 と、言う形式で、スコープ ID を付加して何かしてあげましょう。ちなみにこの時、
telnet: Unable to connect to remote host: Connection refused
こんな感じに refuse になってるのは、サーバ側が待ってないか、アクセス制御が掛かっているためでしょう。簡単に言うと、/etc/hosts.allow で IPv6 が通らない設定になっているのでは無いでしょうか?それを確認してみてください。
さて、リンクローカルな IPv6 を利用してウダウダする分にはまぁ、あんまり勧められません。それにちょっとやだなぁ・・。と、言う感じです。
じゃどうするか?と、言うと、サイトローカルアドレスを使う。と、言う方法がありますが、現在、サイトローカルアドレスを使う時の実装に付いてがまだ固まっていない為チュウブラリン状態です。あれれ。
と、言う事で今の所一番良いのは、自宅の LAN 内でクローズされた状態の時には、でっちあげグローバルアドレスを利用するのが早い。と、言う事になります。
これらに付いては、私の質問した、
http://home.jp.FreeBSD.ORG/cgi-bin/showmail/ipv6-jp/694
からのスレッドに目を通して頂ければと思います。
さささ、後は、/etc/rc.conf で prefix を指定して、グローバルな IPv6 アドレスを利用していろいろ試してみましょう。ふみふみ。
ちなみに僕の環境では、先に出た ifconfig -a の結果を見れば解ると思いますが、3ffe:505:2019:1:200:e8ff:feeb:1ce3 と言うグローバルな IPv6 アドレスが付いています。私は 3ffe:505:2019::/48 と、言う膨大な量の IPv6 アドレスを持っています。正確に言うと借りています。と書くのが正しいかと・・(^^;;。
第一部完。
・続いて第二部。実際に利用するぞ篇。
ここからは、何らかの原因により、グローバルな IPv6 アドレスが手に入ったモノとして書いて行きたいとおもいます。ぱちぱちぱち。駆け足でてくてく書いて行くので UNIX 系に全くのシロートさんにはちと辛いかも・・。では行きます。
カーネルを作り変えて、IPv6 を使う設定にした時には、もうばりばりの IPv6 Ready 環境でしょう;-)。グローバルな IPv6 アドレスのプレフィックス 64bit 分を指定してあげます。
----------------
ipv6_enable="YES"
ipv6_network_interfaces="rl0"
ipv6_default_interface="rl0"
#
ipv6_gateway_enable="YES"
ipv6_prefix_rl0="3ffe:505:2019:1"
----------------
自分が今いじっているマシンを IPv6 ルータとするなら、ipv6_gateway_enable="YES" とします。同じ LAN 内のマシンがマルチキャストして IPv6 アドレスを取得しに来る事でしょう;-)。上の /etc/rc.conf 内の設定は実は、内部的には以下のコマンドを叩いています。
----------------
sysctl -w net.inet6.ip6.forwarding=0
sysctl -w net.inet6.ip6.forwarding=1
prefix rl0 3ffe:505:2019:1::
rtadvd rl0
----------------
一行目は、ある設定の初期値として、"0" をセットしています。二行目は自分が IPv6 ルータとだっ!!と、宣言する為に、"1" をセットします。続いて、プレフィックスを指定して、rtadvd を rl0 向けに起動します。
ちなみにクライアント(3.4-RELEASE+KAME)の場合は以下だけで良いです。
----------------
/sbin/sysctl -w net.inet6.ip6.forwarding=0
/sbin/sysctl -w net.inet6.ip6.accept_rtadv=1
/usr/local/v6/sbin/rtsol ed0
----------------
クライアント側である 4.1.1-RELEASE の rc.conf は以下の様になります。
----------------
ipv6_enable="YES"
ipv6_network_interfaces="fxp0"
----------------
さ、ifconfig -a で見て見ましょう。無事に IPv6 が付きましたか?では次のステップに行きましょう。ふふふ。
まずは、named を起動する必要があります。ftp://ftp.isc.org/isc/bind9/ から bind9 を拾って来て make しましょう。zone ファイルは基本的に bind-8.2.2 のと変わりません。ちょっと違う点は、IPv6 の逆索きの設定ですね。ま、以下の様な感じで設定しましょう。
--- named.conf のエントリ ---
options {
directory "/etc/namedb";
pid-file "/etc/namedb/named.pid";
}
zone "localhost" {
type master;
file "localhost.zone";
};
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" {
type master;
file "0.0.0.1.zone";
};
zone "v6.running-dog.net" {
type master;
file "v6.running-dog.net.zone";
};
zone "1.0.0.0.9.1.0.2.5.0.5.0.e.f.f.3.IP6.INT" {
type master;
file "1.0.0.0.9.1.0.2.5.0.5.0.e.f.f.3.IP6.zone";
};
----------------
--- localhost.zone ---
$TTL 3600
@ IN SOA running-dog.net. takachan@running-dog.net. (
2000062200 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)
IN NS koro.v6.running-dog.net.
IN NS boss.v6.running-dog.net.
;
IN A 127.0.0.1
IN AAAA ::1
----------------
--- 0.0.0.1.zone ---
$TTL 3600
@ IN SOA v6.running-dog.net. takachan@running-dog.net. (
2000062200 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)
IN NS koro.v6.running-dog.net.
IN NS boss.v6.running-dog.net.
;
1 IN PTR localhost.
----------------
--- v6.running-dog.zone ---
$TTL 3600
@ IN SOA running-dog.net. takachan@running-dog.net. (
2000062200 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)
IN NS koro.v6.running-dog.net.
IN NS boss.v6.running-dog.net.
;
pochi IN AAAA 3ffe:505:2019:1:260:8ff:feb0:7e58
IN MX 10 pochi
boss IN AAAA 3ffe:505:2019:1:280:45ff:fe06:36c6
IN MX 10 boss
koro IN AAAA 3ffe:505:2019:1:200:e8ff:feeb:1ce3
IN MX 10 koro
nora IN AAAA 3ffe:505:2019:1:2e0:7dff:fe84:18b4
IN MX 10 nora
----------------
--- 1.0.0.0.9.1.0.2.5.0.5.0.e.f.f.3.IP6.zone ---
$TTL 3600
@ IN SOA running-dog.net. takachan@running-dog.net. (
2000061107 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ; Minimum
)
IN NS koro.v6.running-dog.net.
IN NS boss.v6.running-dog.net.
;
3.e.c.1.b.e.e.f.f.f.8.e.0.0.2.0 IN PTR koro.v6.running-dog.net.
8.5.e.7.0.b.e.f.f.f.8.0.0.6.2.0 IN PTR pochi.v6.running-dog.net.
6.c.6.3.6.0.e.f.f.f.5.4.0.8.2.0 IN PTR boss.v6.running-dog.net.
4.b.8.1.4.8.e.f.f.f.d.7.0.e.2.0 IN PTR nora.v6.running-dog.net.
----------------
これで bind9 を起動しましょう。ちなみに、2001/02/12 現在の最新版は、9.1.0 で、これは、A6 レコードに対応しています。
/etc/resolv.conf の nameserver の設定の所で IPv6 アドレスを書いてみましょう。ping6 であるとか、telnet 等はサクサクと動きます。本当に IPv6 Ready 状態ですね;-)。ただし、 nslookup コマンドは使えません。4.2-RELEASE に入っているヤツでさえ利用できないです。しゃーないので作ってあげます。
ftp://ftp.isc.org/isc/ から bind-8.1.2 のソースを持って来て、ftp://ftp.kame.net/pub/kame/misc/ から bind-8.1.2 用の IPv6 対応のパッチを持って来ます。今回、named を作る訳ではないのでほどほどに make して、エラーになってもそれは named で、nslookup コマンドは無事に make 出来ているみたいなのでそれを取り出して・・。等としてふふふ。すかさず、nslookup。おーーっ!!。
ちなみに bind9 にも nslookup が付いていますがちと動作が怪しいです。dig とか host コマンド使えよな。って感じでかいてあります。
4.0-RELEASE で DNS IPv6 transport が使えるように見えますが DNS IPv6 transport をまだサポートしていません。nslookup は resolver code を自前で持っているので、単に、IPv6 対応の nslookup だと IPv6 を使っているだけです。それ以外は、IPv4 で query されます。
ちなみに 5.0-CURRENT には最近入ったので、5.0-CURRENT だと IPv6 で query できます。しばらく様子を見て、問題なければ MFC する予定だそうです。次の 4 系リリースが楽しみですね;-)。
駆け足だけれど、これで結構本格的な IPv6 環境が出来ました。あ、言い忘れました。私の家の IPv6 環境ですが、以下になります。
・FreeBSD4.2-RELEASE
ダイアルアップサーバで ipnat しています。
・FreeBSD4.2-RELEASE
私の普段使っているデスクトップがあります。
・Solaris8 IA32
IPv6 お喋り出来ます;-)。
・Kondara MNU/Linux 1.2 include IPv6 RPMS
IPv6 喋り出来ます;-)。USAGI では無いです。JIRAI 環境に持っていけないの・・。
・Windows2000 Server
IPv6Kit.exe で IPv6 喋り出来ます;-)。
これらがまとめて IPv6 お喋りします;-)。FreeBSD4.0-RELEASE には、apache-1.3.12 を IPv6 対応してます。DNS にも登録してあるのでサクサクと行きます。Windows2000 は TeraTermPro に IPv6 対応マクロがあるのでこれを組み込みます。また、IE5 は 既に IPv6 対応しているので割と簡単にアクセス出来ます。
一番大変なのは多分、FreeBSD3.4-RELEASE+KAME で、inetd.conf 等、IPv6 対応のモノに置き換える必要があります。また、libwarp.a が IPv6 対応してないので、hosts.allow の変更も必要です。アクセスしにくいノード。と、言う事になるでしょう。
自分が IPv6 化したいプログラムは http://www.ipv6.org/ であるとか、ftp://ftp.kame.net/pub/kame/misc/ を確認してみましょう。IPv6 化の為の patch があったりします。私の apache は KAME からパッチを持って来て作成したモノです。他にいもいろいろあるので眺めてみてください;-)。
・IPv6 用のプロキシ。
さ、apache が IPv6 化したおかげで netscape はどっちでアクセスしているのだろう?と言う疑問が出て来ます。apache の access_log を見ると、それが解ります。 IPv4 アドレスのログが残っていた場合は、IPv4 でのアクセス。IPv6 アドレスのログが残っていた時にはその通り。って感じです;-)。
通常、netscape は IPv4 でしか通りません。mozilla M16 は mozilla.org からバイナリをダウンロードして来たモノを使っている場合に IPv6 Ready にはなっていません。これらで、IPv6 な web サイトを見に行ってもあれれ・・。見る事が出来ません。ではどーするか?と、言うと、 IPv4 から IPv6 に変換するプロキシサーバを利用する事にします。IPv6 化した apache のプロキシを使うか、wwwoffle と言うプログラムを使います。以下は簡単なインストールに付いてです。wwwoffle-port.tgzと、言う ports を持って来て適当な所で make します。
尚、現在の Mozilla-0.8 やそれ以降のバージョンでは、パッチを当てる事により IPv6 Ready になります。なので、wwwoffle をインストールする必要は無いかもしれないです。ただ、IPv4 と IPv6 のサイトが有った場合デェフォルトで IPv6 の経路をアクセスします。IPv6 がとぎれていて、IPv4 でしか見えない場合、mozilla では見えない事ななります。
----------------
# tar xvzfp wwwoffle-port.tgz
# cd wwwoffle
# make FETCH_CMD=ftp
# make install
----------------
この ports は 3 系 FreeBSD 様で、4.1-RELEASE では make 出来なくなりました。そんな時は、ftp://ftp.kame.net/pub/kame/misc/wwwoffle-25e-v6-20000924.diff.gz を持ってきて、ソースを持ってきて make して上げましょう。4.1.1-RELEASE の頃では最新版です。
起動は root 権限で起動します。下の行は一般ユーザでも問題有りません。
----------------
# /usr/local/sbin/wwwoffled
% /usr/local/bin/wwwoffle -online
----------------
そして、netscape の proxy 設定において、http の proxy を 127.0.0.1:8080 に指定します。これで netscape が IPv6 対応になります;-)。
さ、これで DNS と web に付いては IPv6 化が終りました。ふぅぅ。なかなかしんどかったかな。これにて、
第二部完。
・最終幕第三部;-)。トンネルを掘ろう。
さささ、後はいよいよ IPv6 接続するだけですね。その事に付いて書いてみたいと思います。尚、ここまでの大前提として、
o.何らかの手段によりグローバルな IPv6 アドレスを取得している事
o.何らかの手段により IPv6 トンネル IPv4 してくれるプロバイダを見付けた事
が必要です。うひゃぁぁ。こら無理だ・・。ここから先を書いても読んでくれる人がどれ位いる事やら・・。しくしく。
まず、普段のインターネット環境を考えて見ると、プロバイダに対してダイアルアップして動的な IPv4 アドレスを貰ってからインターネットにアクセスする人が多いと思います。つまりは、固定 IPv4 では無く、動的 IPv4 なアドレスを持っている。と、言う事ですね。
さて、IPv6 での接続手段てに付いてですが、現在は多分三つの方法が考えられますが、今回はトンネルにトライします。簡単に言うと、IPv4 で接続している環境で、IPv6 パケットを IPv4 のデータとして(カプセル化して)送信する。と、言う方法です。
その時、FreeBSD では カーネルの設定に gif と言うデバイスを利用します。カーネルに以下の行を入れて再構築しましょう。最後の数値はデバイスの数です。トンネルが一個しか必要でない場合は "1" で良いです。
----------------
pseudo-device gif 4
----------------
さささ。ではトンネルしましょう。と、簡単に言いますが、環境は、以下の通りと仮定してみましょう。
+-------+
---| ISP |---------------+---- InterNet
+---+---+ |
|IPv4 |
| |
| IPv6 +----+-----+
| +----------| IPv6-ISP |
| | +----------+
| | Router:roukuman
+--+---+--+ IPv4 38.1.140.13
| FreeBSD |
+---------+
HostName:koro
IPv4: 202.230.133.56
IPv6: 3ffe:505:2019:1:200:e8ff:feeb:1ce3
説明してみると、Hostname:Koro は ISP に対し IPv4 で IIJ-PPP を利用してダイアルアップ PPP 接続します。これで、Koro はインスターネットへの接続が出来ました。この時、IP アドレスは、202.230.133.56 を取得したとします。
続いて、IPv6-ISP に対して、固定 IPv6 である、3ffe:505:2019:1:200:e8ff:feeb:1ce3 の ルーティング情報を IPv6-ISP に依頼します。これは、Koro の IPv4 アドレス 202.230.133.56 と、IPv6-ISP の Router: roukuman の IPv4 アドレス 38.1.140.13 間で、3ffe:0505:2019:1::/32 宛のパケットのやりとりを行う宣言を双方でします。
この段階で IPv6 のトンネルが通った事になり、Koro から出てった IPv6 のパケットは、roukuman 経由で流れ、Koro に来るパケットは、roukuman がルータとして振舞うので正しく到達する様になります。
では、仕掛けを見てみましょう。FreeBSD 側の Hostname:Koro は今回、IPv6 対応したマシンです。こいつが、IPv6 アドレスを扱う為に以下の作業を行う必要が有ります。
o.Koro はトンネルするデバイスである、gif0 に対して IPv4 の IP アドレスを通知する
o.Koro は IPv6 の経路情報として、roukuman を経由する様に routeadd する
等ですね。ただ、本当は、roukuman 側ではもっと複雑な動きがあるのかもしれませんが私には見えません;-)。
こう言ういった事を全部実行してくれるのが、dtcpc コマンドです。dtcpd と言うデーモンに接続してくれます。Dynamic Tunnel Configuration Protocol と言うプロトコルをお喋りします。簡単に説明すると、動的に変化する IPv4 アドレスを用いた時に、IPv6 パケットをトンネルしてくれる設定をごにょごにょする為の仕掛けです。
ただ、 dtcpc は 3.4-RELEASE の KAME キットに入っていて 4.0-RELEASE には付いていません。クライアントプログラムである、dtcpc を KAME から持って来ましょう。それにこのプログラムは、Ruby で書かれています。 IPv6 対応の Ruby をインストールしましょう。4.0-RELEASE 以降のバージョンでは ports から make すれば OK です。
後は、トンネルしてくれるプロバイダに接続してむひひひ。嬉しいな。って感じで動く KAME を眺めに行きましょう。ふふふふ。
この辺りに付いては 今野さん のページ 詳しく書いてあります。一応、梅さん、今野さん、私はほとんど何も出来なかった状態です(^^;;
最後にですが、IIJ-PPP で IPv4 の NAT enable してダイアルアップした時、dtcp でのおしゃべり時に IPv6 のパケットを流してくれません。自宅 LAN のマシン全ての IPv4 パケットを NAT する時は、IPv6 が使えない。IPv6 している時には IPv4 の NAT は出来ない状態になります。
ISDN ルータで NAT 機能付きのを利用している場合には、どうなのだろう?そんな ISDN ルータを僕は持っていないので知りません(^^;;。
いろいろ調べてみた所、どうも FreeBSD の IIJ-PPP は何でも間でもアドレスの付け替えを行っているので IPv6 のパケットも届かなくなる。と、言う事が解りました。IPv6 と、IPv4 の NAT の両方を同時に使いたい時には PPxP を利用すれば OK です。これに付いては、4.1-RELEASE の所の、PPxP> ppxp と IPv6;-)を参考にしてみてください。