動機
コロナウイルスの影響が強くなってきて、幸いにも私の仕事は自宅でも行えるため私の会社も自宅勤務するよう指示が来るようになった。3月の初旬だろうか。そのころから家のネットワークが極端に遅くなってきた。私の家はマンションで1本の100Mbps回線を共有している。おそらく休み中の子どもがいる家庭があるせいか、おそらく動画サイトなどを見ているのであろうが、午後〜夜間にかけておおよそ2,3Mbps、ひどいときには1Mbpsを切ることもある。これはかなわんとUQ WiMAXを契約、安定的に3,40Mbps出るようになりまずは一息つけた。UQ WiMAXは一応公称では800Mbps程度出るらしいのだが私の宅内ではこの程度であった。しかしまあ満足はしている。
しかしどうも私の使い方では、UQ WiMAXの制限である 3日で10GB以内 には収まりそうにないことがわかってきた。そこで普段は今迄使っているマンションのネットを使うようにして、どうしても速度が欲しいときだけWiMAXに切り替えるようにしたい。そういうことで、まずはWAN回線の冗長化をOpenWRTでできるように設定した。
概要
OpenWRTではmwan3(Multiple WAN)というパッケージでWAN回線の冗長化を実現することができる。
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クライアント
- LAN回線:
RaspberryPiをOpenWRTのfactoryイメージでブートし、LAN側のIPアドレスをセットしたところからスタート。
事前設定
mwan3をインストールする前にいくつか事前設定を行う。
2つ目のWANのセットアップ
mwan3のデフォルト設定では、1つ目のWAN回線の名称を “WAN” とし、2つ目のWAN回線の名称を “WANB” としている。WAN回線を設定するときにこのような名称にしておくとmwan3の設定が楽になる。
1つ目のWAN回線はUSB接続のEthernetアダプタで設定するのだがカーネルモジュールがまだないので、先に2つ目のWAN回線をセットアップして、カーネルモジュールをインストールする。
Wifiルーターのアクセスポイントの [Join Network] をクリック
Wifi接続時に名前を設定するが、ここを wanb
に設定する。パスフレーズを入れて[Submit]をクリック。
[Network]-[Interface]を選択してインターフェイス一覧の画面に戻った時に、”WANB”という名前でWAN接続ができていればOK
USB-Ethernetアダプタののカーネルモジュールをインストールする
sshでOpenWRTにログインする
$ ssh root@192.168.20.254
(任意)パッケージを更新する
# opkg update
# opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade
USB-Ethernetアダプタのカーネルモジュールをインストールする
# opkg install kmod-usb-net-asix
再起動する
# reboot
再起動後USB-Ethernetアダプタをつける。新しいネットワークデバイス(この例では eth1 )が認識されていればOK
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…” をクリックする
インターフェイスの名前を “wan”、プロトコルを ”DHCP client”、インターフェイスは先ほど追加したUSB-Ethernetアダプタのデバイス名(この例では eth1 )に設定し、[Create Interface]をクリック
元の画面に戻ってきたら、[Apply unchecked]を選択してクリック
コマンドラインから再起動する
# reboot
再起動後、[Status]-[Overview]画面の中のNetworkで、2つのUpstreamが登録されていることを確認。
2つのWANの利用優先度をセット
それぞれのUpstreamに利用優先度を設定する。WANを優先し、WANBはバックアップ回線として優先度を低下させる。
[Network]-[Interface]を開く。
WANの [Edit] をクリック。
[Advanced Settings]タブを開き、”Use gateway metric”を空欄->10に変更。[Save]を押して変更を確定。
[Advanced Settings]タブを開き、”Use gateway metric”を空欄->20に変更。[Save]を押して変更を確定。
ターミナルでログインしてルーティングテーブルを確認する。以下のようにデフォルトルートが2つあればOK。
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で確認
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
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をインストールする
# opkg update
# opkg install luci-app-mwan3
インストールされるとWebインターフェイス(luci)が自動的に再起動するので、再度ログインする。
ログインすると、トップメニューに新たに [Status]-[Load Balancing], [Network]-[Load Balancing] が増え、mwan3の設定を行うことができるようになっている。
[Network]-[Load Balancing]を選択する
インターフェイスの “wan6”, “wanb6” を削除する
[Save & Apply]をクリックして変更を反映
“Enabled”にチェックを入れ、[Save & Apply] をクリック
[Rules] タブを選択、https行を [Delete] ボタンで削除
default_rule 行の [Edit] ボタンをクリック
一番下の “Policy assigned” のプルダウンリストから “wan_wanb” を選択し、[Save & Apply] ボタンをクリック。
最後にOpenWRTを再起動する。
動作確認
普段はWAN回線を使用し、WAN回線が断になるとWANB回線に切り替わる。WAN回線が断になってだいたい5秒くらいで切り替わる。アベマTV流しながら回線切り替えてみたが断は認識できなかった。ステータス画面([Status]-[Load Balancing]で確認できる)でWAN回線が断状態に切り替わっていることがわかると思う。
WAN回線が復帰すると、既に通信中のセッションは引き続きWANB回線を使い続ける。新規接続は再びWAN回線を使うようになる。failbackをシビアにやりたいのであれば、WAN回線を復帰させた後にWANB回線を断させればいい。
手動でWAN, WANB回線を上げ下げするにはifup/ifdownコマンドを使えばいい。
# ifup wan
# ifup wanb
# ifdown wan
# ifdown wanb