~nabeken/diary/

Gentoo Linux(6年くらい)とFreeBSD(1年くらい)とOpenBSD(新参者)を使う日々。


IHANet BGP peering overview

NAT配下での動的なIPv6トンネリング技術Teredoを使う

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

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でTeredo

Miredoは*NIXでのTeredo実装です。tapデバイスを介してユーザランドで実装されています。MiredoはTeredo Client, Teredo Relay, Teredo Serverを実装しています。 通常はTeredo ClientとTeredo Relayを使うことになると思います。

MiredoでTeredo Client

設定ファイルは/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 Relayを自前で用意する

Teredoの仕組みでは、相手から見て一番近いTeredo Relayを通過し、クライアントと直接IPv4の通信を行ないます。 自ネットワーク内にTeredo Relayを置くことでTeredoでの通信を両方向で改善することができます。

これは6to4にはない利点です。6to4の場合、片道は自組織を通過させることができますが、戻りは相手から見て一番近いリレーを通るため完全には制御できません。 (6to4はクライアント、相手先どちらも自分から見て一番近いリレーを通過するため、リレールータがそれぞれで異なることが多い)

そこで、今回は自ネットワークに2000::/32を広告し、自前で用意したTeredo Relayを通過するようにしてみました。 その結果、自ネットワーク宛のTeredo経由の通信が国内周りになり快適になりました(このサーバへping6を打ってもらえれば確認できます)。

MiredoでTeredo Relay

設定は簡単です。生成する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で指定したアドレスへ転送するような設定が必要です。

bird + OSPFv3で2000::/32を広告する

現在、自ネットワークは東京と大阪の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をしてもいい感じになりました。