FreeBSD で 6rd 環境を構築しよう

前から 6rd のことは気になっていて、そろそろ Open Source で実装でないかなぁ、なんて思いながらもいっこうにでてきそうな気配もなく、こないだ JANOG25 で平井さんと松嶋さんが発表されてた “既存ユーザへのIPv6 提供と実装を考えてみる” を聞いたらやっぱり面白そうで、ここはひとつ FreeBSD に実装してみようか、ということで実装してみました。といってもすでに存在している 6to4 のインターフェース if_stf.c を改造しただけですけど。

  1. BR と CE 両方いけます。
  2. FreeBSD 8 用です。
  3. 利用にあたっては自己責任で。

6rd の詳細は “I-D. IPv6 via IPv4 Service Provider Networks “6rd”” を参照。

概要

とりあえずこんな感じを例に説明します。

6rdfig

4 つの 6rd elements はそれぞれ以下の通りとします。

IPv4PrefixLen 20
6rdPrefix fc00:0:0:1000::
6rdPrefixLen 52
6rdBRIPv4Address 10.0.0.1

6rdPrefixLen + (32 – IPv4PrefixLen) = 64 なので CE は fc00:0:0:1xxx::/64 をもらうことになります。 xxx の部分には IPv4 アドレスの下位 12 ビット(32 – IPv4PrefixLen)が埋まります。

準備

とりあえず上の図で 10.0.0.1/24 が振られている BR と 10.0.0.2/24 が振られている CE の設定方法を書きます。 10.0.0.3/24 の設定はほとんど 10.0.0.2/24 と同じです。違いは多分推測がつくと思います。

まずは パッチ を適用します。

# cd ~
# wget http://bougaidenpa.org/masakazu/wp-content/uploads/2010/01/freebsd8-6rd-20100130.patch.gz
# gzip -d freebsd8-6rd-20100130.patch.gz
# cd /usr
# patch -p0 < ~/freebsd8-6rd-20100130.patch

ifconfig のコンパイルのために if_srd.h が必要になるのでコピーします。

# cp /usr/src/sys/net/if_srd.h /usr/include/net/

ifconfig をコンパイルしてインストールします。

# cd /usr/src/sbin/ifconfig
# make
# make install

if_srd.ko をコンパイルしてインストールします。

# cd /usr/src/sys/modules/if_srd
# make
# make install

/etc/rc.conf にそれぞれ以下のような記述をして再起動します。

# BR の rc.conf
keymap="jp.106"
ipv6_enable="YES"
gateway_enable="YES"
ipv6_gateway_enable="YES"
cloned_interfaces="srd0"
ifconfig_em0="inet 10.0.0.1 netmask 255.255.255.0"
ifconfig_srd0="v4plen 20 pfix fc00:0:0:1000:: plen 52 braddr 10.0.0.1"
ipv6_ifconfig_em1="fc00:1:0:1001::1 prefixlen 64"
ipv6_ifconfig_srd0="fc00:0:0:1001:: prefixlen 128"
ipv6_static_routes="xxx"
ipv6_route_xxx="fc00:0:0:1000:: -prefixlen 52 ::1 -ifp srd0"
# CE の rc.conf
keymap="jp.106"
ipv6_enable="YES"
gateway_enable="YES"
ipv6_gateway_enable="YES"
cloned_interfaces="srd0"
ifconfig_le0="inet 10.0.0.2 netmask 255.255.255.0"
ifconfig_srd0="v4plen 20 pfix fc00:0:0:1000:: plen 52 braddr 10.0.0.1"
ipv6_ifconfig_le1="fc00:0:0:1002::1 prefixlen 64"
ipv6_ifconfig_srd0="fc00:0:0:1002:: prefixlen 128"
ipv6_defaultrouter="::1 -ifp srd0"

BR の em1 側に fc00:1:0:1001::/64 の端末を、 CE の le1 側に fc00:0:0:1002::/64 の端末をそれぞれ接続し、端末間で通信可能か確認します。

説明

4 つの 6rd elements を srd_softc のなかに入れてます。

struct srd_softc {
        struct ifnet    *sc_ifp;
        union {
                struct route  __sc_ro4;
                struct route_in6 __sc_ro6; /* just for safety */
        } __sc_ro46;
#define sc_ro   __sc_ro46.__sc_ro4
        struct mtx      sc_ro_mtx;
        u_int   sc_fibnum;
        const struct encaptab *encap_cookie;
        /* 6rd elements */
        u_int           sc_srd_v4plen;
        struct in6_addr sc_srd_pfix;
        u_int           sc_srd_plen;
        struct in_addr  sc_srd_braddr;
        /* 6rd calculated variables */
        struct in_addr  sc_srd_v4pmask;
        struct in6_addr sc_srd_pmask;
        struct in6_addr sc_srd_dpmask;
};

これらの値は ifconfig コマンドで参照したり設定したりできます。

# ifconfig srd0 create
# ifconfig srd0
srd0: flags=0<> metric 0 mtu 1280
	srd: v4plen 0 pfix :: plen 0 braddr 0.0.0.0
# ifconfig srd0 up
# ifconfig srd0 v4plen 20 pfix fc00:0:0:1000:: plen 52 braddr 10.0.0.1
# ifconfig srd0
srd0: flags=1<UP> metric 0 mtu 1280
	srd: v4plen 20 pfix fc00:0:0:1000:: plen 52 braddr 10.0.0.1

srd の設定をしたら適当にルーティングの設定をします。srd にルーティングをさせるためにはなにか IPv6 アドレスが振られていなければならないようなので適当なアドレスを振っておきます。

# BR の場合
# ifconfig srd0 inet6 fc00:0:0:1001:: prefixlen 128
# route add -inet6 fc00:0:0:1000:: -prefixlen 52 ::1 -ifp srd0
# CE の場合
# ifconfig srd0 inet6 fc00:0:0:1002:: prefixlen 128
# route add -inet6 default ::1 -ifp srd0

IPv4 アドレスの一部をもとに IPv6 プレフィクスが求まるので、実際のところは CE の LAN 側アドレスの設定は結構めんどくさくなると思います。ほとんどの場合で IPv4 アドレスは動的でしょうから。

あと、

Since 6rd delegated prefixes are selected algorithmically from an
IPv4 address, changing the IPv4 address will cause a change in the
IPv6 delegated prefix which would ripple through the site’s network
and could be disruptive. As such, the service provider should assign
CE IPv4 addresses with relatively long lifetimes.

なんて書かれていたりしますが、もしそんな状況になったお客さんから問い合わせがあったとしても「ルーターとパソコンを全部再起動してください。」くらいしか対応できないかも。そんな状況でも IPv4 は影響受けないと思うのでよけいたちが悪いような気もします。どうなんでしょうね。

9 comments to FreeBSD で 6rd 環境を構築しよう

  • shtsuchi

    動的アドレスは悩ましいですよね。FreeはそもそもDHCPだけど固定払い出しでやってるみたいです。
    RA lifetimeとDHCP lease timeは同じくらいにしといた方がいいかなー。

    設定に関しては実装次第でしょうから、WAN側のIPv4アドレスからーみたいな設定ができればいいのかなーと。

  • masakazu

    どうもす。

    自分はどうしても B-FLET’S や FLET’S ADSL のユーザさんに IPv6 を配る方法として考えるんですが、たぶん PPPoE の接続後に 6rd elements と LAN 側アドレスを設定するスクリプトをキックさせてやるような感じになるんではないかなと推測しています。

    あとは RA Withdraw みたいなことが出来ればいいんですけど… あるのかな?

  • shtsuchi

    プロトコル的にはDHCPのoptionでBRのアドレスとか配るというのが考えられているので、PPP->IPCP->DHCPで払いだしってやるのが一番良いとは思いますが。
    それが許されなかったら、ものによってはscriptかな。
    pdみたいにdelegation番号+いくつかをLAN側につけるっていう実装もありだと思いますが。

    RA Withdraw ほしーですよね。そしたら結構色んな問題解決か!?

  • [...] This post was mentioned on Twitter by mmasuda, Arifumi Matsumoto, Toshiharu MIZUNO, Toshiharu MIZUNO, makoto and others. makoto said: おおっ。 RT @mmasuda: Reading "FreeBSD で 6rd 環境構築しよう" http://bit.ly/b5wopc #janog25 #janog [...]

  • Twinkle

    I have tried this 6rd and everything seems OK except that: I can not set v4plen=0

    Can the parameter “v4plen” be set to zero?

  • masakazu

    Why would you like to set v4plen = 0?
    I can not assume such a situation…

    I hear that FreeBSD Core Team is writing patch to stf(4) supporting 6rd.
    I think it is better to wait.

  • Twinkle

    In 6rd RFC5569, there is a sentence about vplen=0: The chosen address format uses 32 bits of IPv4 addresses in IPv6 addresses for reasons of simplicity and of compatibility with the existing 6to4 code.

    Besides, I am trying to provide 6rd gateway function to a remote CPE, which is unable to set IPv4 address less than 32 bits in 6rd prefix.

  • masakazu

    Sorry, I was confused that v4plen = 0 means embedded bit length = 0…
    Did the error message like?

  • Twinkle

    In the above configuration :
    ifconfig srd0 v4plen 20 pfix fc00:0:0:1000:: plen 52 braddr 10.0.0.1

    if v4plen=0, it means that complete IPv4 address is embeded into the 6rd prefix.
    In other words, the mitted bits of IPv4 address is 0.

    (I hope I do not mis-understand it …)

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>