OpenMPTCProuterで複数インターネット回線を集約して接続帯域を増加する

# はじめに
　この記事では、複数のインターネット接続回線を束ねて帯域幅を増加させることができるオープンソースソフトウェアのOpenMPTCProuterについて紹介します。

# OpenMPTCProuterの概要

>公式サイト：https : //www.openmptcprouter.com/

>　OpenMPTCProuterは、マルチパスTCP（MPTCP）を使用して複数のインターネット接続（4G、ADSL、VDSL、ファイバーなど）とOpenWrtを集約します。

>　MPTCPがサポートされていない場合、OpenMPTCProuterはマルチリンクVPN（MLVPN）またはマルチパスをサポートするGlorytun UDPも使用できます。

>　イメージは、UEFIを搭載したx86、x86_64、Raspberry PI 2B / 3B / 3B + / 4B、Linksys WRT3200ACM / WRT32X、およびBanana PI BPI-R2にインストールできます。

>　Debian 9/10またはUbuntu 18.04 LTSを備えたVPSも必要です。
>![openmptcprouter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/a840b173-2040-ecbd-1152-f65bc3d3dcb8.png)

# 現状の（個人的な自宅のネット回線における）課題
- 自宅の Jcom in my room 30Mbps 回線が、しばしば3分間程度Ping NGになる
- FUJI Wifiを契約したが、固定回線が無駄になる
- 楽天MNOを契約したが、自宅回線とWifi回線が無駄になる
- これらは一つの端末からは一つの回線しか利用できず、複数契約している回線が無駄になっている

# 実現したいこと
- 複数のインターネット回線を束ねて使用することで、回線速度を高速化したい
- 特定のインターネット回線に障害が発生しても、利用可能な回線で通信を継続させたい
- これらにより、快適なe-workを実現したい

# 既存のソリューション
- Speedify: https://www.connectify.me/

　・良い点：Windows対応、自前でVPSの準備も不要でかんたんに使用開始できる
　・悪い点：課金あり
　・ギガジンに記事あります: https://gigazine.net/news/20130215-dispatch-field-test/

# OpenMPTCProuterの特徴

- 最大8つのインターネット回線の帯域を集約することが可能 (Aggregation)
    - MPTCPをmaster,enabledに設定した回線の帯域を集約
- 特定のインターネット回線の障害時も他の回線で通信継続が可能
    - master、enabledにした回線が1つ以上あるときは、その回線で通信を継続、一つもなくなった場合は、backupにした回線で通信を継続
- オープンソース: https://github.com/Ysurac/openmptcprouter/wiki/Technologies
    - MPTCP、OpenWRTを始め、複数のオープンソースソフトウェアの成果を利用
    - OpenMPTCProuter(OMR)間のTCPトラフィックはShadowSocks-libevを利用
    - UDPとICMPトラフィックはGlorytun TCPとMPTCPによるリンク集約を利用
        - Glorytun UDPを使用するよう設定すれば、MPTCPを必要としない
 
# 動作している様子

![IMG_5289.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/9af510d6-b9b5-e1c3-03cf-ae389e3a29ad.jpeg)


![Untitled Diagram2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/fad00a47-b9bc-bd73-90d2-f35e67951b65.png)



# 必要なもの
- インターネットに接続できる複数のデバイス
- ルータとして利用するための機器 (この記事ではraspberryPi 4 Bを利用)
- インターネット上で複数ネット回線の論理接続を終端するサーバ（この記事ではconoha VPS 512MBを利用）　←Linux kernelを入れ替えるので、新しく専用のVPSを準備すること


# 本記事執筆にあたって使用した環境

## PC
 - Windows PC1　（インターネットにアクセスするためケーブルモデムに接続）
 - Windows PC2　（Raspberry Pi eth0に接続）

※PC1とPC2はLANケーブルをつなぎ替えるなどすれば同一PCで構わない。

## NW機器
- Switching Hub

## router
- Raspberry Pi 4 (OpenMPTCProuter v0.54.7)

## Interfaces
- USB3.0 Hub (ELECOM U3H-A408S)
- Jcom in my room 30Mbps (USB2.0 LAN Adapter Buffalo LUA3-U2-ATX)
- 楽天UN-LIMIT (OPPO A5 2020 USBテザリング)
- FUJI Wifi 20GBプラン (Huawei nova lite 2 USBテザリング)
- 楽天モバイル スーパーホーダイプラン (iPhone 6 Plus USBテザリング)
- OCN Mobile ONE 1GBプラン (iPhone 5s USBテザリング)

## VPS
- Conoha 512MB (Ubuntu 18.04 LTS) (OpenMPTCProuter VPS 0.1015)


# 作り方
ここでは順番として、VPSを作成したあと、routerをセッティングします。
（2020.5.4追記: 逆でもOK。OpenMPTCProuterは、VPSと通信できない場合は、単一のWANをIP MasqueradeしたNATルータとして機能することを確認くんで確認した）

## OpenMPTCProuter-VPSをVPSサーバにインストール
1. 直接インターネットにつながったPC1から、対応したディストリビューションとバージョンのVPSを作成 (この記事ではUbuntu 18.04を利用) https://github.com/Ysurac/openmptcprouter/wiki/Install-or-update-the-VPS
2. VPSの仮想コンソールからrootで以下のインストール用シェルスクリプトを起動（すぐにプロンプトに戻る場合は裏で自動アップデートスクリプトが走っているので、topでdpkg処理完了を待って再度試す） 
3. インストール後、routerに設定する情報が記載されたテキストファイルがカレントディレクトリに生成される。reboot後、SSHポートは21から65222に変更されることに注意すること。
4. reboot後、設定情報を確認 ```cat openmptcprouter_config.txt```
5. sshクライアントから port 65222でログインできること、OpenMPTCProuter-VPS Versionが表示されることを確認

```
wget -O - https://www.openmptcprouter.com/server/ubuntu18.04-x86_64.sh | sh
```
```
Linux 133-130-XXX-XXX 4.19.104-mptcp #1 SMP Mon Feb 17 11:08:15 UTC 2020 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
< OpenMPTCProuter VPS 0.1015 >

# cat openmptcprouter_config.txt
SSH port: 65222 (instead of port 22)
Shadowsocks port: 65101
Shadowsocks encryption: chacha20
Your shadowsocks key: UcAL1zZYIQA6s+f8OHKySn09AXrU7lwS7z1tfaXXXXX=
Glorytun port: 65001
Glorytun encryption: chacha20
Your glorytun key: D4BF2FBF023970E47D521BE85DC9E01076F8924CDE2B1FFE9D1A8XCXXXXXX2
A Dead Simple VPN port: 65011
A Dead Simple VPN key: 1576CFAE5D397F495D1DA6527A61377374B3F338CF92B7E5D97XXXXXXXXXXXX1
MLVPN first port: 65201'
Your MLVPN password: qM0EW9rJ3L9JCu6m5KP+6xt8uwQb6XXXXXXXXXXEWw=
Your OpenMPTCProuter ADMIN API Server key (only for configuration via API access, you don't need it): DB44FB3E260FA76A63EDE74C0ECA140B87131146DA244CAXXXXXXXXX17
Your OpenMPTCProuter Server key: A41BEA0DD519B7A31C0B196F2463E1831F54176B3112F7DE70XXXXXXXXXXXC68
Your OpenMPTCProuter Server username: openmptcprouter
```


## OpenMPTCProuterをRaspberry Pi 4にインストール
1. PC1からイメージ(ext4-factory)をダウンロード https://www.openmptcprouter.com/download
2. Etcherを使いイメージをMicroSDHCに書き込み https://azriton.github.io/2017/11/12/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%AEOS%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E7%84%BC%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AFEtcher%E3%81%8C%E4%BE%BF%E5%88%A9%EF%BC%86UI%E3%82%AB%E3%83%83%E3%82%B3%E3%81%84%E3%81%84/
3. raspiにMicroSDHCカード、ethernetポートにLANケーブルとPC2を接続し、電源投入し起動（raspiのethernetはeth0になり、LAN向けIFとしてDHCPが機能する）
4. PC2からWebブラウザで「192.168.100.1」でログイン画面を確認
5. PC2からSSHクライアントでraspiにログインできることを確認

```
BusyBox v1.31.1 () built-in shell (ash)

   ___                 __  __ ___ _____ ___ ___              _           
  / _ \ _ __  ___ _ _ |  \/  | _ \_   _/ __| _ \_ _ ___ _  _| |_ ___ _ _ 
 | (_) | '_ \/ -_) ' \| |\/| |  _/ | || (__|  _/ '_/ _ \ || |  _/ -_) '_|
  \___/| .__/\___|_||_|_|  |_|_|   |_| \___|_| |_| \___/\_,_|\__\___|_|  
       |_|                                                               
------------------------------------------------------------------------------
   (r0+12509-04a21c26a0)
------------------------------------------------------------------------------
-----------------------------------------------------
 PACKAGE:     openmptcprouter
 VERSION:     v0.54.7

 BUILD REPO:  https://github.com/ysurac/openmptcprouter
 BUILD DATE:  Sat Mar 21 19:17:04 UTC 2020
-----------------------------------------------------
```

## routerにインターネットアクセス可能なUSBデバイスを接続
1. raspiにスマホをUSB接続し、スマホのUSBテザリングを有効にする
2. raspiの直付けコンソール画面にデバイスが表示されたことを確認（デバイスはAndroidはusbX、iPhoneはethX）

```
[  863.081129] usb 1-1.1: USB disconnect, device number 13
[  863.452255] usb 1-1.1: new high-speed USB device number 14 using xhci_hcd
[  863.595065] usb 1-1.1: New USB device found, idVendor=22d9, idProduct=276a, bcdDevice= 4.14
[  863.606145] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  863.616039] usb 1-1.1: Product: SDM665-IDP _SN:376F2646
[  863.622443] usb 1-1.1: Manufacturer: OPPO
[  863.627585] usb 1-1.1: SerialNumber: 376f2646
[  863.634663] usb 1-1.1: no of_node; not parsing pinctrl DT
[  863.644567] rndis_host 1-1.1:1.0: no of_node; not parsing pinctrl DT
[  863.655125] rndis_host 1-1.1:1.0 usb0: register 'rndis_host' at usb-0000:01:00.0-1.1, RNDIS device, 76:30:f1:d1:a0:fb
```

## OpenMPTCProuterでWANデバイスを設定

- ブラウザから192.168.100.1を開く
- ユーザ名にroot、パスワードを空欄でLoginを押す
- 画面上部にパスワード設定を促すお知らせバナーが表示されるので設定する
- システム - システムを開く
- タイムゾーンにAsia/Tokyoを選択、言語とスタイルから言語にEnglishを選択し、保存と適用を選択（以下、本記事ではEnglish表示を前提として記述）

1. System - OpenMPTCProuterを開く
2. Server settingsにServer IP、Server username、Server keyを入力し、下部の「Save & Apply」を押す
3. statusタブに遷移するので、左下にVPSが表示されることを確認（到達できないためまだエラー表示）
4. Systen - Backup / Flash firmwareを開き、Generate archiveを押して設定バックアップをしておく（おかしくなったら、このファイルを使ってRestoreからもとに戻せる）
5. デフォルトで表示されているWAN1とWAN2はDeleteする
6. Interfaces Settingsの下部にあるドロップダウンリストから、接続したデバイスを選択して「Add an interface」を押す（対応するデバイス名はsyslog参照）
7. 追加されたwanXで、Protocolに「DHCP」を選択し、「Save & Apply」を押す（ここはeth0におけるLAN向けのDHCPとは違い、スマホ向けのIPアドレスをどのように設定するかの設定となる）
8. statusタブに遷移するので、右側にWANが追加され、緑チェックのアイコンになること、しばらくして左下のVPSにエラーがなくなり緑チェックのアイコンになることを確認
9. PC2からインターネットに接続可能なことを確認
10. 4～6を接続するインタフェース分繰り返す（なお、raspi内蔵のWifiもInterfaceからSSIDを設定したあとにwlan0として追加することが可能）

<img width="726" alt="status.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/f052e56e-3a6d-1715-2ddd-4e4929a20b74.png">



# 動作確認
1. Network - MPTCP - Bandwidthを開く
2. Webブラウザからfast.comを開き、Bandwidthで開いたRealtime Trafficeでwanごとのトラフィックが表示されることを確認

<img width="672" alt="traffic.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163842/3c1b2703-7ed0-905f-7eeb-dea83a7505d8.png">



# 障害試験
1. 接続した特定のネット回線を切断する（スマホのUSBテザリングをOFFにする、USBを抜くのどちらでもOK）
2. statusで該当回線のリンクが切れたことを確認
3. ネット接続が継続していることを確認
4. fast.comで帯域が減少したことを確認
5. 切断したネット回線を接続する
6. statusで該当回線のリンクが復旧したことを確認
7. fast.comで帯域が復旧したことを確認


# ログ参照方法

## router

RLoginなどのSSHソフトから、

```watch logread -l 30```

## VPS

スマホのSSHソフトか、VPSホスティングサイトの仮想コンソールから、

```tail -f /var/log/messages
```

# 安定して使うためのTips

## Masterを固定
デフォルトではPing値が低いWANが自動選択されるが、おすすめは一番速度が速い回線をMasterに固定設定する。MasterはWANのうちのどれかひとつに設定する必要がある。

1. System - OpenMPTCProuter - Advanved Settingsから、Master interface selectionをNo changeに設定し、Save & Applyを押す
2. Network - MPTCP - Settingから、masterに設定したいWANのMultipath TCPをmaster、その他のWANをenableに設定し、Save & Applyを押す

## 低速なインタフェースや普段通信させたくないデバイスをBackupに設定
低速なインタフェースに引きづられて全体が低速になるのを防ぐ。または、通信容量を消費して低速化させないために通常利用する回線が使用不可の場合にのみ使われるように設定する。

1. Network - MPTCP - Settingから、backupに設定したいWAN(masterを除く)のMultipath TCPをbackupに設定し、Save & Applyを押す

## eth0のingressに帯域制限　（あまり意味なし）
端末からインターネットへのUploadを制限し、パケットの大量消費を防ぐ。

1. Network - SQM QoSから、Addを押す
2. 追加されるので、Interface Nameからeth0 (LAN)を選択し、Enable this SQM instance.にチェックを入れ、Download（eth0はrouterから見てLAN側なので下りになる）に数値（接続したWANデバイスのうち、一番上り帯域が遅いものの速度を、デバイス数で掛け合わせた数）を入力する
3. Queuing disciplinesタブからQueuing diaciplines usable on ~にcake、Queue setup scriptにpeace of cakeを選択し、Save & Applyを押す
4. speedtestで上り帯域が設定した上限値になることを確認

## Quotaを設定　（現在は動作しない）
月ごとの使用帯域を設定し、超過した場合にインタフェースをDown設定することで、特定WANデバイスが低速化したために全体が不安定になることを防ぐ。 ※現在は動作しない模様。shell scriptでcronをまわして実現できるかも。

1. Network - Quotaを開く
2. Downloadに契約した容量に従い、数値（Kbitなので、GByteの場合は8000000倍した数を入力）を入力し、Save & Applyを押す


## Bypass　（おすすめ！）
特定の通信を、VPNを経由せずに特定のインタフェースを使うことを選択できる。たとえば、abema.tvはVPNからのアクセスを非許容かつ動画トラヒックが大きいので、固定回線から通信させたい場合に利用する。Defaultの場合は、Master設定のインタフェースが利用される。留意点として、指定したデバイスに障害が発生した場合に指定した通信先と通信ができなくなることに注意。

1. Webブラウザで http://kakunin.net/kun/ を開き、アクセス元がVPNであることを確認
2. Service - OMR-Bypassを開く
3. DomainsのAddを押し、Domainにkakunin.netを入力し、Save & Applyを押す
4. Webブラウザで http://kakunin.net/kun/ を開き、アクセス元が固定回線からに変化していることを確認
5. アクセス元となっている固定回線をリンクダウンさせる
6. Webブラウザで http://kakunin.net/kun/ を開き、アクセス元がVPNに変化していることを確認
7. 固定回線をンクアップさせる
8. Webブラウザで http://kakunin.net/kun/ を開き、アクセス元が固定回線からに変化していることを確認

※ドメイン名の他、IPアドレス（ネットワーク）、ポート番号、MACアドレス、Source IPアドレス（ネットワーク）、プロトコルからも指定可能。
※高速だが容量制限がある回線をbackupに設定して普段使用しないようにしておき、Office 365はこの高速な回線を使用するように設定することもできる。Office 365で通信するドメインを、BypassするDomainに設定し、Interfaceを指定することで可能になる。 
※UDPを大量にやりとりするVPNソリューションをOpenMPTCProuter～VPSを通して使うと、トンネルがとぎれとぎれになり不安定になるため、VPNの接続先(またはCloud Proxy)をBypassに設定して直接接続するとよい。どんな通信をしているかは、routerでtcpdump host <PCのIPアドレス>で確認しよう。

https://blogs.windows.com/japan/2020/03/17/how-to-quickly-optimize-office-365-traffic-for-remote-staff-amp/


## 任意のDNSキャッシュサーバを指定 (2020.5.4追記)
routerが参照するDNSサーバを1.1.1.1とか8.8.8.8に設定する。

```vi /etc/config/unbound```

最下行に以下を追記

```
config zone                                   
        option enabled '1'  
        option zone_type 'forward_zone'       
        list zone_name '.'                    
        list server '1.1.1.1'                 
        list server '1.0.0.1'                 
        option fallback '1'                   
```

適用後サービスを再起動して変更を反映する。

```
uci commit
service unbound restart
```

変更が適用できたことを確認するには、VPSでtcpdumpを使い、名前解決に指定したDNSサーバのIPアドレスまたはドメインにアクセスしていることを確認する。

```
tcpdump -i any port 53
```

```
# tcpdump -i any port 53 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
21:38:49.154980 IP 10.255.255.2.53301 > 1.1.1.1.53: 43744+ [1au] A? gstaticadssl.l.google.com. (54)
21:38:49.155036 IP 133.130.115.XXX.53301 > 1.1.1.1.53: 43744+ [1au] A? gstaticadssl.l.google.com. (54)
21:38:49.156418 IP 1.1.1.1.53 > 133.130.115.XXX.53301: 43744 1/0/1 A 172.217.26.35 (95)
21:38:49.156440 IP 1.1.1.1.53 > 10.255.255.2.53301: 43744 1/0/1 A 172.217.26.35 (95)
```

## UDPとICMPをglorytun-udpにより通信させる (2020.5.27追記)
udpとicmpはglorytunの仮想トンネルによるMPTCPでカプセル化されているため、TCPのハンドシェイクにより少しおそくなってしまう。udpといえば、dns port 53の名前解決がある。glorytunはudpでマルチルートでトンネルする機能があるので、こちらに切り替えると、udpによるdns通信が早くなる。

1. VPN - Glorytunを開き、vpnのEditを押す
2. protoをudpに変更し、Save & Applyを押す
3. routerのcliから、glorytun-udp showを実行し、情報が表示されることを確認

```
root@OpenMPTCProuter:~# glorytun-udp show
client tun0:
  pid:    31742
  bind:   0.0.0.0 port 5000
  peer:   133.130.xxx.xxx port 65001
  mtu:    1372
  cipher: chacha20poly1305
```


# IPv6対応 (2020.5.4追記)
VPSがIPv6グローバルアドレスを持っている場合、LAN内からNATによりIPv6へアクセスできる。
1. Service - OpenMPTCProuterを開き、Settings WizardタブにあるEnable IPv6にチェックを入れ、Save & Applyを押す
2. Statusタブで、VPSにIPv6アドレスが表示され、routerとVPSのステータスが緑になることを確認。routerにNo IPv6と表示されてしまう場合は、routerをrebootする
3. raspiのCLIからcurl -6 google.comを実行してhtmlが表示されることを確認
4. Network - Interfaces - LAN (eth0)のEditを開き、DHCP Server - IPv6 SettingsのDHCPv6-Serviceをserver modeにし、Saveを押す
5. Save & Applyを押す
7. コマンドプロンプトでipconfigを実行し、IPv6アドレスが配布されたことを確認、route -6 printでネットワーク宛先::/0(IPv6デフォルトゲートウェイ)のゲートウェイにrouterのeth0のfe80から始まるリンクローカルIPv6アドレスがあることを確認
6. PCのWebブラウザを開き、テストサイトでIPv6が利用されていることを確認

 http://test-ipv6.com/
 https://ipv6-test.com/
 https://chrome.google.com/webstore/detail/ipvfoo/ecanpcehffngcegjmadlcijfolapggal

　なお、IPv4よりもIPv6を優先して利用したい場合は、Network - InterfacesからGlobal network optionsを開き、IPv6 ULA-Prefixのfdxx:をddxx:に変更し、Save & Applyを押す。（例：fd90:dc3d:8985::/48 -> dd90:dc3d:8985::/48）


```
C:\Users\User>ipconfig /all
イーサネット アダプター イーサネット 8:

   接続固有の DNS サフィックス . . . . .: lan
   説明. . . . . . . . . . . . . . . . .: Realtek PCIe GbE Family Controller #3
   物理アドレス. . . . . . . . . . . . .: 00-E0-4C-68-62-8E
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   IPv6 アドレス . . . . . . . . . . . .: dd90:dc3d:8985::331(優先)
   リース取得. . . . . . . . . . . . . .: 2020年5月7日 23:46:56
   リースの有効期限. . . . . . . . . . .: 2020年5月8日 11:46:56
   IPv6 アドレス . . . . . . . . . . . .: dd90:dc3d:8985:0:9c41:a13c:9335:4dfc(優先)   <--- DHCPv6 ipaddr
   一時 IPv6 アドレス. . . . . . . . . .: dd90:dc3d:8985:0:888d:84e3:9ae1:4fd5(優先)
   IPv6 アドレス . . . . . . . . . . . .: fd90:dc3d:8985:0:9c41:a13c:9335:4dfc(使用されていません)
   リンクローカル IPv6 アドレス. . . . .: fe80::9c41:a13c:9335:4dfc%23(優先)
   IPv4 アドレス . . . . . . . . . . . .: 192.168.100.216(優先)
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   リース取得. . . . . . . . . . . . . .: 2020年5月4日 18:50:34
   リースの有効期限. . . . . . . . . . .: 2020年5月8日 11:46:55
   デフォルト ゲートウェイ . . . . . . .: fe80::dea6:32ff:fe72:90ed%23   <--- IPv6 default gateway
                                          192.168.100.1
   DHCP サーバー . . . . . . . . . . . .: 192.168.100.1
   DHCPv6 IAID . . . . . . . . . . . . .: 117497932
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-1F-FA-75-49-D4-3D-7E-BE-60-E3
   DNS サーバー. . . . . . . . . . . . .: dd90:dc3d:8985::1   
                                          192.168.100.1
                                          dd90:dc3d:8985::1
   NetBIOS over TCP/IP . . . . . . . . .: 有効

C:\Users\User>route -6 print
===========================================================================
インターフェイス一覧
 23...00 e0 4c 68 62 8e ......Realtek PCIe GbE Family Controller #3
===========================================================================
IPv6 ルート テーブル
===========================================================================
アクティブ ルート:
 If メトリック ネットワーク宛先      ゲートウェイ
 23     41 ::/0                     fe80::dea6:32ff:fe72:90ed   <--- IPv6 default gateway
  1    331 ::1/128                  リンク上
 23     41 dd90:dc3d:8985::/64      リンク上
 23    281 dd90:dc3d:8985::331/128  リンク上
 23    281 dd90:dc3d:8985:0:888d:84e3:9ae1:4fd5/128
                                    リンク上
 23    281 dd90:dc3d:8985:0:9c41:a13c:9335:4dfc/128
                                    リンク上
 23     41 fd90:dc3d:8985::/64      リンク上
 23    281 fd90:dc3d:8985:0:9c41:a13c:9335:4dfc/128
                                    リンク上
 36   5256 fe80::/64                リンク上
 23    281 fe80::/64                リンク上
 36   5256 fe80::6c58:d40c:216c:786b/128
                                    リンク上
 23    281 fe80::9c41:a13c:9335:4dfc/128
                                    リンク上
  1    331 ff00::/8                 リンク上
 36   5256 ff00::/8                 リンク上
 23    281 ff00::/8                 リンク上
===========================================================================
固定ルート:
 なし
```



# 構成例 (2020.5.4追記)
- 使い放題の固定回線と、準使い放題のLTE回線を束ねて通常利用
- 固定回線はたまにPingNGとなるため、高速かつ安定しているLTEにmasterを設定
- 障害時バックアップ回線として月利用制限があるLTE回線を設定

|   |Jcom 30M|Rakuten UN-LIMIT|FUJI Wi-fi|
|:-:|---|---|---|---|
|契約内容|下り30Mbps、上り1Mbps、使い放題|上り下り30~60Mbps、1日10Gbps、超過時は3Mbps|上り下り30~60Mbps、1ヶ月20GB|
|MPTCP設定|enabled|master|backup|


# トラブル
- Raspiに直接接続できるのは2台くらいまでで、それ以上は電力不足でUSBリンクのダウンアップが頻発した。外部給電付きのUSB Hubを経由し解決。
- VPSとの通信に関わる設定変更を適用したあとは、shadowsocksとvps制御プロセスにrestartがかかるため、1秒~30秒ほどPingNGになる。たまに、VPSがkernel panicになって復帰しないこともある。スマホの4G回線からVPSにもつながらない、PingNGの場合は、VPSのコントロールパネルからコンソールを見に行ってみる。
- デバイス名は入れ替わる。認識した順にeth0/usb0から振られる。
- WLANは内蔵無線LANのみまともに動作する。USBに追加した無線LANアダプタは、正常に動作しない。USBに接続する物理LANアダプタはOK。
- iPhoneのUSBテザリングがGateway Downになる場合は、抜き差しすると復旧する。が、時間がたつとまたなる。。。
- VPS冗長化をしようと2つ目のVPSを設定すると、不安定になりそのまま安定しない。最初から設定する必要があるかも。


# メモ
- 束ねた帯域幅の上限はVPSのスペック
- 殆どのVPSからの接続は動画視聴サイト等が制限される
- 設定をもとに戻せないことがあるため、設定変更前にはConfigのBackupをとるとよい
- Network - MPTCPのBandwidthタブはおすすめ。インタフェースごとの積み上げグラフがリアルタイムで見られる。途中で取り外したデバイスは帯域表示が更新されない状態で残るが、リロードすると解消される。
- UDP通信は束ねた通信にならない。OpenVPNとかWireguardで試したところ、UDP、TCPとも直接接続と比較して低速になった。
- SQMは、speedtest結果の8割程度に設定する。適切な値であることは、平時のping値とspeedtest中のping値に大きな変動がないことで確認する。 https://openwrt.org/docs/guide-user/network/traffic-shaping/sqm-details
- Network - SQM QOSの設定を適用すると、輻輳制御がおかしくなるのか管理ページの応答がなくなる。SSH接続も徐々に反応が遅くなり、接続できなくなることがある。これは、接続していないデバイスの設定ブロックがeth0として複数散らばっている状態で設定適用すると、この地雷を踏む。Deleteで消しておくといい。この地雷を踏んだときの復旧には、再インストールが必要。（PCからSDカードにfactory imageを書き込み、設定のバックアップからリカバリする）
- 速度が遅いデバイスは、初期設定でつないでいると全体の通信が遅くなる。MPTCP backupにするか、外してしまったほうがいい。
- 速くて、途切れない回線をMasterに固定すると安定する。
- ping打ってると、Widzardページの設定適用などでVPSとのリンクが切れた際に、しばしばpingが火星に飛んでいってしまう。
- Quotaは動作しないもよう。
- backupに設定した回線は、他のすべての回線に障害発生するまでは利用されない
- 特定インタフェースが遅くなると全体の速度が低下するのは、回線ごとに均等にトラヒックを処理させるようにしているので、平均が下がるためと思われる。遅い回線はBackupに設定するか、外してしまうと影響を受けない。
- 複数のインタフェースをつけ外しすると、デバイス名が入れ替わってしまうことがある。そのため、つけ外しするインタフェースは1つまでに留めるようにするとよい。
- VPSをGoogleのVPCの無料枠で試したが、インストールスクリプト3種類とも実行中にPythonのところで応答がなくなってしまい、うまくいかなかった。
- opkg update && opkg install iptraf-ngをしたあと、iptraf-ngエンター下エンターを実行すると、コンソールからデバイスごとのトラヒックが一覧できる。
- fast.comのアップロード帯域テストをすると、ブラウザ上ではテストが終わっているのに、トラフィックモニタではデータ転送が10秒ほど続いているように見える。バッファを溜め込んでいる。これを防ぐには、routerのeth0(LAN側)に対し、egress(download)側の帯域を設定する。- Network - SQM QoSから、Add Interfaceでeth0を追加し、Download（eth0はrouterから見てLAN側なので下りになる）に数値（接続したWANデバイスのうち、一番上り帯域が遅いものの速度を、デバイス数で掛け合わせた数）を追加、peace of cakeを選択する。
- 任意のDNSサーバを使う場合、Network - Interfacesからeth0をeditし、dhcpに 8.8.8.8 とかを入力する。