旧・無印吉澤

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

Teredoの概要

Teredoとは、比較的最近登場した、NAT TraversalなIPv6 over UDP(IPv4)トンネリング技術の名前です。

もっと簡単に言うと、Teredoとは、今までは6to4さえ使えなかったNAT内のユーザも簡単にIPv6インターネットへアクセスできるようにする!という物凄い代物で、これが普及すれば過去にさんざん唱えられてきた「IPv6に移行すれば自由にEnd to End通信が出来る」「IPv6IPsec必須なのでセキュリティ向上」といった謳い文句が今まで以上に現実味を帯びてきます。IPv6へ移行した場合に最もメリットを受ける人(グローバルIPアドレスを持ってない人)に対してIPv6の世界をかいま見せるわけですから、IPv6への移行技術としては過去のどれよりも最高と言えるでしょう。

と、僕は思うのですが、日本のサイトではあんまり騒がれてないのが不思議です……(1月22日時点のgoogle力は151)。日本はIPv6で世界をリードしてるとか言ったのは誰だっ?! でも、まぁ、需要はありそうなので、関連するサイトを挙げつつTeredoについて現時点で公開されている情報をまとめてみます。

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と同じ)

Teredoの実装(Windows)

Teredoクライアントは既にWindows上で実装されていて、WindowsUpdateか何かでAdvanced Networking Pack for WindowsXPをインストールすると使えるようになります。使い方はさっきのIPv6styleの記事の2ページ目の下の方を参照のこと。

Teredoサーバは自由に使えるものがMicrosoftから既に提供されていて、デフォルトのTeredoサーバがそれです。どうやらうちのNATはCone NATらしくて、記事の通りにnetshを実行してtypeを変更すると

netsh interface ipv6>show teredo
Teredo Parameters
                                                                                        • -
Type : disabled Server Name : default Client Refresh Interval : default Client Port : default State : offline Error : none netsh interface ipv6>set teredo type=client OK netsh interface ipv6>show teredo Teredo Parameters
                                                                                        • -
Type : client Server Name : default Client Refresh Interval : default Client Port : default State : qualified Type : teredo client Network : unmanaged NAT : cone

と、きちんとTeredoアドレスの割り当てを要求してくれました。

ただ、肝心のTeredoリレーはまだインターネット上で提供されてないので、これだけではNAT内からIPv6ノード(kameとか)にはアクセス出来ないみたいです。

それなら!と思って、NAT内のTeredoクライアント同士での通信(ping6)を試みてみたのですが、Teredoアドレスに対応するプライベートIPv4アドレスの受け渡しまでは成功しているように見えるものの、Teredoインタフェイス経由でのパケット送信から受信の間で失敗してしまいました。Etherealで調べてみると、どうもethernetフレームもIPv4ヘッダも無しでいきなりIPv6ヘッダを受け取ってしまっているみたいで……。ping6プログラムがソケットオプションPROTECTION_LEVEL_UNRESTRICTEDを指定してない(?)せいなのかなぁ。

Teredoの実装(FreeBSD)

で、Windows以外では誰か作ってないのかなぁ……と思って調べていたら、FreeBSD版のTeredoは公開されてました。TeredoサーバとTeredoリレーです。Teredoクライアントは実装されていませんが、Advanced Networking Pack for WindowsXPで十分ってことかと。

...Teredo for FreeBSD...
http://www-rp.lip6.fr/teredo/

FreeBSDのnetgraphを使って作られているようで、netgraphなんて聞いたことも無い僕はソースコードを読んでも中身はさっぱりわかりません。パケット操作を簡単にプログラムできるようにするためのものだというのは辛うじて分かるのですが……。

All About Netgraph
http://www.daemonnews.org/200003/netgraph.html

いつかちゃんと読もう。→吉澤

ちなみにこの実装、どうやらIPv6への移行を商売にしてる企業の出資で作ったようです。それと、ここのおかげでバージョン0.9.15以降のEtherealTeredoに対応しているのだそうで、大変有り難いことです。

Teredoの実装(Linux)

最近僕が仕事場で使っているLinuxでは……まだ実装されてないみたいです_| ̄|○

実はLinuxでも実装されてた、または新たに実装されたという情報は常に募集中です〜。

(2004/07/20追記)
とうとうLinux版のTeredoサーバ/リレーの実装が登場しました。詳細はこちら(2004年7月20日の日記)

Teredoの名前の由来

I-Dの6.10節「Why do we use the name Teredo?」に由来の説明が載っています。

"Teredo navalis" is the Latin name for a little saltwater critter that is common in the harbors of warm seas and that digs worm holes in immersed wood pieces, such as boat hulls or pilings. The animal is not an actual worm - it is a mollusk. The Teredo ervice also digs holes, albeit in NATs, not in wood.

このプロトコルIPv6通信のためにNATに穴を開けることから、船やパイルに穴を開ける軟体動物のフナクイムシ(学名Teredo navalis japonica)から名前を取ってTeredoと名付けたとのこと。

On one hand, one may think that the Teredo is a pretty nasty animal. On the other hand, the animal only survives in relatively clean and unpolluted water; its recent comeback in several North American harbors is a testimony to their newly retrieved leanliness. The Teredo service should, in turn, contribute to a newly retrieved transparency of the Internet.

フナクイムシは迷惑な動物だけど、比較的キレイで汚染されてない水にしか生息しないから、フナクイムシが住んでるってことは水質が改善されたことの証明になる。翻って、TeredoもNATに穴を開けるだけの迷惑なサービスってわけじゃなくて、インターネットの透明性を取り戻すことに貢献するはずですよ、と書いてます。相変わらずアメリカ人はこういうのをうまいこと言いますなぁ。

Teredoの発音(なんて読むの?)

http://jiten.www.infoseek.co.jp/Eiwa?qt=Teredo&sm=1&pg=result_e.html&col=EW

辞書を見る限りは「テリード」か「テリードウ」と読みそうですが、@IT的には「テレード」と読ませたいっぽいです。

@IT:特別企画:Windows XP SP1がIPv6を実装
http://www.atmarkit.co.jp/fnetwork/tanpatsu/10winxpv6/winxpv601.html

@IT:【Interview:及川卓也氏】PtoPアプリケーションはIPv6普及を促すか?
http://www.atmarkit.co.jp/fnetwork/interview/ipv6-07/oikawa01.html

Teredoの発音(の日本語表記)についての記述はこれしか見つかりませんでした。ちなみに、「Teredo テレード」でぐぐると上の2件が引っかかり、「Teredo テレド」でぐぐるとフナクイムシの方が3件引っかかります。

うーん、どうしよう。とりあえず「テリード」で通してみようかな……。

同様の技術

(2004/05/31修正:リンク先を最新のドラフト&日本語訳に変更しました)

Negotiation of NAT-Traversal in the IKE
http://www.ietf.org/internet-drafts/draft-ietf-ipsec-nat-t-ike-08.txt

STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)
http://www.ietf.org/rfc/rfc3489.txt

このへんの技術はみんな似通ったテクニックを使ってますね。あと、Negotiation of NAT-Traversal in the IKEは下のI-Dと密接に関係しています。

UDP Encapsulation of IPsec Packets
http://www.ietf.org/internet-drafts/draft-ietf-ipsec-udp-encaps-09.txt

Teredoと違って、ソケットの数だけIPアドレスとポートの組を取る必要があるのがつらいところです。単純なサーバ・クライアント型のソフトならそれで問題ないですが、P2P型のソフトで使うとなるとこの手のアプローチはちょっと問題ありそうですね。

※後者のドラフトについては、YAMDAS Projectid:yomoyomoさんによる"UDP Encapsulation of IPsec Packets"の日本語訳が以下のURLにて公開されています。
http://www1.neweb.ne.jp/wa/yamdas/column/technique/draft-ietf-ipsec-udp-encaps-09j.txt

書籍情報:IPv6エッセンシャルズ(2004/01/26追記)

http://www.amazon.co.jp/exec/obidos/ASIN/4873111234
職場に置きっぱなしのIPv6エッセンシャルズに10行ほどTeredoの記述がありました(10.2.8節)。ちなみに内容はホントにTeredoの簡単な紹介だけなので、立ち読みしても無駄ですよ〜と一応ご報告。