自宅回線をフレッツ光クロスに変えてみた3
IPv4編
Xpassの固定IP用の各種設定例が https://enhikari.jp/xpass.html enひかりのページからリンクされている。
これらを見てみればだいたい分かるのだが、Xpassの固定IP接続では以下の2つが求められる。
- トンネルの送信元IPv6アドレスを認証するためのhttpsアクセス
- IPv4 over IPv6 トンネルを設定し、そこの固定IPをつけること
なお、以下の設定に必要なパラメータ類は工事日当日にenひかりからメールに添付されたPDFとして送られてくる(なお当日なのは開通当日までアルテリアから情報とれないからだそうです)
トンネルの送信元のIPv6アドレスの認証は設定例を見るとルータ自身がもってるDynamicDNSの仕組みを応用したり、YAMAHAのルータみたいに内臓のluaスクリプトで頑張ってやったりしてるが、要は指定したパラメータをつけてHTTPSでGETしてやればいいということになる。DHCPv6-PDで移譲されるprefixが変われば送信元のアドレスも変わるはずなので、本来であればprefixの変更を検知して自動的にHTTPSでアクセスして...という仕組みをつくるべきなのだけど(もちろん設定例ではそうなってるのだけど)、prefixの変更はそうそう発生しないであろうし、このネットワークを使うのは主にオレだけなので少しのあいだ通信が止まってても構わないこともあり、一旦wgetでつついて作業を進行(もちろん、これは一旦といっていて延々とこのままになるパターン...)
wget -6 --no-check-certificate --http-user=BASICAUTH_USER --http-password=BASICAUTH_PASSWORD 'https://URL?d=DOMAIN&p=PASSWORD&a=TUNNEL_SOURCE_ADDRESS&u=USERNAME'
これでTUNNNEL_SOURCE_ADDRESSがip4ip6トンネルの始点アドレスと認識されるのでトンネルを掘るとパケットが通るはず。
では実際にsystemd-networkdでの設定を見てみる。
まず、.netdev ファイルを用意。デバイス名はv4tnlとした。
[NetDev]
Name=v4tnl
Kind=ip6tnl
[Tunnel]
Local=slaac
Remote=tunnel先IPv6アドレス
Mode=ipip6
EncapsulationLimit=none
ipip6 トンネルを作成するごく普通の設定だが、一点だけ最後の行 EncapsulationLimit=none を必ず入れること、これを忘れるとXpassの固定IPのトンネルでは「下り(自分の方)の通信は全然正常なのに上りが2Mbpsくらいしか出ない」という怪現象に襲われることになる。
IPv4 over IPv6 tunnel ではv6のパケット中に入れ子にカプセリングできる上限を指定できるようになっていてLinuxだとディフォルトで4のなっているのですが、(入れ子構造の最大値なわけでなにか悪さできそうな気はしなくもないのでわからなくもないけど)世の中のルータの中にはこの EncapsulationLimit パラメータをちゃんと扱ってくれないやつが結構あり、Y社のルータのようにそもそもパケット自体をmalformedだといって落としてしまって丸ごと無視するやつとかもあったりするくらいなので、わりとトラブルのもとになりやすいようだ。今回のXpassの対向側のルータもそういう類のやつのようで、(結局具体的にどうなってそういう挙動になってるかまではわからなかったが)v4パケットがボロボロとおちていくという挙動になってしまうようだ。結果TCPだとパケットが再送されまくって速度が強烈におちるしUDPやICMPだとパケットおちまくりでまともに通信できませんという感じになる。
ということで、原因がわからなくて2日ほど悩んだが EncapsulationLimit=none に設定することで正常になった(その説はenひかりのサポートのおにいさんに大変にお世話になりました。技術的にはこういうことでした... なお、enひかりのサポート誠実で一生懸命どうにかしてくれようとする感じで、ものすごく高印象だというのを付け加えておきます)
トンネルをほったら、あとはIPまわりを設定するだけ、.network ファイルを用意。こんな感じ。
[Match]
Name=v4tnl
[Network]
IPForward=ipv4
IPMasquerade=ipv4
DefaultRouteOnDevice=true
[Address]
Address=XXX.XXX.XXX.XXX/32
XXX.XXX.XXX.XXX の部分は設定資料にある固定IPアドレス。特に説明は要らないと思うが、ipv4のroutingをonにするのとIPMasquaradeをonにする、あとはDefaultRouteをこのデバイスに向けるように設定している。
こんな感じでIPv4 も開通した。
時間帯にもよるけど速度的にはだいたい3Gbps〜7Gbps程度は出る。体感でも分かる程度に十分速いし、特にIPv6でアクセスしてくるDebian mirrorサーバへのrsyncの時間がかなり短縮された上にコストも下がったのでわりといい感じ。