虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

ボンディングルータを作って、外で限りなく安定通信を目指してみた

こんにちわ、虎の穴ラボのH.Y.です。
今回は、個人的な趣味で作ったボンディングルータ(OpenMPTCProuter)を使って、外で安定配信を目指したという話です。

きっかけ

自分は、配信を見るのが趣味です。
ですが、モバイル通信だと通信が不安定の場所があり、配信が途切れることがあります。
そこで外で安定して配信を見たいという一心からやってみました。

改善案

複数sim対応スマホで自動切り替え

複数simを搭載を可能とするスマホの機能で、通信が切断した時に回線を切り替えて通信を継続する方法があります。
しかし、この方法は完全に通信が切断してからでないと切り替わらないため、
配信を見るのに必要な帯域が足りない場合、問題が解決されません。
これでは自分の求めているものではなかったので、他の方法を模索してみました。

ボンディング対応ルータ

ボンディングとは、複数の回線をまとめて仮想的に一つのインターフェイスとして分散して通信する機能のことです。
通信の安定したサーバを経由して複数の回線で分散して通信して行います。
分散して通信できるので、1回線で必要な帯域が足りない場合でも他の回線の帯域を使って通信安定して配信が見れるはず。

ボンディングルータは、業務向けということもあり基本的にレンタルです。
販売しているものもありますが、10万越え+サーバー契約が必要です。
https://www.amazon.co.jp/dp/B089VWB8Y1

いろいろ探してみた結果、個人用途で需要がないせいか、割と高いということがわかりました。
そこで、自分で作れないかと思い、実際に作ってみました。

OpenMPTCProuter

OpenMPTCProuterとはボンディング機能をもったオープンソースのルータ向けOSです。
MPTCP(マルチパス通信)、OpenWRT(ルータ)などを組み合わせて実現しており、8回線までのインターネット回線をボンディング可能です。
ただ、仕組み上、通信が安定したサーバを設置する必要はあります。

github.com

今回は、このOpenMPTCProuterを使って安定通信を目指してみました。

サーバ構築

サーバの選定

サーバを選ぶにあたって考えること点があります。

  • IN、OUTから子機の通信が全て通る
    • 通信量が膨大
  • 配信見れればいいレベル
    • 最大帯域はそこまで
  • 遅延は少ない方がいい
    • 国内サーバ

これらの点を考慮すると、

  • AWS
    • 通信量がかかるため、できるなら避けたい。
    • 転送速度とローケーションは問題なし。
  • さくらインターネットクラウド
    • 追加料金なしでは100Mbpsの制限がある。
    • 通常の範囲であれば転送料は無料、ロケーションも問題なし。

他の大手クラウドサービスは転送料かかるのがデフォなので、さくらインターネットクラウドにサーバを建てることにしました。

サーバの構築方法

メモリ1G以上のDebianサーバで構築します。
rootユーザで以下のコマンドを実行するだけでサーバ構築が完了します。

#apt-get install -y ca-certificates && sed -i '/^mozilla\/DST_Root_CA_X3/s/^/!/' /etc/ca-certificates.conf && update-ca-certificates -f
#wget -O - https://www.openmptcprouter.com/server/ubuntu20.04-x86_64.sh | KERNEL="6.1" sh

構築が完了するとServerKeyが表示されるのでこれを控えて再起動します。
これ以降、サーバのsshなどのポートが変更されるので注意(sshのポートは65222).

github.com

wikiによるとポートフィルタがある場合は、全ポートフィルターは外すと書かれているので、外します。

OpenMPTCProuterの子機(ルータ)構築

今回OpenMPTCProuterを動かすルータとしてRaspberryPi4を使用しました。

設定方法としては、RaspberryPiのイメージがあるので、SDに書き込みます。

github.com

RaspberryPiの電源を入れて有線LANに接続するして、http://192.168.100.1にブラウザでアクセスします。

ユーザ:root、パスワードなしでログインします。

OpenMPTCProuterのタブから、SettingsWizardを選択し、
サーバのIPとサーバ構築の時に出てきたServerKeyをここに設定します。

機器追加

既存のwan1などを全部削除して、
機器を接続した上でインターフェイスを追加します。
固定IPにしないとかでなければプロトコルはDHCPを選択し
Physical Interfaceには、usb0を追加します。
接続した順番でusb1,2,3と増えてきます。
機器によってはeth1になります。

機器の構成は以下の4台にしました。

  • Aterm MR10LN(docomo回線)
  • Galaxy 5G Mobile Wi-Fi(au回線)
  • Xperia Ace III(softbank回線)
  • Galaxy S22(楽天モバイル回線)

ちなみに、2台より多く接続する場合は、パワー供給があるUSBハブを使用する必要があります。

全ての機器追加が完了するとステータス画面を見るとチェックマークがつきます。

分散しているかを確認します。
自宅で、6Mbpsの通信(Twitchの配信)をしたところ問題なく分散していることを確認できました。
合計が6Mbpsより多いのは、OpenMPTCProuterによるVPNやヘッダの追加、再送などが発生しているためです。

外での実測

以下の2つの条件で計測

  • au回線MVNOの単独
  • docomo回線MVNO、au回線MVNO、楽天回線、softbank回線

自動車で八王子の山付近を移動しながら測定. 音判断で切れているかを超主観判断するという比較をしました。
au回線単独ではTwitchの1080p(6Mbps)配信が途切れなかったので、
PCでTwitchの配信を2画面(12Mbps)で同時に視聴し、
その際の転送平均を測定して安定性を比較しました。

測定風景

回線 平均受信速度
au単独 10.050Mbps
OpenMPTCProuter 12.789Mbps

結果を見ると平均受信速度はOpenMPTCProuterが良い結果が出ました。
au単独では、片方の配信で音声の途切れがよく発生していました。
通信が途切れると、遅延させた上でバッファを作って瞬間的に30Mbpsの通信していたので、
実際にはもう少し離れている結果になっていると思います。 ただ、動かし始めたときやau回線の受信が悪い場所(トンネルなど)では、他の3社も同様に不安定なことが多く、完全に通信が安定しているわけではなかったです。 また、OpenMPTCProuterは結構遅延が発生していると感じれたので、そこまで万能な仕組みではないと感じました。

まとめ

  • 分散ができ単独よりは安定できた。
  • 4台スマホとラズパイとバッテリーという大掛かりになるので、手軽にはできない。
  • 完璧な仕組みではないということを感じた。