2006-05-07

λ [FreeBSD] 6.1-RELEASE

CVS上ではリリースになった。あとはアナウンス待ち。

λ [FreeBSD] 6.1-RELEASE での IPv4 over IPv6 トンネル

6.1-RELEASE にしたら Flets.Net を使ったトンネルが通らなくなった。

ifconfig gif1 tunnel 2001:c90:xxxx:xxxx::1 2001:c90:xxxx:xxxx::1 を実行したところ、 以下のようなメッセージでトンネルの設定ができない。

ifconfig: SIOCSIFPHYADDR: Address family not supported by protocol family

/usr/src/sbin/ifconfig/ifconfig.c のsettunnel関数を見てもこのメッセージを出すようには見えないので、 もっと前段の引数解釈のところでエラーメッセージを出している模様。

次のように address family を指定してコマンドを実行してみたら通った。

ifconfig gif1 inet6 tunnel 2001:c90:xxxx:xxxx::1 2001:c90:xxxx:xxxx::1

/etc/network.subr を確認したところ、現在の /etc/rc.conf に記述する方法ではどうにもならんので、rc.conf に gifconfig_hoge の代わりに gifv6config_hoge にトンネルの設定を書くと設定してくれるようなスクリプトを作ってみた。 gif_interfaces 変数はとりあえず共通。

/usr/local/etc/rc.d/000.gifipv6

#!/bin/sh
#

# PROVIDE: gifipv6
# REQUIRE: root mountcritlocal netif
# BEFORE:  routing
# KEYWORD: nojail

. /etc/rc.subr

name="gifipv6"
rcvar=`set_rcvar`
load_rc_config $name
start_cmd="gif_ipv6_start"

gif_ipv6_start()
{
        case ${gif_interfaces} in
        [Nn][Oo] | '')
                ;;
        *)
                for i in ${gif_interfaces}; do
                        eval peers=\$gifv6config_$i
                        case ${peers} in
                        '')
                                continue
                                ;;
                        *)
                                ifconfig $i create >/dev/null 2>&1
                                ifconfig $i inet6 tunnel ${peers}
                                ifconfig $i up
                                ;;
                        esac
                done
                ;;
        esac
}

run_rc_command "$1"

もっとアドホックな方法としては、FreeBSD 5.4なマシンの ifconfig をもってきて利用するという方法も可能ではある。 こっちの方を最初に試して一応うまくいっていたのだがあんまりなので調査したのが上の結果。

最終的には /etc/network.subr を書き換えるパッチを send-pr するのがベストだと思うのだが、 rc.conf にどう記述するのがいいのか悩み中。

[]