2012/06/25

VPN上でIPv6する

これだけIPv6と言われているにも関わらず、公衆無線LANサービスでは、IPv6 addressを配っていない。それどころか、private addressを配布してキャリアグレードNATなんてところもある。global addressが割り当てられないということは、6to4できないということだ。
文句を言っても解決しないので、なんとかする方法を考えてみる。

LionだとOCN IPv6を使おうとしても、PPPが異常終了してしまう。IPv6 addressを持っているServerとVPNを張って、そこでIPv6 over IPv4すればよいのではないか?VPNが割り当てるIPv4のアドレスが固定ではないが、DTCP (Dynamic Tunnel Configuration Protocol)を使ってIPv6トンネルを掘ればよい。
というわけで、まずdtcpcへのLionパッチ。

--- dtcpc.rb-dist 2006-01-09 03:24:01.000000000 +0900
+++ dtcpc.rb 2012-02-26 19:34:35.000000000 +0900
@@ -96,7 +96,8 @@
 TUNIF_CLONING = true
 TUNNEL_CREATE = 'ifconfig %s tunnel %s %s'
 TUNNEL_DELETE = 'ifconfig %s deletetunnel'
-ROUTE_METHOD = ROUTE_IFP
+#ROUTE_METHOD = ROUTE_IFP
+ROUTE_METHOD = ROUTE_INTERFACE
 
 def usage()
   $stderr.print "usage: #{File.basename($0)} [-cdDlnU] [-b udpport] [-i if] [-m mtu] [-p port] [-t tuntype] [-u username] [-A addr] [-R dest] [-P prefix-delegation] server\n"

これを当ててmake installする。
dtcpcは自動で動かすことにして、/usr/local/etc/dtcpc.auth を用意する。これはマニュアル通り。
launchdで自動起動させるため、/Library/LaunchDaemons にdtcpc.plistを作る。中身は
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Label</key>
 <string>dtcpc</string>
 <key>ProgramArguments</key>
 <array>
  <string>/usr/local/sbin/dtcpc</string>
  <string>-t</string>
  <string>host</string>
  <string>-u</string>
  <string>dtcpで使うユーザ名</string>
  <string>dtcpsのアドレスまたはマシン名</string>
 </array>
 <key>RunAtLoad</key>
 <true/>
 <key>ServiceDescription</key>
 <string>Turmpet Dynamic Tunnel Configuration Protocol client</string>
</dict>
</plist>

sudo launchctl load /Library/LaunchDaemons/dtcpc.plist して起動させるが、サーバー側が用意できてからにする。

で、下のようなネットワーク構成で考える。
  • 3つのサーバが同じネットワークに別々に存在している。
  • 割り当てられているIPv6 addressは/64。

DTCP Serverはマニュアル通りにセットアップする。dtcpc.plist にあるように、dtcpcはhostモードで動かすので、prefixに/64のアドレスを設定する。
dtcpcのアドレスはdtcpsが自動で割り当てる。このとき、IPv6 Gatewayから見ると、dtcpcにはDTCP Server経由となるのだが、割り当てているのは同一の/64のアドレスなので、proxy arpのように、DTCP Serverが代理で応答してくれないと、通信できない。
/64よりも大きいaddress blockが割り当てられているのであれば、別の/64アドレスを使うこともできるのだが、その手は使えない。
そこで、dtcpsが割り当てるaddressが/64の頭の方であることに注目し、IPv6 GatewayにDTCP Server経由の/96(/80でも可)のルートを追加して逃げる。routeはlongest matchなので、これでOK。DTCP ServerでRIP NGか何かを動かすのが正攻法なのだろうけど。3つがバラバラでなければもっと簡単になるんだろう。

まだまだ、IPv6で生活するには手間がかかるな。



0 件のコメント :

コメントを投稿

Comments on Google+: