IPv6 : NAT ルータを使っている環境で freenet6 に接続する方法

'06/12/14 修正: 最新の TSP クライアントは NAT 越えができるようになっています。 よって以下の文書はすでに意味がなくなっています。(一応、参考までに残しておきます)
この文書は、以下にすべてあてはまる人のためのものです。

はじめに

個人で手軽にIPv6 を使って遊びたいとき、現状では freenet6 で IPv6/IPv4 トンネルするのが一番簡単です。

freenet6 にトンネルを張るには freenet6 が配布している TSP クライアント ソフトウェアを使うのですが、このクライアントは NAT のことを考慮していません。 そのため、NAT ルータの背後からトンネルを張ることができません。


NAT があるとなぜうまくいかないのか?

IPv6 トンネルでは、プロトコル番号 41 の IPv4 パケットを使います。 外部からこのパケットが到着したとき、普通のNAT ルータはこれをどこに転送すれば よいのかわからないので、パケットを捨ててしまいます。 これは static NAT エントリを設定することで解決できるので、大して問題では ありません。

それより問題なのは、TSP クライアントソフトウェアの制限です。

クライアントは、トンネルを張る際に TSP(Tunnel Setup Protocol)を使って トンネルのセットアップを行います。このとき、クライアント側のトンネルの IPアドレスを申告します。

TSP クライアントは、クライアントマシン自身の IP アドレスを申告するようになっています。 ですから、プライベートアドレスしかもっていないマシンでは、プライベート アドレスをサーバに対して申告してしまいます。これではつながるわけがありません。

tspc.conf の client_v4 にグローバルアドレスを書いてやればうまくいくかと 思ったのですが、 このアドレスはローカル側のトンネル端点の設定にも使っているので、 うまく行きませんでした。

結局、TSP クライアントソフトウェアを改造し、グローバルアドレスを別途 設定、申告するようにして解決しました。 私の環境(FreeBSD 4.2R)ではまったく問題なく動作しましたので、 改造済みクライアントを公開することにします。


やり方

static NAT テーブルを設定する

IPv6/IPv4 トンネルを行うためには、NAT ルータに static NAT エントリを 追加する必要があります。

IPv6トンネルではプロトコル番号 41 番を使用します。 41番プロトコルのパケットを、TSP クライアントを動作させるマシンに転送 するよう、static NAT エントリを追加してください。

TSPクライアントのセットアップ

まず、改造済み TSP クライアントをダウンロードしてください。 ソースしかありませんので、各自でコンパイルしてください。 コンパイル方法は README ファイルを見てください。

次に、NAT を越えるための設定をします。 tspc.conf ファイルに、

global_v4=xxx.xxx.xxx.xxx
と記述します。xxx.xxx.xxx.xxx には、NAT ルータの WAN 側 IPv4 アドレス (グローバルアドレス)を設定してください。

その他の設定項目は、オリジナルの TSP クライアントと同じです。 REAME ファイルを見てください。

これで完了です。tspc を起動してトンネルを張ってください。