NanoPi NEO2をv6プラスのルーターにする 前編

MAP-Eのマッピング計算
© いらすとや

題名は「NanoPi NEO2を」と書いているけどNanoPi NEO2でなくてはならない要素は全く無くて機材としてはPCなどを含めほぼ何でも、Linux全般で通用します。今回の前編はNanoPi NEO2すら登場しないし。

個人用の回線として使っているISPがSo-netで、昨年2月から今年の5月まではPPPoEの遅さをなんとかするためにインターネットマルチフィードのtransixを利用できるようになっていた。(So-netに申し込めばだけど)
そうするとIPv6(IPoE)はSo-netのPPPoEのIPv6を使うよりは速くなるよということだった。So-netは公式には認めなかったようだけどtransixにはDS-LiteによるIPv4 over IPv6が利用可能というオマケ?が付いているので、まぁ当然それも使うよね。するとIPv4もSo-netのPPPoEのipv4よりは遥かに速くて嬉しいという状態になった。DS-LiteのCPE側は非常に単純なカプセル化だけなのでFreeBSDやLinuxなどの標準機能だけで利用できるので、DS-Liteのためにわざわざルーターを買うという馬鹿らしいことをしなくて済むし。

関連記事:
NanoPi NEO2でDS-Liteなルーター ネットワークポート1つ版
FreeBSDルーターでDS-Lite

それがSo-netの突然の掌返しでmfeedのtransixからJPNEのv6プラスに強制的に変更させられたのが今年の5月。夜中に突然切り替えられて後からメールで切り替えましたって連絡なのでどうしようもない。NTTからHGWを渡されている場合は、それにソフトウエアが降ってくればHGWが全部やってくれるルーターになるので別に何かを用意する必要はないんだけど、HGWではなくONUを渡されている場合はその時点でv6プラス対応ルーターを持ってなければ対応のしようがないので飛行機に乗ってていきなり外に放り出された感じ。

v6プラスのIPv4 over IPv6はMAP-E方式だけど、これは公式には情報が殆ど提供されていないので「どう設定してよいかよくわからないもの」。カプセル化の部分はDS-Liteと変わらないんだけど、IPアドレスとポートのマッピングルールの取得方法が謎なのよね。BRのアドレスは公表はされてないし。それと、MAP-EはMAP-Eでもv6プラスのはだいぶ古いdraft-ietf-softwire-map-03相当「らしい」ということなのでRFC7597版とはちょっとルールの計算方法が違うようだし。これはドキュメントを読めばなんとかなる部分だけど。
でも、例によってネット上には情報が流れているようなので「v6プラス対応ルーター?」なんてのを買わずにLinuxあたりでなんとかしたいなというのが始まり。

手動でマッピングを計算してみる

基本的には与えられているIPv6のPrefixを元に計算してCE用のIPv6アドレス, IPv4アドレス、利用可能なポートが決まる。 で、その計算方法の部分は本当はマッピングルールの配信サーバから取得するのが筋なんだと思われるがそこへのアクセス方法が不明。
ただし、ネット上に計算方法があって、それは現在も一応有効。その計算方法に自分のIPv6 Prefixを突っ込めば必要な設定値は出せる。トンネルの対向になるBRのIPアドレスもいまのところはネットの情報が有効。

参考にしたページ

3つ目のリンクは便利だけど、1回だけでも自分で実際に計算するのが良さ気。答え合わせ用として使うのが良いかな。でないとマッピングがどんなのかよくわからないままになる。

アドレスマッピング

「ひかり電話」などを使ってなくてONUを渡されているユーザーのIPv6 Prefixは基本的に64。できたらifconfig -a(Linuxなど) ipconfig /a(Windows)で端末に割り当てられたIPv6アドレスとprefixを確認。

割り当てられているIPv6アドレスが下のような場合
240b:10:aabb:ccdd:8888:8888:8888:8888
ABCDEFGH
Prefixが64ビットなら240b:10:aabb:ccdd。 これはコロン : で区切られた先頭4つ分(A〜D)

CEのIPv4アドレス

IPアドレスのマッピングルール (ネットで調べた分のみ)
IPv6アドレスはprefix/31, IPv4は/15らしいが、解りやすいよう/32, /16で書いている。
IPv6 prefixIPv4 prefix
240b:10::106.72.x.y
240b:11::106.73.x.y
240b:12::14.8.x.y
240b:250::14.10.x.y
240b:251::14.11.x.y
240b:252::14.12.x.y
240b:253::14.13.x.y

IPv6Prefixの先頭32ビット分が合致するのを探す。
240b:10なら106.72.x.yになる。

上のIPv6 PrefixのCの部分(コロン区切りの3つめ)を2文字ずつに分ける。 aabb→ aaとbb
それぞれ16進数を10進数に変換する。
aa→ 170、これがxになる。
bb→187、これがyになる。
よって、IPv4アドレスは106.72.170.187になる。

PSID (Port-Set ID)

IPv6 Prefixの上の例でDの部分(コロン区切りの4つめ)、その上位8ビット分(16進数の2桁分)を取り出す。
ccddならccとなる。

CEのIPv6アドレス

上で求めたCEのIPv4アドレスを16進数に変換、それとPSIDを使う。 上で求めたIPv4アドレス: 106.72.170.187 ピリオド区切りでそれぞれ16進数に変換する
106→6a72→48170→aa187→bb
VWXY

上で求めたPSID: cc これをZとする。

IPv6 prefix/31 (下は/32で表示) アドレスルール(V〜Zは上の値を代入)

240b:10::2409:10:XY:Z00:V:WX:Y00:Z00
240b:11::2409:11:XY:Z00:V:WX:Y00:Z00
240b:12::2409:12:XY:Z00:V:WX:Y00:Z00
240b:250::2409:250:XY:Z00:V:WX:Y00:Z00
240b:251::2409:251:XY:Z00:V:WX:Y00:Z00
240b:252::2409:252:XY:Z00:V:WX:Y00:Z00
240b:253::2409:253:XY:Z00:V:WX:Y00:Z00

V, W, X, Y, Zをそれぞれ代入すると、2409:10:aabb:cc00:6a:48aa:bb00:cc00 になる。

ボートマッピング

上で求めたPSIDの前に1〜f※が、PSIDの後に0〜fが、それぞれ全ての組み合わせで付く (※ > 0なので注意)
PSIDがccの場合は1cc0〜fccf(例) 16連続したポートが15グループになる (16グループじゃない)
15グループをそれぞれ10進数に変換するとポートの範囲となる。

1cc0〜1ccf7360〜7375
2cc0〜2ccf11456〜11471
3cc0〜3ccf15552-〜5567
(中略)
ecc0〜eccf60608〜60623
fcc0〜fccf64704〜64719

今回求めた値を使って次はNanoPi NEO2をMAP-E対応ルーターにする。

関連記事:


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です