6to4をNAT越しに使う(基本原理編)

SINETで使えないと実用度6割減な気がするけど。

リレールータの所在

まず、ネットワークの最寄に6to4リレールータが有るかどうかをチェックしないといけない。これは、tracert 192.88.99.1(Windowsの場合)とかtraceroute 192.88.99.1(他のOS)で調べられることが多い。
うちはDION(現au one net)なので、近所にある。

tracert 192.88.99.1

Tracing route to 192.88.99.1 over a maximum of 30 hops

  1     2 ms     1 ms     2 ms  192.168.0.238 
  2     7 ms     6 ms     6 ms  192.168.1.237 
  3    18 ms    17 ms    23 ms  Z214001.ppp.dion.ne.jp [210.224.214.1] 
  4    19 ms    19 ms    19 ms  221.119.64.1 
  5    20 ms    19 ms    19 ms  d-az56.line.neweb.ne.jp [211.134.168.221] 
  6    24 ms    63 ms    90 ms  otecbb301.kddnet.ad.jp [210.155.124.193] 
  7    19 ms    19 ms    19 ms  otejbb203.kddnet.ad.jp [203.181.97.145] 
  8    33 ms    62 ms    19 ms  ix-ote207.kddnet.ad.jp [118.155.197.6] 
  9    21 ms    20 ms    20 ms  192.88.99.1 

Trace complete.

しかし、近所に無いケースも有る(例 : 電通大)

tracepath 192.88.99.1
(中略)
 3:  uec-gate-po2.cc.uec.ac.jp (130.153.25.10)              6.968ms 
 4:  tokyo2-dc-RM-GE-6-3-5-104.sinet.ad.jp (150.99.198.253)   6.363ms asymm  5 
 5:  tokyo1-dc-RM-AE-0-11.sinet.ad.jp (150.99.203.13)       8.352ms asymm  6 
 6:  nyc-gate1-RM-P-7-0-0-11.sinet.ad.jp (150.99.203.58)  199.986ms asymm  7 
 7:  Abilene-NY.gw2.sinet.ad.jp (150.99.200.194)          200.094ms asymm  8 
 8:  so-0-0-0.0.rtr.wash.net.internet2.edu (64.57.28.11)  205.227ms asymm  9 
 9:  so-0-0-0.0.rtr.atla.net.internet2.edu (64.57.28.6)   218.674ms asymm 10 
10:  ge-0-3-0.110.rtr.ll.indiana.gigapop.net (149.165.254.20) 233.816ms asymm 11 
11:  ge-0-1-0.1.rtr.ictc.indiana.gigapop.net (149.165.254.25) 233.857ms asymm 12 
12:  rtr3.ul.indiana.gigapop.net (149.165.255.129)        234.396ms reached
     Resume: pmtu 1500 hops 12 back 244 

192.88.99.1を名乗るホストは世界中に分散してるので、自分の利用しているネットワーク事業者がどの192.168.88.99.1を知っているかでたどり着くマシンは異なる(いわゆるanycast)。

設定不要または設定が容易なケース

  • Windowsは、IPv6がインストールされていてグローバルIPv4アドレスを自分で持っていればそれを使うので設定不要
  • AirMacは、6to4によるトンネル設定インターフェースを備えているので、PPP接続をAirMacで行っていれば設定不要

設定の概要

  1. 6to4のためのアドレスを計算する( http://addr.cltn.org にアクセスして表示されたアドレス*1を使う)
  2. そのアドレスから使いたいアドレスを考えてPCに設定する(先のアドレスに:/64をつける等)
  3. IPv6-over-IPv4トンネルを192.168.88.99.1に対して設定
  4. ポートを開放する要領で、プロトコル番号41*2IPv6を使いたいPCに向けて設定する。TCPUDPといった選択肢の中に"任意"が必要。

実例(OpenWrtの場合)

Windowsは設定手順がいろいろとややこしいので、まずはLinuxで。。
うちのグローバルIPアドレス(wiki.osdev.info)から計算した6to4アドレスは2002:d2e0:d624:だった。アドレスは:2/64にしてみた。
上の2〜3に相当するのがこれ。

#!/bin/sh
ip tunnel add ttl 50 mode sit remote 192.88.99.1
ifconfig sit1 add 2002:d2e0:d624::2
ifconfig sit1 up
ifconfig br-lan add 2002:d2e0:d624:eeee::2/64
route -A inet6 add 2000::/3 gw ::192.88.99.1 dev sit1

4のポート開放は、常識的なシチュエーションではOpenWrtそのものでダイアルアップしてるわけだから要らないけど、

iptables -t nat -A prerouting_wan -p ipv6 -j DNAT --to 192.168.0.91 (←上の設定をしたLinuxホストのLAN側アドレス)
iptables -A forwarding_wan -p ipv6 -j ACCEPT

のようになる。

*1:ただしproxyははずすこと。確認君などにアクセスして、正しいIPv4アドレスをHTTPサーバに対して通知しているかどうかを検証する。

*2:これが"IPv6パケットをIPv4に入れたプロトコル"をあらわす。TCPは6、UDPは17。ただし、常識的なNATではTCPUDPはポート番号の変換も伴う都合上NAPTとして特別扱いされる。他にもICMPやFTPのように色々なプロトコルが特別扱いされるが、IPv6は特に特別扱いする必要は無く、IPv4発信元の書き換えだけでうまくいく。