FreeBSD 7.2-RELEASEでOCN IPv6に接続する

OCNバリュープランを申し込んだ - mteramotoの日記で申し込んでいたバリュープランでONC IPv6が申し込めるようになってたから、早速申し込んだ。OCNでの処理が完了すると、接続に必要な情報がメールで送られてくる。ユーザ名とパスワードは、OCNで共通だから、追加で必要なのは接続先サーバのFQDNだけだけど。

OCN IPv6とは

OCN IPv6はOCNが提供しているIPv6接続サービス。OCN以外のISPを使っていても、バリュープランを契約することで利用可能。プロトコルはPPP over L2TPの上でDHCPv6 PDを動かしてPrefixをもらうというもの。Prefixは固定と動的を1つずつ利用可能で、Windows VistaWindows XP向けには専用クライアントソフトウェアが配布されてる。

FreeBSDとOCN IPv6

FreeBSDでOCN IPv6を使うなら、portsのnet/mpd-l2tp-ipv6pd-clientを使うのが簡単。mpd5とdhcp6をインストールした上で、OCN IPv6に接続するための設定ファイルを用意してくれる。
portsをインストールすると、mpd5を使っている場合は以下の4つの質問が表示されるので、OCNからの情報を入力する。

  • Please Input User ID:
    • OCNのユーザIDを入力する
  • Please Input Passwd:
    • OCNのパスワードを入力する
  • Please Input L2TP-IPv6PD Server
    • OCN IPv6の接続サーバ名を入力する
  • Please Input Prefix Delegation Interface:
    • PDでもらったPrefixを設定したいインタフェース名を指定する

Prefix Delegation Interfaceは、通常はRA(Router Advertisement)を送出したいインタフェース、つまりLAN側インタフェースになるはず。
portsのインストールが終わったら、以下のInstall noticeに従って設定をコピーする。

Type following commands to complete setup:

  # mkdir /etc/rc.conf.d
  # cp /usr/local/etc/mpd5/mpd5 /etc/rc.conf.d/mpd5

最後に、/usr/local/etc/rc.d/mpd5 startすれば接続開始。Prefix Delegation Interfaceで指定したインタフェースにIPv6アドレスが付与されてるはず。

RAを送出する

net/mpd-l2tp-ipv6pd-clientが作成する設定ファイルでは、デフォルトでRAを送出しない設定になっている。RAを送出したい場合は、/etc/rc.confに

dhcp6c_pd_rtadvd_enable="YES"

を追加する。/usr/local/etc/mpd5/dhcp6c_pd.shのdhcp6c_pd_poststartでIPv6パケット転送が有効になり、rtadvdが起動される。

dhcp6c_pd_poststart()
{
        if checkyesno dhcp6c_pd_rtadvd_enable; then
                /sbin/sysctl net.inet6.ip6.accept_rtadv=0
                /sbin/sysctl net.inet6.ip6.forwarding=1
                /usr/sbin/rtadvd -c ${dhcp6c_pd_rtadvd_conf} \
                    ${dhcp6c_pd_rtadvd_interface}
        fi
}

dhcp6cを使ってDHCPv6 PDにより取得したPrefixをloopback interfaceに設定できない

OCN IPv6を某所のホスティングサーバで使う際に、PrefixをLAN側インタフェースに割り当てるのが気持ち悪かったので、Prefix Delegation Interfaceをloopbackにしてみた。loopbackはlo1をあらかじめ作成しておいた。
ところが、mpdを起動するとdhcp6cを起動する際に以下のエラーメッセージが出力されて、dhcp6cが終了してしまう。

Jul 12 14:40:52 labo dhcp6c[93268]: get_default_ifid: link layer address is too short (lo1)

dhcp6cのソースコードを見ると、エラーになっているのはconfig.cの以下の部分。sdl->sdl_alen < 6が真になってる。確かにloopbackにMACアドレスは存在しないから正しいんだけど、loopbackにはPrefixを設定できないのか。LAN側のインタフェースにPrefixを設定すると、うっかりRAを送出すると近所迷惑だし、なんだか気持ち悪いしで、できれば避けたいんだけどなぁ。

#ifdef __KAME__
                if (ifa->ifa_addr->sa_family != AF_LINK)
                        continue;

                sdl = (struct sockaddr_dl *)ifa->ifa_addr;
                if (sdl->sdl_alen < 6) {
                        dprintf(LOG_NOTICE, FNAME,
                            "link layer address is too short (%s)",
                            pif->ifname);
                        goto fail;
                }

                memset(pif->ifid, 0, sizeof(pif->ifid));
                cp = (char *)(sdl->sdl_data + sdl->sdl_nlen);
#endif