【ルータ自作】LIVA ZにOpenMPTCProuterをセットアップし、回線を束ねて高速化できるかを試す

※この記事はボチボチ進めながらメモっぽくまとめていくので随時更新します。もしかしたら途中で詰まって断念するかもしれない
→一応完了。


■参考サイト
貧弱なインターネット回線をたくさん束ねて強くできる「OpenMPTCProuter」レビュー - GIGAZINE
OpenMPTCProuterで複数インターネット回線を集約して接続帯域を増加する - Qiita
OpenMPTCProuter でネット接続をタバタバして(束ねて)みる|Takumin

1.長い前置き

住んでいるアパートが数か月前から無料でアパートWiFi(BUFFALOのサービスらしい)なるものを提供し始め、毎月6000円払ってるSoftbank光も契約更新時期なので、解約してそちらを利用しようかと思ってます。
 
で、回線速度的には大本は1Gbpsで、比較的空いてるときは上下ともに40Mぐらいは出るよう(ping値も7msぐらいでなかなか)なので、それでもまぁそこそこいいんですが、2.4/5GHz帯のアクセスポイントが複数用意されており、これはもしや複数のネットワーク回線を束ねて高速化って奴ができるのではないか…?ということで挑戦しようと思った次第。(前回USB無線LANドングルを買ったのはこれが理由)
いずれにせよ、各端末でアパートWiFiを掴んでしまうとローカルネットワーク間の通信がままならなくなり、そうするとまたルータを自作してNAT設定によってWAN接続の一本化(この場合はアパートWiFiに対して)を行う必要は出てくる。
 
ボンディング(チーミング)がそれに当たるかなということで、この技術はここにきて初めて学びましたが、この間調べた「nmtui」コマンドで設定することが可能な模様。ただこのコマンドだと無線インタフェースの選択はできないようだし、そもそもここで設定できるボンディングは負荷分散や冗長化といったロードバランサとしての意味合いが強い。
 
やりたいことは複数回線を束ねた高速化なわけで、そういえばと、過去にGIGAZINEで取り上げたSwitchboardというものがあったのは記憶にあり、これが使えないかと考えました。
gigazine.net
 
どうやら回線の統括役となるVPNサーバを設ける仕組みなようで、これ自体はサービスとしては終了。代わりに現在はSpeedifyという名前でクラウドVPNサービスとして提供されているらしい。これがなかなか月額料金を取るようで、いやOSSがあるのではと思い、検索で探し出したのが「OpenMPTCProuter」です。
gigazine.net
今回は、LIVA ZにOpenMPTCProuterを入れ、かつ仕組み的にVPSも必要になるため、そちらも用意して実現していきたい。
 

1.1 MPTCPについて

OpenMPTCProuterを利用する場合の装置構成としては以下のようになる。

出典:OpenMPTCProuter公式サイト(https://www.openmptcprouter.com/)

そもそもMPTCP(Multi-Path TCP)という概念が物珍しいわけですが、要はWAN環境にてネットワークが障害が発生した場合でも他のネットワークを利用できるように設定しておくことで、継続でインターネットを利用できるという手法です。OpenMPTCProuterはそれを実現できるOSSというわけですが、OpenMPTCProuter自体はどちらかというと可用性よりは速度向上を目的にしています。しかし、複数回線を束ねれば足し算的に速度向上が見込めるかというとそうではなく、OpenMPTCProuterを入れるルータサーバとVPSもそれなりのスペックがない限りはボトルネックになりえます。後述する速度比較結果を見る限りは、可用性と速度はトレードオフの関係にあるようです。MPTCPの理屈の上では最近話題のStarlink(衛星を利用したインターネット環境)も組み込めるはずなので、インターネット回線にジャブジャブお金使える人、かつインターネットとの接続が断たれることは一秒たりともまかりならんという人にとっては理想とも言える構成が組めます。
MPTCPについて詳しく書いてあるところは少ないですが、以下が参考になると思います。
https://www.s-lab.nd.chiba-u.jp/B3/MCTCP.html#:~:text=%E3%83%9E%E3%83%AB%E3%83%81%E3%83%91%E3%82%B9TCP(MPTCP)%E3%81%AF,%E5%AE%89%E5%AE%9A%E3%81%95%E3%81%9B%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

2.OpenMPTCProuterのイメージファイル取得とインストール

イメージディスクは以下のサイトから取得。
www.openmptcprouter.com
LIVA Zは64bit機なので、x86-64 (64-bits)欄のext4 image (EFI)のものをDLする。具体的には以下のイメージファイル。
openmptcprouter-v0.59.1-5.4-r0+16594-ce92de8c8c-x86-64-generic-ext4-combined-efi.img.gz

これを解凍ソフトで解凍し、rufus等でUSBメモリなりSDカードに書き込みます。
ただ、用意されているイメージディスクはインストーラが入っているわけではないので、DDコマンドでLIVA Zのディスクにコピーしないといけない。
(と、推測でやったけど、一応公式に書いてあった。
Router install · Ysurac/openmptcprouter Wiki · GitHub

というわけで、適当なLinuxディストリビューションのLIVE版を用意し、LIVA Zを一旦そのLIVE版で起動したうえで、DDコマンドを実行する必要があります。
つまり用意するものとしては、
Ubuntu等のLinuxのLIVE版が焼かれたUSBメモリまたはSDカード
②OpenMPTCProuterが焼かれたUSBメモリまたはSDカード
の2つ。

LIVA Zを①で起動し、

$ fdisk -l

のコマンドを叩いて、②で用意したデバイス名とLIVA Zのドライブのデバイス名を調べ、DDコマンドを実行する。ifが②のデバイス名、ofがLIVA Zのドライブのデバイス名。

$ sudo dd if=/dev/sfc of=/dev/mmcblk0 bs=16M

OpenMPTCProuter自体は600MB未満なので、コピーにそこまで時間はかかりません。
コピー完了後、一旦シャットダウンをして①、②を取り外し、再度起動してコンソールにズラズラとOS起動画面が出てきたら成功。
※追記
 DDコマンドを使ったけど、LIVE版Linuxに入っているディスクアプリケーションにて、イメージファイルを選択して書き込みができるようなので、そちらのやり方でもできるかも。
  
作業用PCとLIVA ZをLANケーブルで直接繋ぎ、作業用PC側のブラウザから「192.168.100.1」にアクセスすることでOpenMPTCProuterの管理画面に入ることが可能。(作業用PC側のIP設定は不要。OpenMPTCProuterのDHCP機能で自動的に割り振られる)

なお、最初はrootユーザにパスワードは設定されていない。ので、ブラウザの管理画面もそうだけど、LIVA Zのコンソールでもrootユーザでパスワードなしで入ることができます。

パスワードの変更は以下の順序で辿っていき、変更を行います。
[システム]→[管理]→[ルーターパスワード]タブ

3.VPSの設定

VPSを用意します。
以前はConohaVPSを使ってましたが、今回はさくらのVPS
OpenMPTCProuterではVPS用のシェルスクリプトが用意されていますが、Ubuntu用は20.04までなので、VPSのOSもUbuntu20.04でインストール。

GIGAGINEのインストール方法ではVPSのポート全開放という気でも触れたのかということを行ってましたが、どうやらここに書いてあるポートに合わせて自動的にiptablesが設定されるので問題なしということなんでしょう。たぶん。
なので、VPSのコンソールであらかじめ全ポート開放をしておきます。

シェルスクリプトは以下の手順に書いてある通りコマンドを実行します。
github.com

$ wget -O - https://www.openmptcprouter.com/server/ubuntu20.04-x86_64.sh | sudo sh
GitHubだと最後はshだけど、管理者権限でやったほうが都合がいいのでsudoで実行

/!\ You need to reboot to enable MPTCP, shadowsocks, glorytun and shorewall /!\
と出るので再起動します。
このメッセージの前段で、OpenMPTCProuterからのアクセス用の情報(暗号鍵情報等)が表示されています。
また、以下のファイルにも同様の情報が入っているため、メモし忘れた場合などはローカルにダウンロードしていつでも見られるようにしておきます。

$ sudo view /root/openmptcprouter_config.txt

$ sudo shutdown -r now

再起動後、SSHのポート番号が「65222」に変わります。(正確には再起動前から変わっているが、sshdを再起動するか、サーバそのものを再起動しない限りは影響はでない)
また、iptablesも「65222」でACCEPTが設定されます。というより、iptablesはかなり弄られるし、カーネルも変わるため、兼用ではなく専用VPSとして設けておいたほうがよさそうです。
変更となるポートは先に紹介したgithubで記載されています。

SSHクライアントでポート65222アクセスし、カーネルが変更されていればOK。

$ uname -a
Linux os3-320-49727 5.4.207-mptcp #1 SMP Sun Jul 24 14:39:44 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

VPS上でのファイアウォール設定はShoreline Firewall (Shorewall)を使ってるようなので、
以下のファイルで設定変更が可能な模様(おそらく)。

$ sudo vi /etc/shorewall/rules

※追記
Shoreline Firewall (Shorewall)を使ってるのはそうですが、直接VPSでShorewallの設定を変更するわけではないようです。実際の動作としては、OpenMPTCProuterの管理画面で設定したファイアウォール設定に基づいて、VPS側のShorewallの設定内容(/etc/shorewall/rules)が自動的に変更されるようです。
なので、基本的にOpenMPTCProuterではVPSで何かを変更するということはない模様。

4.OpenMPTCProuterの設定

LIVA Zの内蔵無線LANを使用するため、OpenMPTCProuterの管理画面に戻り、設定を行います。
(と言っても、ココらへんの設定はメモも取らずになんとなくで行ったので、ちょっと曖昧)
まずデバイスが認識されてそうでなければ、以下の順序でデバイスとして認識させます。
[ネットワーク]→[インターフェース]→[デバイス]タブに移動。
一番下にある[デバイス設定を追加]を押下。
存在するデバイスで無線デバイスがあるはずなので、それを選択します。LIVA Zの場合は、「wlan0」になるはずです。

[ネットワーク]→[無線]から無線デバイス一覧が表示されるため、該当の無線デバイスで[編集]を押下、ESSID欄にてSSIDを設定をします。
ネットワークに「wwan」を設定することでWAN側のデバイスとして設定ができます。
また、パスワードは隣のタブにある[セキュリティ]から設定します。

 
無線LANの設定が終われば、作業用PCからLIVA Z(OpenMPTCProuter)を経由してインターネット接続ができるようになっているはずです。
安全な確認くんは以下のような感じ。

 
で、ここからさらに肝心のVPS接続をします。予め作ったVPSの情報を設定します。
[システム]→[OpenMPTCProuter]→[Setting Wizard]タブに移動し、
ServerIPはさくらVPSのホスト名を指定。(IPアドレスでもいい)
Server usernameはopenmptcprouter_config.txtの「openmptcprouter」の値を設定。ただし、これはデフォルトで設定されているはず。
ServerKeyはopenmptcprouter_config.txtの「Your OpenMPTCProuter Server key」の値を設定。


画面下方にあるInterfaces settingでデフォルトで入っている「wan1」[wan2]は使用しないので削除します。

また、WAN側となる「wwan」にてMultipath TCPをマスターに変更します。


保存することで[ステータス]タブに移動します。
下記のようになっていればOK。
上から順に作業用PCに使ったJetson nano、LIVA Z、VPSとなっています。また、右横にWAN回線として「wwan」が表示されます。

安全な確認くんで確認すると、VPS経由で接続できていることが確認できます。

 

5.2回線目を登録する

先に結論から言うと、USB無線LANトングルでの計測はできませんでした。
まずドライバが無いという点は想定内なのはいいとして、ドライバのインストールができない。
engetu21.hatenablog.com
上記で実施したのはUbuntuですが、OpenMPTCProuterはパッケージ・ソフトウェアがaptではなく、opkgというものを利用しています。
make,gccはインストールすることができるものの、いざmakeを実行しても「/lib/modules/5.4.194/build: No such file or directory.」と言われて止まります。この解消方法は、build-essential、linux-headersをインストールするというのは検索でわかるものの、それをopkgで実現する方法が不明。
また、国内はほぼ情報がないので海外の掲示板を漁るものの、有効な手段は見つけられず。なんなら「Realtekは新しいドライバをひっきりなしに作るからサポートされているのは稀」みたいなことが書かれている始末。OpenMPTCProuterはOpenwrtをベースにしているため、どちらかというとOpenwrtをメインに調査しましたが、有効な手段はなく。
要するに詰んだの諦めました。
※追記(2022/10/13)
どうやら、ベースとなっているOpenWrtで用意されているOpenWrt SDKというのを使って、OpenWrt用のドライバとしてクロスコンパイル(別のLinuxPCなどでコンパイル)をする必要がある模様。クロスコンパイルする理由はOpenWrtを入れるルータ機器は基本的にコンパイルに耐えられるほどのメモリを具備していないからとのこと。しかし、挑戦はしているものの、SDK同梱のgccが動作せずにHelloworldすら作れないので、まだまだ道は長そう。
※追記終わり
 
さて、別の手段として考えたのが、スマホのUSBテザリング機能を使ってWiFiを間接的に掴むことです。
無論802.11のどこまでをサポートしているかはスマホの年代にも依存しますが、一旦仮接続としてOUKITELのスマホを接続して確認。これはac(WiFi 5)まで対応しているため、非常に高速で利用することが可能。
 
まずは、WiFi接続されたスマホをOpenMPTCProuterを入れているLIVA ZとUSBケーブルで接続し、スマホの設定で「USBテザリング」をONにします。
次に以下の手順でOpenMPTCProuterに認識をさせます。
[ネットワーク]→[インターフェース]→[デバイス]から[デバイス設定を追加]を押下。
バイスの選択にて「usb0(wan1)」を選択。

保存&適用し、続いて[システム]→[OpenMPTCProuter]へ。
画面下部から「usb0」を選択し、インターフェースとして追加。

「Multipath TCP」を「有効」にして適用。


[システム]→[OpenMPTCProuter]→[ステータス]
で回線が2つになってることが確認できます。
ちなみに、OpenMPTCProuterのIPアドレスとアドレス帯域は変更してます。

 

6.実測

パターンごとに図ってみました。時刻としてはほとんどの人が使っていない深夜帯。
USB接続スマホSoftbank光(802.11ac)、LIVA Zの内蔵WiFiがアパートWiFiに接続されています。
以下に記載しているMasterは主回線として指定している回線。有効(enable)はMasterほど優先度高くないけど、有効にされている回線です。
なお、設定にはbackupのように、主回線に問題が合ったときの冗長化用の設定もあります。

6.1 アパートWiFiのみ


6.2 Softbank光(802.11ac経由)のみ


6.3 Softbank光(Master) + アパートWiFi(有効(enable))


6.4 アパートWiFi(Master) + Softbank光(有効(enable))

遅い方の回線をMasterに設定すると速い方の回線は補助に回るためか、速い方をMasterにした場合と速度に違いが出てるようには見えます。また、2回線利用することで10Mbpsがアップしているようには見えますが、計測は諸々の影響でどうしても誤差は発生するため、劇的には速度アップはしていないようには見えます。
ただまぁ、単体の回線速度が高いというのもあるので、これが回線混んでいる場合にこの機能がどうなるかは気になるところ。
 
なお、OpenMPTCProuterにはByPass機能があるため([サービス]→[OMR-Bypass])、こちらを利用すると、VPS経由ではなくなります。(当然2回線利用ではなくなりますが)
例えば、速度測定に使ったUSENドメインを登録し、Softbank光で確認すると以下の通り。

これと比較するとVPSボトルネックとなって通信速度とping速度が落ちているということがわかります。
VPSを経由すると100Mbpsが限界値なようにも見えます。なお使ってるのはCPU:2core、メモリ:1GBです。
公式Githubではラズパイ3(4コア1.2Ghz、1GB)で150Mbpsぐらいが限度だとの発言(FAQ · Ysurac/openmptcprouter Wiki · GitHub)があったので、このVPSスペックだとこれが限界ということでしょう。(ラズパイ3のNIC的には100Mbpsが上限だが、USB接続等で他の回線を組み合わせてもCPU的には150Mbpsで頭打ちだよ、と解釈している)
またping速度の落ちは非常に高いため、ゲームサーバなどと繋げる場合はBypassで設定しておいたほうが無難そう。
 
まぁ繋げる回線によっては恩賜を受けられるでしょうし、何よりルータOSとして作られたベースとなっているOpenwrtがいい出来なのか、GUIでの設定というのがとても操作しやすいので、それだけでもUbuntuで人力ルータ作成よりは楽。
ただ、ルータ向けOSだからかパッケージは軽量なopkgで管理ということで、正直aptでできることがそのままできるわけではないということで戸惑う部分は多い。まぁopkgもコマンド打たずにブラウザ上の操作でインストールできたりするけども。
まぁ今回のチャレンジでかなり知識と経験が得られたからよかったかな。