Linux と Feel6 で社内 LAN を IPv6 化

はじめに

バイト先の某会社某事務所で したーい、という色々な意味でダメダメな目的のため、バイト先の某会社某事務所のネットワークの IPv6 化を行うことにした。

目的

某事務所のネットワーク構成は以下の通りである。これは、とても一般的な構成である。もちろん某事務所で利用している FTTH サービスは IPv6 native 接続には対応していない。

+-----------+   |
|  Windows  |---+
+-----------+   |private segment
+-----------+   |192.168.x.0/24       PPPoE 接続の FTTH  
|  Windows  |---+         +----------+ 
+-----------+   +---------|  Linux   |------------ Internet 
+-----------+   |     eth1+----------+eth0        
|  Windows  |---+                     ppp0
+-----------+   |
+-----------+   |
|   iMac    |---+
+-----------+   |
     .
     .
     .
このネットワークのそれぞれの Windows で 3° を(IPv6 を使って)動かすことを目的とする。

IPv6 化のための手段の選択

このネットワークのそれぞれの Windows で 3° を動かすため、それぞれが IPv6 reachable にならねばならない。よって、1 つの IPv4 アドレスに対して 1 つの IPv6 アドレスが割り当てられる 6to4 では目的を達成できない。6to4 では 1 台の Windows しか 3° を利用できない。6to4 では /64 の prefix がもらえるので、アドレス数問題は解決可能である。だが、トンネルが帯域的なボトルネックらしい(伝聞)。 また、6to4 では IPv4 アドレスが変化すると IPv6 プレフィックスも変化する。また、IRCnet.JP の IRC サーバである irc6.nara.wide.ad.jp に接続する際に、権限が制限されるという問題がある。ので、やめ(ぉ。

となると、残りの手段としては、Linux からどこかにトンネル接続し、IPv6 を通すという方法しかない。ここで、利用している ISP に IPv6 tunnel 接続できれば一番よいのであるが、現状で利用している ISP は IPv6 tunnel 接続のサービスを提供していない。

世の中にはフリー(無料)の tunnel 接続サービスを提供している団体がある。代表的なものに freenet6Feel6がある。freenet6 を利用する場合は、Debian であれば apt-get install freenet6 で完了である。しかし、freenet6 はトンネル先のサーバが海外にあるため、遅延が大きいという欠点がある。そこで、今回は Feel6 を利用することにした。

Feel6 では公式には WindowsXP と MacOS X、YAMAHA RTA55i しかサポートしていない。しかし、トンネルを張るために DTCP という標準化されたプロトコルを用いているため、DTCP クライアントが動作する OS であればトンネルを張れ、Feel6 を利用することが可能である。
DTCP に関しては、FreeBSD 環境での動かし方などのドキュメントは多く存在するが、Linux 環境での動かし方に関してはドキュメントが少ない。このドキュメントが、そのような人たちの一助となれば幸いである。

実際の作業

まず、Feel6 のサイト へ行き、実験参加の申し込みを行い、ID とパスワードを取得する。
(03/10/28 現在では申し込みは出来ない)

次に、DTCP クライアントである dtcpc を make する。dtcpc は元々 KAME 用に Ruby で書かれており、KAME の配布物に入っているが、KAME 用の dtcpc をそのまま Linux で利用することはできない。
Linux 用の dtcpc は Linux 用の IPv6 開発プロジェクトである USAGI Project の配布物に付属している。そこで、 USAGI Project へ行き、最新の USAGI SNAP を落としてくる。(別に USAGI STABLE でもよいが・・・) このあたり に置いてあるようだ。とりあえず、使用している kernel が 2.4 であれば usagi-linux24-* というものを取ってくればよい。というか、どの tarball を取ってきても dtcpc は入っている。今回は usagi-linux24-s20031027.tar.bz2 を取ってきた。

取ってきたら適当なディレクトリに展開し、make の準備をする。

tar xvfj usagi-linux24-s20031027.tar.bz2
cd usagi
make prepare TARGET=linux24
dtcpc を使うために USAGI kernel を作成したり、USAGI kernel 起動する必要はないので、今回は最小限の dtcpc のみ make する。また、通常の dtcpc では起動時にトンネル接続のためのパスワードを手入力せねばならない。これは個人的に面倒だと感じたので、パスワードを起動時のオプションとして指定するためのパッチを作成した。そのパッチは ここ に置いてある。必要な人は当てると良いと思う。なお、このパッチでは ps でプロセス一覧を表示しても、パスワードは見えないようになっているが、パスワードの文字数はわかってしまう。
cd usagi/libnetlink
./configure
make
cd ../dtcp
wget http://www.tugumi.net/tips/feel6linux/dtcpc.c.password.diff
patch -p0 < dtcpc.c.password.diff
./configure --prefix=/usr/local
make
sudo make install
これで dtcpc が /usr/local/sbin 以下にインストールされる。

そして、起動用のシェルスクリプトを作成する。内容の例は以下の通り。

#!/bin/sh

/usr/local/sbin/dtcpc -u username -P password -t network -n eth1 dtcp.feel6.jp
スクリプトに パスワードが書かれている場合は、スクリプトを chmod 700 しておいたほうがよい。
username と password は Feel6 から取得したものである。-t network の network は、ネットワークモードということ。詳しくは DTCP に関する BSD Magazine の記事 を参考にするとよい。-n eth1 の eth1 には private segment 側のインタフェイスを指定する。
接続確認をするためには、上で書かれたオプションの他に -d オプションを付けて dtcpc を実行してみる。dtcpc が終了しなかったら接続に成功している。逆に終了してしまったら接続に失敗している。また、eth1 に 2001:3e0:xxxx:/48 のようなアドレスが振られており、ping6 www.kame.net で返事が返ってくれば成功である。このスクリプトが OS の起動時に実行されるようにしておく。

最後に、radvd の設定をする。/etc/radvd.conf の例は以下の通り。

interface eth1
{
   AdvSendAdvert on;
   prefix 2001:3e0:xxxx::1/64
   {
        AdvOnLink on;
        AdvAutonomous on;
   };
};
radvd を動かして、Windows PC で IPv6 アドレスが取得でき、ping6 www.kame.net で返事が返ってくるかどうか確認する。以上で完了である。

おかしくなったときは

dtcpc を終了させると、たまに dtcp ネットワークインタフェイス、IPv6 アドレス、経路が残ったりする。その状態で再度 dtcpc を起動しようとしてもうまく起動しない。そのような場合は以下のように後始末をしてから dtcpc を再起動させる。

ifconfig dtcp down
ifconfig sit0 down
ifconfig eth1 del 2001:3e0:xxxx::1/64
ip -f inet6 route del 2001:3e0:xxxx::/48