OpenWRT+mwan3でWAN回線を冗長化する

# 動機

コロナウイルスの影響が強くなってきて、幸いにも私の仕事は自宅でも行えるため私の会社も自宅勤務するよう指示が来るようになった。3月の初旬だろうか。そのころから家のネットワークが極端に遅くなってきた。私の家はマンションで1本の100Mbps回線を共有している。おそらく休み中の子どもがいる家庭があるせいか、おそらく動画サイトなどを見ているのであろうが、午後〜夜間にかけておおよそ2,3Mbps、ひどいときには1Mbpsを切ることもある。これはかなわんとUQ WiMAXを契約、安定的に3,40Mbps出るようになりまずは一息つけた。UQ WiMAXは一応公称では800Mbps程度出るらしいのだが私の宅内ではこの程度であった。しかしまあ満足はしている。

しかしどうも私の使い方では、UQ WiMAXの制限である 3日で10GB以内 には収まりそうにないことがわかってきた。そこで普段は今迄使っているマンションのネットを使うようにして、どうしても速度が欲しいときだけWiMAXに切り替えるようにしたい。そういうことで、まずはWAN回線の冗長化をOpenWRTでできるように設定した。

図にすると以下のような感じ。
![200331-OpenWRT-mwan01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/65e94e97-bb41-173d-d9a9-ec9cebcb6f3f.png)

# 概要

OpenWRTではmwan3(Multiple WAN)というパッケージでWAN回線の冗長化を実現することができる。

https://openwrt.org/docs/guide-user/network/wan/multiwan/mwan3

mwan3ではActive-Standbyのような冗長化もできるし、両回線をロードバランスするようなActive-Activeの構成も取ることができる。またOpenWRTのWebインターフェイス(luci)経由で簡便に設定することができる。

# 導入と設定

ではmwan3の導入と設定を行っていく。構成は上の図の通りであるが、以下に改めて記述する。

- ハードウェア: RaspberryPi 3B+
- OpenWRT version 19.07.2
    - LAN回線:
        - RaspberryPi内蔵のEthernetインターフェイス
        - ネットワークデバイス: eth0
        - 192.168.20.254/24
    - WAN回線(1) - 以下ではwanとしている:
        - USB-Ethernetアダプタ
        - ネットワークデバイス: eth1
        - DHCPクライアント
    - WAN回線(2) - 以下ではwanbとしている:
        - RaspberryPi内蔵のWifi, Wifiルータ経由のUQ WiMAX
        - ネットワークデバイス: wlan0
        - DHCPクライアント

RaspberryPiをOpenWRTのfactoryイメージでブートし、LAN側のIPアドレスをセットしたところからスタート。

## 事前設定

mwan3をインストールする前にいくつか事前設定を行う。

### 2つ目のWANのセットアップ

mwan3のデフォルト設定では、1つ目のWAN回線の名称を “WAN” とし、2つ目のWAN回線の名称を “WANB” としている。WAN回線を設定するときにこのような名称にしておくとmwan3の設定が楽になる。

1つ目のWAN回線はUSB接続のEthernetアダプタで設定するのだがカーネルモジュールがまだないので、先に2つ目のWAN回線をセットアップして、カーネルモジュールをインストールする。

[Network]-[Wireless] を選択する。
![20200331-001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/70706149-e4cd-13bd-f3f5-5adce1347074.jpeg)

[Scan]ボタンを押して近傍のSSIDを探索する。
![20200331-002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/f6870347-99a7-62c9-bfd8-8b1491cd6b87.jpeg)

Wifiルーターのアクセスポイントの [Join Network] をクリック
![20200331-003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/330d250c-5776-9404-af96-64c88eae1e40.jpeg)

Wifi接続時に名前を設定するが、ここを `wanb` に設定する。パスフレーズを入れて[Submit]をクリック。
![20200331-004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/71446f8b-2051-2f9b-08b8-ad7cce860a8f.jpeg)
![20200331-005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/fd345ac8-c77c-d9c5-9dc7-57d235ca4b7f.jpeg)

[Save & Apply]をクリック
![20200331-006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/5146603e-8817-fb4c-c97c-205c715e72e6.jpeg)

[Network]-[Interface]を選択してインターフェイス一覧の画面に戻った時に、”WANB”という名前でWAN接続ができていればOK
![20200331-007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/fed03f72-35d0-2932-fa06-d5a25831fb07.jpeg)

### USB-Ethernetアダプタののカーネルモジュールをインストールする

sshでOpenWRTにログインする

```shell
$ ssh root@192.168.20.254
```

(任意)パッケージを更新する

```shell
# opkg update
# opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade
```

USB-Ethernetアダプタのカーネルモジュールをインストールする

```shell
# opkg install kmod-usb-net-asix
```

再起動する

```shell
# reboot
```

再起動後USB-Ethernetアダプタをつける。新しいネットワークデバイス(この例では eth1 )が認識されていればOK

```shell
root@OpenWrt:~# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br-lan state UP qlen 1000
    link/ether b8:27:eb:9b:73:02 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:1d:73:68:32:6f brd ff:ff:ff:ff:ff:ff
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
    link/ether b8:27:eb:ce:26:57 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.102/24 brd 192.168.100.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fece:2657/64 scope link 
       valid_lft forever preferred_lft forever
5: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether b8:27:eb:9b:73:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.254/24 brd 192.168.20.255 scope global br-lan
       valid_lft forever preferred_lft forever
    inet6 fdfd:2455:1bb1::1/60 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe9b:7302/64 scope link 
       valid_lft forever preferred_lft forever
```

### 1つ目のWANのセットアップ

[Network]-[Interface] を選択
“Add new interface…” をクリックする
![20200331-008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/33091b2c-cfda-8f0a-0139-9de648a7b11b.jpeg)

インターフェイスの名前を “wan”、プロトコルを ”DHCP client”、インターフェイスは先ほど追加したUSB-Ethernetアダプタのデバイス名(この例では eth1 )に設定し、[Create Interface]をクリック
![20200331-009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/4093402e-afd3-a355-177a-d5eebc55e4d6.jpeg)

元の画面に戻ってきたら、[Apply unchecked]を選択してクリック
![20200331-011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/feab7a62-0da3-0f0b-582d-acc70227ad9f.jpeg)

コマンドラインから再起動する

```shell
# reboot
```

再起動後、[Status]-[Overview]画面の中のNetworkで、2つのUpstreamが登録されていることを確認。
![20200331-013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/a155821f-3c24-95e8-5530-eec950ac67f5.jpeg)

### 2つのWANの利用優先度をセット

それぞれのUpstreamに利用優先度を設定する。WANを優先し、WANBはバックアップ回線として優先度を低下させる。
[Network]-[Interface]を開く。
WANの [Edit] をクリック。
![20200331-014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/3ba567c3-6a1e-884c-1714-1ceefb5fc651.jpeg)

[Advanced Settings]タブを開き、”Use gateway metric”を空欄->10に変更。[Save]を押して変更を確定。
![20200331-015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/baad37d3-048c-dd9b-b175-2c3d7a0b54e6.jpeg)

同様に WANB の[Edit]をクリック
![20200331-016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/0a17a332-134a-0534-3f85-35b6b353d735.jpeg)

[Advanced Settings]タブを開き、”Use gateway metric”を空欄->20に変更。[Save]を押して変更を確定。
![20200331-017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/90f8f943-278e-2601-1161-e52b1c34807f.jpeg)

[Save & Apply]をクリックして変更を確定させる
![20200331-018.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/40484872-4f8c-0f2c-1af0-099decf340c4.jpeg)

ターミナルでログインしてルーティングテーブルを確認する。以下のようにデフォルトルートが2つあればOK。

```shell
root@OpenWrt:~# ip route show
default via 172.22.0.1 dev eth1  src 172.22.1.14  metric 10 
default via 192.168.100.1 dev wlan0  src 192.168.100.102  metric 20 
172.22.0.0/21 dev eth1 scope link  metric 10 
192.168.20.0/24 dev br-lan scope link  src 192.168.20.254 
192.168.100.0/24 dev wlan0 scope link  metric 20 
```
### それぞれのWANの疎通確認

それぞれのUpstreamが動いていることをpingで確認

```shell:1つ目のWAN回線の確認
root@OpenWrt:~# ping -c 1 -I 'eth1' www.google.com
PING www.google.com (172.217.175.68): 56 data bytes
64 bytes from 172.217.175.68: seq=0 ttl=52 time=7.220 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 7.220/7.220/7.220 ms
```

```shell:2つ目のWAN回線の確認
root@OpenWrt:~# ping -c 1 -I 'wlan0' www.google.com
PING www.google.com (172.217.175.68): 56 data bytes
64 bytes from 172.217.175.68: seq=0 ttl=50 time=98.955 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 98.955/98.955/98.955 ms
```

## mwan3の設定

mwan3をインストールする

```shell
# opkg update
# opkg install luci-app-mwan3
```

インストールされるとWebインターフェイス(luci)が自動的に再起動するので、再度ログインする。
![20200331-019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/3178e81a-6b8f-46cb-4e69-921eaa253f29.jpeg)

ログインすると、トップメニューに新たに [Status]-[Load Balancing], [Network]-[Load Balancing] が増え、mwan3の設定を行うことができるようになっている。
![20200331-020.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/d84cb362-6f7d-7956-5351-f53bbef86949.jpeg)

[Network]-[Load Balancing]を選択する
インターフェイスの “wan6”, “wanb6” を削除する
[Save & Apply]をクリックして変更を反映
![20200331-021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/de0ff575-b158-5407-28d7-5d2ed1ce2396.jpeg)

wanb 行の [Edit] ボタンをクリック
![20200331-025.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/ae923341-dcc2-ac0d-c51f-2951dde9da74.jpeg)

“Enabled”にチェックを入れ、[Save & Apply] をクリック
![20200331-026.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/834f6233-545e-d1e3-669e-0e0bc35cde7a.jpeg)
![20200331-027.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/7c1d2b96-59b5-0242-c1f5-76cdb417252a.jpeg)

[Rules] タブを選択、https行を [Delete] ボタンで削除
![20200331-022.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/622d88f3-371d-855e-612b-4697ca35756b.jpeg)

default_rule 行の [Edit] ボタンをクリック
![20200331-023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/29859339-081a-ee2d-49a7-71b2a1210ad8.jpeg)

一番下の “Policy assigned” のプルダウンリストから “wan_wanb” を選択し、[Save & Apply] ボタンをクリック。
![20200331-024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/966920eb-a9b2-8be2-7d48-15a42d7dceee.jpeg)

最後にOpenWRTを再起動する。

# 動作確認

普段はWAN回線を使用し、WAN回線が断になるとWANB回線に切り替わる。WAN回線が断になってだいたい5秒くらいで切り替わる。アベマTV流しながら回線切り替えてみたが断は認識できなかった。ステータス画面([Status]-[Load Balancing]で確認できる)でWAN回線が断状態に切り替わっていることがわかると思う。

[![回線切り替えの様子](http://img.youtube.com/vi/EFuhtsEp-U8/0.jpg)](http://www.youtube.com/watch?v=EFuhtsEp-U8)

WAN回線が復帰すると、既に通信中のセッションは引き続きWANB回線を使い続ける。新規接続は再びWAN回線を使うようになる。failbackをシビアにやりたいのであれば、WAN回線を復帰させた後にWANB回線を断させればいい。

手動でWAN, WANB回線を上げ下げするにはifup/ifdownコマンドを使えばいい。

```shell
# ifup wan
# ifup wanb
# ifdown wan
# ifdown wanb
```