IPv6 over PPP over TCPでIPv6Reachable!
システムの条件
当然OSがIPv6readyになっている必要があります。FreeBSDではかなり昔から(4-Releaseのどこか)で対応していますからとりあえずの条件は満たしています。それにプラスして、この接続方法ではPPPがIPv6Readyになっている必要があります。5.0-ReleaseからはKAMEからのソースのマージでPPPもIPv6Readyになっているはずなので手をかける必要がありません。IPv6ReadyなPPPがないときはなんとか・ドット・コムでpackageを配布しているので(FreeBSD用です)それを利用します。
申し込み
http://www.nantoka.com/tun6/をみて申し込みをしましょう。管理するkeiさん個人宛に申し込みのメイルを送ります。tun6-mlへも入ります。
設定
PPPで接続なので、もちろん/etc/ppp.confで設定をします。先頭のスペースを忘れないようにしましょう。
tun6: set escape 0xff set device ***.***.***.***:6669 set dial set timeout 0 0 set log Phase Chat Connect hdlc LCP IPCP CCP tun ID0 set authname tun**** set authkey ****** enable ipv6cp disable ipcp
こんな感じです。deviceのところにはなんとか.COMから届いたメイルに書いてあるトンネル接続先IPアドレス、authname、authkeyには同じく届いたメイルに書いてあるものを記入します。
接続
pppで接続します。こんな感じです。
bell@leon# ppp tun6
Working in interactive mode
Using interface: tun0
ppp ON leon> open
ppp ON leon>
Ppp ON leon>
PPp ON leon>
PPp ON leon>
IPv4アドレスのネゴシエーションはしないので、PPpまでしか変化しませんがこれでOKです。
経路設定
/sbin/route add -inet6 default ::1 -ifp tun0
という感じで経路を接続したトンネルデバイス(ここではtun0)に向けます。-ifpオプションは古いFreeBSDだとありません。これでOKなはず。ping6して見ましょう。
確認
bell@leon> ping6 ff02::1%tun0
PING6(56=40+8+8 bytes) fe80::290:99ff:fe4b:c507%tun0 --> ff02::1%tun0
16 bytes from fe80::290:99ff:fe4b:c507%tun0, icmp_seq=0 hlim=64 time=1.12
ms
16 bytes from fe80::3237:6231%tun0, icmp_seq=0 hlim=64 time=78.943 ms(DUP!)
16 bytes from fe80::290:99ff:fe4b:c507%tun0, icmp_seq=1 hlim=64 time=0.75
ms
16 bytes from fe80::3237:6231%tun0, icmp_seq=1 hlim=64 time=77.61 ms(DUP!)
16 bytes from fe80::290:99ff:fe4b:c507%tun0, icmp_seq=2 hlim=64 time=0.759
ms
16 bytes from fe80::3237:6231%tun0, icmp_seq=2 hlim=64 time=77.638 ms(DUP!)
16 bytes from fe80::290:99ff:fe4b:c507%tun0, icmp_seq=3 hlim=64 time=0.787
ms
16 bytes from fe80::3237:6231%tun0, icmp_seq=3 hlim=64 time=76.947 ms(DUP!)
^C
--- ff02::1%tun0 ping6 statistics ---
4 packets transmitted, 4 packets received, +4 duplicates, 0% packet
loss
round-trip min/avg/max/std-dev = 0.750/39.319/78.943/38.469 ms
はいOK。-wオプションをつけると名前を返します。
bell@leon> ping6 -w ff02::1%tun0
PING6(72=40+8+24 bytes) fe80::290:99ff:fe4b:c507%tun0 --> ff02::1%tun0
37 bytes from fe80::290:99ff:fe4b:c507%tun0: leon.f-bell.net.
39 bytes from fe80::3237:6231%tun0: yuina.nanet.co.jp.
37 bytes from fe80::290:99ff:fe4b:c507%tun0: leon.f-bell.net.
39 bytes from fe80::3237:6231%tun0: yuina.nanet.co.jp.
^C
--- ff02::1%tun0 ping6 statistics ---
2 packets transmitted, 2 packets received, +2 duplicates, 0% packet
loss
仕上げ
グローバルなアドレスがついたのですからIPv4と同じようにフィルタリングをしないとだめです。ip6fwをipfwと同じように設定します。また、再起動時に自動的にトンネルを掘るように/usr/local/etc/rc.d/ipv6.shとして以下のスクリプトを走らせています。PPPですので/etc/rc.confからもこの辺は適切にできるでしょう。(これ、あまり配慮していないスクリプトなのでそのまま使うのはお勧めしません)
#!/bin/sh
if ! PREFIX=$(expr $0 : "\(/.*\)/etc/rc\.d/$(basename $0)\$");
then
echo "$0: Cannot determine the PREFIX" >&2
exit 1
fi
case "$1" in
start)
/usr/sbin/ppp -background tun6 && echo -n ' PPP IPv6'
/bin/sleep 3
/sbin/route flush -inet6
/bin/sleep 1
/sbin/route add -inet6 default ::1 -ifp tun0
;;
stop)
killall ppp
/sbin/route flush -inet6
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
;;
esac
exit 0
