旧・無印吉澤

昔はてなダイアリーに書いていた記事のアーカイブです

Teredoの仕様

Teredoの仕様はIETFのIPv6 Operations (v6ops)ワークグループにおいてMicrosoft主導で2002年頃から検討されていて、最新のInternet Draft(I-D)はdraft-huitema-v6ops-teredo-00.txtです。既に2003年12月6日に期限切れしているのでIETFのサイトでは公開されていないのですが、出水さんという方のサイトでミラーされているものが参照できます。

Teredo: Tunneling IPv6 over UDP through NATs(ミラー)
http://www.watersprings.org/pub/id/draft-huitema-v6ops-teredo-00.txt

(2004/02/09追記)draft-huitema-v6ops-teredo-01.txtが2004年2月5日に公開されました。変更点の解説はこちら(2月9日の日記)

(2004/06/16追記)draft-huitema-v6ops-teredo-02.txtが2004年6月14日に公開されました。変更点の解説はこちら(6月16日の日記)。

57ページもあってかなり読み応えのあるI-Dなので、忙しい方には日本語で書かれた以下の参考記事をオススメします。

IPv6style:Advanced Networking Pack for Windows XP大解剖
第1回 IPv6接続をさらに透過的にするTeredo
http://www.ipv6style.jp/jp/tryout/20030929/index.shtml

ちなみに、この記事ではTeredoクライアントとIPv6ノードの通信方法については

TeredoクライアントとIPv6インターネットのIPv6ノードとの通信はTeredoサーバーおよびTeredoリレーを介して行われる。詳細についてはインターネットドラフトもしくはマイクロソフトの技術文書を参照して欲しい。

としているので、上記I-Dの「4.1.4 First packet from an IPv6 node to a Teredo node」と「4.1.5 First packet from a Teredo node to a regular IPv6 node」、または以下の技術文書を見ないとよくわかりません(I-Dより半年ほど古いです)。

Teredo Overview
http://www.microsoft.com/technet/treeview/default.asp?url=/technet/prodtechnol/winxppro/maintain/Teredo.asp

Teredoクライアント(Cone NAT)からIPv6ノードへと通信を開始する流れを簡単に説明すると、大体以下の通りです。

  • TeredoクライアントはTeredoサーバ経由でIPv6ノードへICMPv6 Echo Requestを送信し、それに対するICMPv6 Echo Reply(IPv4/UDPにてカプセル化)を受信する
  • Teredoクライアントは受信したICMPv6 Echo ReplyのIPv6ヘッダと、それをカプセル化していたIPv4ヘッダを見て、IPv6ノードとTeredoリレーの対応関係を記憶する
  • それ以降、TeredoクライアントとIPv6ノードの通信は、その記憶されたTeredoリレーを経由して行われる

これが逆にIPv6ノードからTeredoクライアントへと通信を開始する場合は、IPv6ノードからの最初のパケットが、上で言うICMPv6 Echo Replyの役割を果たすことになります。あとはTeredoクライアントがRestricted NATの中に居る場合は、TeredoルータからTeredoクライアントへパケットを送る前に、Teredoサーバ経由でTeredoクライアントに穴開け(UDP hole punching:Teredoルータへパケットを送って、NATにマッピングを登録)をしてもらわなきゃいけないんですが、これは定番の方法なので説明は除外します。

あと、クライアントの使うIPv6アドレスを誰が割り当てるか?という観点でTeredoと6to4を比較してみると理解しやすい人もいるかも……。

  • TeredoリレーはIPv6ノードが勝手にネットワーク的に一番近いものを選ぶため、Teredoクライアントが使うTeredoリレーは相手によって変わる(→毎回同じリレーを使う6to4とは異なる)
  • ただし、Teredoクライアントから通信する場合の最初のping(ICMPv6 Echo Request)だけは固定でTeredoサーバへとトンネリングされ、Teredoサーバはそれを取り出してIPv6ネットワークへ転送する(→困った時はアドレスをくれた人に頼るところは6to4と同じ)