6to4.jp を使ってみよう

CBUG 6th meeting / 2002年11月4日

小野寛生

ちょっとだけ IPv6

でも、

現在の接続環境のまま楽にできるならやってみてもいいな、と思っているんですが…

そんなあなたに 6to4.jp

梅本さんからの指摘:
現在の KAME 実装では、 自分についていない IP address について 6to4 アドレスを振れないので、 例えば NAPT している broadband router の内側にある private address しかついていない host で 6to4 することは出来ない。 可能にする patch は存在する。

IPv4 アドレスが変更される時

DHCP (CATV 等)
ISC DHCP が client なら: dhclient-{enter,exit}-hooks
PPP
ppp.linkup (FreeBSD)

以後、基本的に FreeBSD の例です。

DHCP の場合

下記の構成を仮定します。

    - [6to4 router] -- ep0 [FreeBSD box] ed0 -- 内部
  1. IPv6 関連の一般的な設定をしておく
  2. 6to4 リレールータを IPv6 default router に指定
  3. 新しい IPv4 アドレスを取得したら、
    新しい IPv4 アドレスに基づいて stf interface を設定する

だけです。

IPv6 関連の一般的な設定

/etc/rc.conf で以下を指定します。

	ipv6_enable="YES"
	ipv6_gateway_enable="YES"
	rtadvd_enable="YES"
	rtadvd_interfaces="ed0"
	stf_network_ipv6_interface="ed0"
	stf_network_ipv6_slaid="1" # IPv6 Site Level Aggregator for stf0

やりかたによっては 6to4 リレールータを指定してもよいでしょう。

	ipv6_defaultrouter="2002:caff:2d05::1"

DHCP による IPv4 アドレス取得

新たに取得した IPv4 アドレスを設定した後、 dhclient は /etc/dhclient-exit-hooks という script を呼びます。 (/sbin/dhclient.script 参照)。

そこで、IPv4 アドレスが変更されていた場合は、6to4 の設定をしなおすようにすれば良いわけです。 手順としては

dhclient-exit-hooks の内容
  if [ "x${new_ip_address}" != "x${old_ip_address}" ]; then
    /usr/local/sbin/6to4.sh ${new_ip_address} 2002:caff:2d05::1
  fi

6to4.sh がやっていること

使い方: 6to4.sh ipv4addr ipv6_defaultrouter

現在の制限: local interface を 1つしか想定していない。

rc.conf, rc.network6 を実行して各種設定を反映する。- stf interface の設定。

  # stf interface の作成
  ifconfig stf0 create >/dev/null 2>&1
  # 古いアドレスの削除
  oldaddrs=`ifconfig stf0 inet6 | awk '/inet6 2002:/ {print $2}'`
  for oaddr in ${oldaddrs}; do
      ifconfig stf0 inet6 ${oaddr} -alias
  done
  # 6to4 interface の設定を行なう関数。rc.network6 で定義されている。
  network6_stf_setup

IPv6 default router の設定

  route add -inet6 default ${ipv6_defaultrouter}

local interface の設定

  # 古いアドレスの削除
  oldaddrs=`ifconfig ${stf_network_ipv6_interface} inet6 \
   | awk '/inet6 2002:/ {print $2}'`
  for oaddr in ${oldaddrs}; do
      ifconfig ${stf_network_ipv6_interface} inet6 ${oaddr} -alias
  done

  # rc.network6 で定義されているので、詳しくはそちらを参照。
  network6_interface_setup ${stf_network_ipv6_interface}

PPP の場合

ppp.linkup で以下のように設定可能。(梅本さんコメント)

  !/usr/local/sbin/6to4.sh MYADDR 2002:caff:2d05::1

謝辞

ありがとうございました。