Posted on Fri Aug 06 09:45:19 +0900 2010 by nabeken
6to4 relay routerを国内で実験的に提供しているtokyo6to4が今度はmfeedと共同で国内にTeredo relay routerを設置しました。 Teredoについての復習およびその効果を確かめました。
TeredoそのものはWindows XP SP2から搭載されており、まったく目新しいわけではありません。RFCになったのも2006年です。 Windowsに標準搭載されているとはいえ、国内にrelay routerがないため遅延が酷く日常的に使えるものではありませんでした。
今回、国内にrelay routerが設置されたとのことで、Teredoについて調べ、自前でTeredo Relayを設置することでその効果を確かめました。
TeredoはIPv4/UDPの上にIPv6をカプセル化します。 Teredoはアドレス構成および初期通信を行なうサーバとリレーをするサーバが異なります。前者をTeredo Server、後者をTeredo Relayと呼びます。
Teredo Relayは6to4と同じくTeredo専用のIPv6 prefix(2001:0000::/32)を持ち、anycastで運用しています。 さきほどのニュースはこのTeredo Relay用のprefixを国内から経路広告をした、ということです。したがって、Teredo Server自体は提供されていません。
Teredoのアドレスを持ったTeredo Clientからwww.kame.netへping6を打った時の動作から、国内のTeredo Relay routerはteredo1.tokyo6to4.netと推測します。
IP 126.101.XXX.XXX.34020 > 203.178.8.1.58584: UDP, length 104
これはつまり、www.kame.netが収容されているIPv6ネットワークから見て2001:0000::/32を広報し、かつTeredo Relayサーバになっている一番近いサーバがteredo1.tokyo6to4.netだとわかります。
国内のIPv6ネットワークであっても、2001:0000::/32が遠いとTeredo Relayサーバが国外を経由するケースもあります。
この記事を配信しているサーバへping6を打つと、
IP 126.101.167.103.34020 > 80.84.224.224.32986: UDP, length 104
逆引きするとteredo-relay.proserve.nlとなり、国外のリレーを通っています。これはつまり、projects.tsuntsun.netが収容されているIPv6ネットワーク(OCN)から見て、2001:0000::/32を広報し、 かつTeredo Relayサーバになっている一番近いサーバがteredo-relay.proserve.nlとなります。OCNはまだtokyo6to4から2001:0000::/32の経路を受信していないので、国外の経路を通っている と推測します。
Miredoは*NIXでのTeredo実装です。tapデバイスを介してユーザランドで実装されています。MiredoはTeredo Client, Teredo Relay, Teredo Serverを実装しています。 通常はTeredo ClientとTeredo Relayを使うことになると思います。
設定ファイルは/etc/miredo/miredo.confです。おそらく、大抵のシステムではデフォルトのままで大丈夫でしょう。 InterfaceNameとServerAddressだけ注意します。今回はLinuxで試しました。
# cat /etc/miredo/miredoc.conf
#! /usr/sbin/miredo -f -c
#
# Sample configuration file for Miredo
# Please refer to the miredo.conf(5) man page for details.
# Miredo can safely run as a Teredo client, which is the default.
#RelayType client
# Name of the network tunneling interface.
InterfaceName teredo
# Depending on the local firewall/NAT rules, you might need to force
# Miredo to use a fixed UDP port and or IPv4 address.
#BindPort 3545
#BindAddress 192.0.2.100
#SyslogFacility user
## CLIENT-SPECIFIC OPTIONS
# The hostname or primary IPv4 address of the Teredo server.
# This setting is required if Miredo runs as a Teredo client.
#**************************************************************************#
# teredo.remlab.net is an experimental service for testing only. #
# Please use another server for production and/or large scale deployments. #
#**************************************************************************#
#ServerAddress teredo.ipv6.microsoft.com
#ServerAddress teredo.ginzado.ne.jp
#ServerAddress teredo.iks-jena.de
ServerAddress teredo.remlab.net
#ServerAddress2 teredo2.remlab.net
## RELAY-SPECIFIC OPTIONS
#Prefix 2001:0::
#InterfaceMTU 1280
次にmiredoを起動します。起動すると、tapインターフェースが作成され、自動的にアドレスが振られます。
# miredo
# ifconfig teredo
teredo Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet6 addr: fe80::ffff:ffff:ffff/64 Scope:Link
inet6 addr: 2001:0:53aa:XXXX:XXXX:XXXX:XXXX:XXXX/32 Scope:Global
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1280 Metric:1
RX packets:223 errors:0 dropped:0 overruns:0 frame:0
TX packets:261 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:70009 (68.3 KiB) TX bytes:31723 (30.9 KiB)
効果を確かめてみましょう。 (www.kame.netは国内のTeredo Relayと近いことがわかっています)
# ping6 www.kame.net -c 10
PING www.kame.net(2001:200:dff:fff1:216:3eff:feb1:44d7) 56 data bytes
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=1 ttl=57 time=819 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=2 ttl=57 time=102 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=3 ttl=57 time=123 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=4 ttl=57 time=145 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=5 ttl=57 time=65.4 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=6 ttl=57 time=85.7 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=7 ttl=57 time=106 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=8 ttl=57 time=127 ms
64 bytes from 2001:200:dff:fff1:216:3eff:feb1:44d7: icmp_seq=10 ttl=57 time=70.4 ms
--- www.kame.net ping statistics ---
10 packets transmitted, 9 received, 10% packet loss, time 9248ms
rtt min/avg/max/mdev = 65.419/182.965/819.190/226.325 ms
最初の1回はTeredo Serverが相手先とパケットをやりとりを行い、そこからTeredo ClientがTeredo Relayへパケットを投げているためRTTは高くなっています。 この初期化が終わるとクライアントは相手から見た一番近いTeredo Relayへパケットを直接投げるためRTTは小さくなっています。揺れが酷いのは無線LAN経由のためです。
しかし、IPv4的に近くても相手から見て国内のTeredo Relayを通過しない場合は国外のRelayを通過するためRTTが大きくなります。
# ping www.iij.ad.jp -c 10
PING www.iij.ad.jp (210.130.137.80) 56(84) bytes of data.
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=1 ttl=49 time=103 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=2 ttl=49 time=123 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=3 ttl=49 time=44.4 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=4 ttl=49 time=64.8 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=5 ttl=49 time=85.2 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=6 ttl=49 time=108 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=7 ttl=49 time=129 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=8 ttl=49 time=47.8 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=9 ttl=49 time=68.4 ms
64 bytes from www-v4.iij.ad.jp (210.130.137.80): icmp_seq=10 ttl=49 time=88.5 ms
--- www.iij.ad.jp ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9025ms
rtt min/avg/max/mdev = 44.411/86.455/129.538/28.390 ms
# ping6 www.iij.ad.jp -c 10
PING www.iij.ad.jp(2001:240:bb42:b000::1:80) 56 data bytes
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=1 ttl=57 time=1128 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=2 ttl=57 time=331 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=3 ttl=57 time=352 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=4 ttl=57 time=275 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=5 ttl=57 time=295 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=6 ttl=57 time=318 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=7 ttl=57 time=341 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=8 ttl=57 time=259 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=9 ttl=57 time=281 ms
64 bytes from 2001:240:bb42:b000::1:80: icmp_seq=10 ttl=57 time=302 ms
--- www.iij.ad.jp ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9016ms
rtt min/avg/max/mdev = 259.365/388.664/1128.177/248.139 ms, pipe 2
Teredoの仕組みでは、相手から見て一番近いTeredo Relayを通過し、クライアントと直接IPv4の通信を行ないます。 自ネットワーク内にTeredo Relayを置くことでTeredoでの通信を両方向で改善することができます。
これは6to4にはない利点です。6to4の場合、片道は自組織を通過させることができますが、戻りは相手から見て一番近いリレーを通るため完全には制御できません。 (6to4はクライアント、相手先どちらも自分から見て一番近いリレーを通過するため、リレールータがそれぞれで異なることが多い)
そこで、今回は自ネットワークに2000::/32を広告し、自前で用意したTeredo Relayを通過するようにしてみました。 その結果、自ネットワーク宛のTeredo経由の通信が国内周りになり快適になりました(このサーバへping6を打ってもらえれば確認できます)。
設定は簡単です。生成するtapインターフェース名と待ち受けるポート番号とIPv4アドレスを指定するだけです。 RelayTypeではrelayを指定します(未指定だとクライアントになります)。
#! /usr/sbin/miredo -f -c
#
# Sample configuration file for Miredo
# Please refer to the miredo.conf(5) man page for details.
# Miredo can safely run as a Teredo client, which is the default.
RelayType relay
# Name of the network tunneling interface.
InterfaceName miredo0
# Depending on the local firewall/NAT rules, you might need to force
# Miredo to use a fixed UDP port and or IPv4 address.
BindPort 3544
BindAddress 10.X.X.X
SyslogFacility user
NAT配下の場合はBindPortで指定したポートをBindAddressで指定したアドレスへ転送するような設定が必要です。
現在、自ネットワークは東京と大阪の2つの拠点があります。ネットワーク構成は以前書いたのと変化していません。
----------------------------------------------------------
The Internet
----------------------------------------------------------
| |
| | k-opti.com (IPv4 only)
| |
------------- ---------------------------
OCN (IPv4/IPv6) IX2015 (Osaka)
------------- ---------------------------
| | Tunnel1.0 | FastEthernet0/1
| | |
| IPv6-over-IPv4 | IPv6-over-IPv4 |
| | |
| Tunnel0.0 | Tunnel1.0 |
----------------------------------------- |
IX2015 (Tokyo) |
----------------------------------------- |
| FastEthernet0/1 |
| -----------
| Linux BOX (bird)
| -----------
---------- | |
Linux BOX | |
---------- | `---- サーバ群
| |
| |
| |
--------------------------------------------------------------------------
IHANet
--------------------------------------------------------------------------
今回は大阪側のLinuxBOXでmiredoのTeredo Relayを立ち上げ、そこからbirdで2001::/32をOSPFv3で広告しました。設定はstatic protocolに記述しました。
protocol static {
route 2001::/32 via "miredo0"
}
以上で自ネットワークのTeredo対応が完了しました。これでひとまず公衆無線LANでTeredoをしてもいい感じになりました。