ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

MAP-E を試してみる

どうやら、うちにつないでいる v6 プラスだと、MAP-E での IPv4 接続が 無料でついてくるらしい。しかも、PPPoE と比べて速度が出る(IPv6 相当の速度になる)という噂。 ……という訳で、それを試してみたという話。

hoshizuki.hateblo.jp この時と真逆のことをやろうとしているのか……

まずはアドレスを計算する

http://ipv4.web.fc2.com/map-e.html ここで、自分のところに割り振られている IPv6プレフィックスを入力する。 すると、MAP-E 接続に使用する各種パラメータが計算されるという寸法。

v6プラスのIPアドレス&ポートの計算方法: ネトゲー回想録 この辺を読んで自前で計算もできるけど。 一応、RFC とか読んで試してみたけど、ここにある謎の非公開らしい情報がないと、 自前で計算はできないらしい。うーん?

設定する

先人の方々の記事を参考にしつつ。 qiita.com bokut.in

まずは、さっき計算した CE のアドレスを今使ってる物理 NIC に振る。alias で OK。

# ifconfig em0 inet6 240b:11:d4e0:2000:6a:49d4:e000:2000/128 alias

で、CE と peer addr (どちらも IPv6)の間でトンネルを張る。 計算した IPv4 アドレスはここに割り振る。

# ifconfig gif0 create up
# ifconfig gif0 inet 106.73.212.224/15 106.73.212.224
# ifconfig gif0 inet6 tunnel 240b:11:d4e0:2000:6a:49d4:e000:2000 2404:9200:225:100::64

こんな感じになる。

$ ifconfig gif0
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        options=80000<LINKSTATE>
        tunnel inet6 240b:11:d4e0:2000:6a:49d4:e000:2000 --> 2404:9200:225:100::64
        inet 106.73.212.224 --> 106.73.212.224 netmask 0xfffe0000
        groups: gif
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

あと、ファイアウォールもあけておく。

# ipfw add 10 allow ip6 from 240b:11:d4e0:2000:6a:49d4:e000:2000 to 2404:9200:225:100::64
# ipfw add 20 allow ip6 from 2404:9200:225:100::64 to 240b:11:d4e0:2000:6a:49d4:e000:2000
# ipfw add 30 allow ip from any to any via gif0

トンネル間の出入り口の IPv6 パケットは相互にとりあえず全開通。 gif0 も一旦全部通す状態で実験。

これで OK。

通信してみる

MAP-E の仕様として、こちらに割り振られるグローバル IP は複数のユーザで共有していて、 そのアドレス宛の、一部のポート宛のパケットだけが流れてくる。

なので、通信するには「こちら側」のポートを指定できる必要がある。 とりあえず今回は NAPT とかするのは諦めているので(最新の pf ならできるという噂?)、 nc を使って通信してみる。※執筆時は FreeBSD 13.0-R を使ってました。

速度測定に使うサーバは、CDN にそこそこのサイズのファイルがあるものがいい。 あと非 SSL で通信できる必要がある。

……という訳で、今回はとあるサーバを勝手に拝借。

#!/bin/sh

go () {
        printf "GET /hogefuga.tar.gz HTTP/1.0\r\nHost: foobat.org\r\n\r\n" | nc -4 -p $1 xxx.xxx.xxx.xxx 80 > /dev/null
        echo 'done'
}

go 12800 &
go 12801 &

みたいな。これを、 time コマンドで実行して、転送サイズを割れば速度が分かる。 ちなみに go の引数はこちら側で使えるポート。さっきのサイトで計算した範囲のヤツを使う。

あと、測定対象のサーバ向けは gif0 に向けてパケットを投げるように、 ルーティングテーブルも追加する必要がある。

# route add XXX.XXX.XXX.XXX -iface gif0

という訳で速度測定。

IPv6(IPoE) 190.38Mbps, 164.27Mbps, 192.96Mbps
IPv4(PPPoE) 178.06Mbps, 183.91Mbps, 189.23Mbps
IPv4(MAP-E) 175.87Mbps, 162.90Mbps, 144.85Mbps

ん-……PPPoE でも十分な速度でてない???