以前は cvsup(net/cvsup-without-gui) を利用していたのだけど、最近は csup(1) を利用して ports とか STABLE の最新のソースを持ってくるようになった。
csup(1) は IPv6 に対応しているのだけど、 cvsupd(net/cvsup-mirror) が IPv6 に対応していないくて、IPv4 でしか応えてくれないので、csup の一発目は必ずエラーになる。
あ。僕は自宅のサーバに cvsupd を起動しているので cvsup3.jp.freebsd.org とかから定期的に持ってきているので、自宅の FreeBSD は自宅で起動している cvsupd なサーバから持ってきています。cvsup.icmpv6.org がそれになるわけですけども;-)。
で、自宅のネットワークには IPv6 があってウェブとかメールサーバは IPv6 に対応しているのに cvsupd が IPv6 に対応していないのは非常に悲しいので、今回 cvsupd を IPv6 に対応させてみたいと思います。ただ、net/cvsup-mirror のソースコードを改変して IPv6 対応するのは非常に大変なので、今回はネットワーク的に IPv6 への到達性を確保します。IPv6->IPv4 トランスレータ機能を利用します。お題目は以下です;-)。
faith0 インターフェースと faithd を利用して cvsupd を IPv6 対応にしてみましょう。
まぁ、まずは何はなくとも man faithd と叩いてみましょう。そこから始まりますが、man を読んで解った事は、アドレスプレフィックス部分の /96 と IPv4 アドレス部分の /32 に分かれていて、IPv4 部分で IPv4 サーバを特定してそこにパケットを投げますよ。みたいな感じです。
では早速設定を見ていきましょう。今回のネットワーク構成はこんな感じにしてみました。
以下にちょっと箇条書きにしてみます。
- 今回ターゲットとなる cvsupd は IPv4/IPv6 のデュアルスタックなサーバ上で動作します。
- IPv4 ルータは PPPoE などでグローバルあドレスが付きますがサーバは NAT されています。ポート 5999 は cvsupd サーバにポートフォワードされています。
- IPv6 ルータは外部のグローバル IPv6 ネットワークに接続しています。
- cvsupd へは rtadvd により IPv6 のグローバルアドレスを払い出しています。
- IPv4 は 192.168.0/24 です。
- IPv6 は 2001:200:161:1400::/64 です。
- トランスレータ用のプレフィックスは 2001:200:161:1400:5999::/96 です。
さてと。これだけでほぼ準備が整いました;-)。
まず、cvsupd サーバでの設定ですが、 faith0 インターフェースに飲み込まれる IPv6 プレフィックスを route(8) で設定します。その後、faithd を起動して特定のポートを faith0 に飲み込むようにします。
起動スクリプトは以下になります。rcNG ではなくて申しわけないですが(^^;;。
#!/bin/sh
#
# faithd start
#
HOME=/
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin/:/usr/local/bin
export HOME PATH
faith_ipv6='2001:200:161:1400:5999::'
faith_ipv6_prefix='96'
case $1 in
'start' )
if [ -f /usr/sbin/faithd ]; then
sysctl -w net.inet6.ip6.accept_rtadv=0
sysctl -w net.inet6.ip6.forwarding=1
sysctl -w net.inet6.ip6.keepfaith=1
ifconfig faith0 create
ifconfig faith0 up
route add -inet6 $faith_ipv6 -prefixlen $faith_ipv6_prefix ::1
route change -inet6 $faith_ipv6 -prefixlen $faith_ipv6_prefix -ifp faith0
/usr/sbin/faithd 5999
fi
echo 'faithd 5999 Start.'
;;
'stop' )
killall faithd
route delete -inet6 $faith_ipv6 -prefixlen $faith_ipv6_prefix
sysctl -w net.inet6.ip6.accept_rtadv=0
sysctl -w net.inet6.ip6.forwarding=0
sysctl -w net.inet6.ip6.keepfaith=0
ifconfig faith0 down
ifconfig faith0 destroy
echo 'faithd Stop.'
;;
'restart' )
/usr/local/etc/rc.d/faithd stop
/usr/local/etc/rc.d/faithd start
;;
* )
echo "usage : faithd {start|stop|restart}"
;;
esac
|
まず最初に sysctl で必要な mib のステータスを変更します。 ifconfig faith0 up した後に route add してから route change します。この時、プレフィックスは /96 です。残りの /32 は IPv4 アドレスになります。
今回の cvsupd サーバは 192.168.1.2 が付いているので、それを IPv6 に直すと以下になります。
2001:200:161:1400:5999::c0a8:102
この IPv6 アドレスを DNS に登録します。すると、csup コマンドを叩いた時に supfile の *default host 行に FQDN を書けば IPv6 でアクセスが可能になります。
と、思いきや・・。外部の FreeBSD からだとアクセスできないですね。 IPv6 ルータは 2001:200:161:1400::/64 ではルーテイングが設定してあるのですが、2001:200:161:1400:5999::/96 のルーティングができていないので IPv6 ルータに対して route add コマンドで 2001:200:161:1400:5999::/96 を cvsupd が起動しているサーバのリンクローカルアドレスに向けて上げます。
# route add -net -inet6 2001:200:161:1400:5999:: -prefixlen 96 fe80::2ae:90ff:fe11:a85%bge0
|
これで設定は全て完了です。外部の IPv6 機器から接続できるか確認してみましょう。
トラブルシューティングですが、まず、cvsupd サーバのローカルホストから telnet cvsup.icmpv6.org 5999 などと FQDN で指定し cvsupd に接続できるか確認してみましょう。
そこで問題があれば、指定したプレフィックスが /96 になっているか、IPv4->IPv6 の変換時の IP アドレスや DNS の設定、faithd 、sysctl mib などを見直してみましょう。
外部から接続ができない場合、DNS のアドレスの設定の確認と、IPv6 ルータでの /96 のルーティングの設定を確認しょう。
今回は faith0 と faithd の設定を見てきましたが、これらは tcp しか通過できません。 udp には対応していないんですね。そもそも faithd は KAME のリファレンスコードなので「tcp は実装するけど、他のプロトコルは自分で書いてね。」的要素が強いのかな?などと、僕個人的には思っています。
tcp しか通らないので、当然 ping や traceroute も通りません。tcping は IPv4 にしか対応していないし・・。とわいえ、ume さん が tcping の IPv6 対応パッチを書いてくださったのでそれを適用した tcping を利用すると良いかと思われます。以下の URL にパッチを転がしておきます;-)。ports の net/tcping で利用してください。
http://icmpv6.org/Prog/FreeBSD_ports/tcping-ipv6.diff
さてと。これで cvsupd サーバは IPv6 Ready になりました。このサーバ上で IPv4 にしか対応していない色々なデーモンを起動すればなんでも IPv6 Ready になります。では、IPv4 にしか対応していないデーモンは一体何が?とハタと考えた場合、古いソースコード(バージョン)で運用しているデーモンとか位しか思い浮かばなかったのですが、DSS(net/DarwinStreamingServer) なんかは IPv4 にしか対応してないので、こう言ったものを IPv6 Ready にすることが可能です。その場合、必要なポートを指定して faithd を起動する必要があります。DSS であれば以下のように感じでしょうか。上記のスクリプトに加筆します。
/usr/sbin/faithd 554
/usr/sbin/faithd 5000
/usr/sbin/faithd 5100
などなど、必要そうなポートにたいして faithd を起動するとそのポートに来たパケットは faith0 に突っ込んでくれるようになります;-)。
で、ここでまた、ハタと考えた・・。Apple 謹製の QiuckTime Player は IPv6 に対応しているのかぁ? あぁ。multimedia/mplayer で試せば良いかぁ。みたいな(^^;;。
大体こんな感じで faith0 と faithd を使えば比較的楽に楽しく利用できるかなぁ。と思った次第です。本来であれば IPv6->IPv4 トランスレータとして、dns/totd と組み合わせて使う大掛かりなルータってイメージがあるんだけど、ローカルホストのために利用する faith0 と faithd というのもまたアリかなぁ。と言う感じがあるのであります;-)。