<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>masakazu&#039;s Weblog &#187; Network</title>
	<atom:link href="http://bougaidenpa.org/masakazu/archives/category/network/feed" rel="self" type="application/rss+xml" />
	<link>http://bougaidenpa.org/masakazu</link>
	<description></description>
	<lastBuildDate>Sat, 24 Jul 2010 16:40:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>FreeBSD で 6rd 環境を構築しよう</title>
		<link>http://bougaidenpa.org/masakazu/archives/54</link>
		<comments>http://bougaidenpa.org/masakazu/archives/54#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:29:52 +0000</pubDate>
		<dc:creator>masakazu</dc:creator>
				<category><![CDATA[Network]]></category>

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

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

<p>6rd の詳細は “I-D. IPv6 via IPv4 Service Provider Networks &#8220;6rd&#8221;” を参照。</p>
概要
<p>とりあえずこんな感じを例に説明します。</p>
<p></p>
<p>4 つの 6rd elements はそれぞれ以下の通りとします。</p>



 IPv4PrefixLen
20


 6rdPrefix
fc00:0:0:1000::


 6rdPrefixLen
52


 6rdBRIPv4Address
10.0.0.1



<p>6rdPrefixLen + (32 &#8211; IPv4PrefixLen) = 64 なので CE は fc00:0:0:1xxx::/64 をもらうことになります。 xxx の部分には IPv4 アドレスの下位 12 [...]]]></description>
			<content:encoded><![CDATA[<p>前から 6rd のことは気になっていて、そろそろ Open Source で実装でないかなぁ、なんて思いながらもいっこうにでてきそうな気配もなく、こないだ JANOG25 で平井さんと松嶋さんが発表されてた <a href="http://www.janog.gr.jp/meeting/janog25/program/v6deploy.html">“既存ユーザへのIPv6 提供と実装を考えてみる”</a> を聞いたらやっぱり面白そうで、ここはひとつ FreeBSD に実装してみようか、ということで実装してみました。といってもすでに存在している 6to4 のインターフェース if_stf.c を改造しただけですけど。</p>
<ol>
<li>BR と CE 両方いけます。</li>
<li>FreeBSD 8 用です。</li>
<li>利用にあたっては自己責任で。</li>
</ol>
<p>6rd の詳細は <a href="http://tools.ietf.org/html/draft-ietf-softwire-ipv6-6rd">“I-D. IPv6 via IPv4 Service Provider Networks &#8220;6rd&#8221;”</a> を参照。</p>
<h2>概要</h2>
<p>とりあえずこんな感じを例に説明します。</p>
<p><img class="aligncenter size-full wp-image-72" title="6rdfig" src="http://bougaidenpa.org/masakazu/wp-content/uploads/2010/01/6rdfig1.png" alt="6rdfig" width="486" height="327" /></p>
<p>4 つの 6rd elements はそれぞれ以下の通りとします。</p>
<table border="0">
<tbody>
<tr>
<th> IPv4PrefixLen</th>
<td>20</td>
</tr>
<tr>
<th> 6rdPrefix</th>
<td>fc00:0:0:1000::</td>
</tr>
<tr>
<th> 6rdPrefixLen</th>
<td>52</td>
</tr>
<tr>
<th> 6rdBRIPv4Address</th>
<td>10.0.0.1</td>
</tr>
</tbody>
</table>
<p>6rdPrefixLen + (32 &#8211; IPv4PrefixLen) = 64 なので CE は fc00:0:0:1xxx::/64 をもらうことになります。 xxx の部分には IPv4 アドレスの下位 12 ビット(32 &#8211; IPv4PrefixLen)が埋まります。</p>
<h2>準備</h2>
<p>とりあえず上の図で 10.0.0.1/24 が振られている BR と 10.0.0.2/24 が振られている CE の設定方法を書きます。 10.0.0.3/24 の設定はほとんど 10.0.0.2/24 と同じです。違いは多分推測がつくと思います。</p>
<p>まずは <a href="http://bougaidenpa.org/masakazu/wp-content/uploads/2010/01/freebsd8-6rd-20100130.patch.gz">パッチ</a> を適用します。</p>
<pre># 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 &lt; ~/freebsd8-6rd-20100130.patch</pre>
<p>ifconfig のコンパイルのために if_srd.h が必要になるのでコピーします。</p>
<pre># cp /usr/src/sys/net/if_srd.h /usr/include/net/</pre>
<p>ifconfig をコンパイルしてインストールします。</p>
<pre># cd /usr/src/sbin/ifconfig
# make
# make install</pre>
<p>if_srd.ko をコンパイルしてインストールします。</p>
<pre># cd /usr/src/sys/modules/if_srd
# make
# make install</pre>
<p>/etc/rc.conf にそれぞれ以下のような記述をして再起動します。</p>
<pre># 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"</pre>
<pre># 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"</pre>
<p>BR の em1 側に fc00:1:0:1001::/64 の端末を、 CE の le1 側に fc00:0:0:1002::/64 の端末をそれぞれ接続し、端末間で通信可能か確認します。</p>
<h2>説明</h2>
<p>4 つの 6rd elements を srd_softc のなかに入れてます。</p>
<pre>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;
};</pre>
<p>これらの値は ifconfig コマンドで参照したり設定したりできます。</p>
<pre># ifconfig srd0 create
# ifconfig srd0
srd0: flags=0&lt;&gt; 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&lt;UP&gt; metric 0 mtu 1280
	srd: v4plen 20 pfix fc00:0:0:1000:: plen 52 braddr 10.0.0.1</pre>
<p>srd の設定をしたら適当にルーティングの設定をします。srd にルーティングをさせるためにはなにか IPv6 アドレスが振られていなければならないようなので適当なアドレスを振っておきます。</p>
<pre># BR の場合
# ifconfig srd0 inet6 fc00:0:0:1001:: prefixlen 128
# route add -inet6 fc00:0:0:1000:: -prefixlen 52 ::1 -ifp srd0</pre>
<pre># CE の場合
# ifconfig srd0 inet6 fc00:0:0:1002:: prefixlen 128
# route add -inet6 default ::1 -ifp srd0</pre>
<p>IPv4 アドレスの一部をもとに IPv6 プレフィクスが求まるので、実際のところは CE の LAN 側アドレスの設定は結構めんどくさくなると思います。ほとんどの場合で IPv4 アドレスは動的でしょうから。</p>
<p>あと、</p>
<blockquote><p>Since 6rd delegated prefixes are selected algorithmically from an<br />
IPv4 address, changing the IPv4 address will cause a change in the<br />
IPv6 delegated prefix which would ripple through the site&#8217;s network<br />
and could be disruptive.  As such, the service provider should assign<br />
CE IPv4 addresses with relatively long lifetimes.</p></blockquote>
<p>なんて書かれていたりしますが、もしそんな状況になったお客さんから問い合わせがあったとしても「ルーターとパソコンを全部再起動してください。」くらいしか対応できないかも。そんな状況でも IPv4 は影響受けないと思うのでよけいたちが悪いような気もします。どうなんでしょうね。</p>
]]></content:encoded>
			<wfw:commentRss>http://bougaidenpa.org/masakazu/archives/54/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
