それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MWANのためにデフォルトGWを複数にしたらい問題が生じたので単純な冗長化をした

mwan パッケージで冗長化しようとした。

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

コレを読んでたら、なんだ簡単じゃん。って思ったので試したのですが。

デフォルトGWを複数にしたら問題が生じた

Global IPを取得する機能

こういうのがいくつかの場所で使われている。

. /lib/functions/network.sh
network_flush_cache
network_find_wan WAN_IF
network_get_ipaddr IP_ADDR "${WAN_IF}"

OpenWrt の内部では、WANを探すのにuse defaut gateway ( routing 0.0.0.0/0 )のフラグの解釈結果を探索し、ルートに0.0.0.0/0 を設定しているインターフェイスを探索し、みつかったら探索終了というスクリプトがあり、各所で使われている。つまり2個め以降は探索されない。

そのため、mwanを使うと、どこかのプログラムで齟齬が生じる可能性がある。

このことから、mwan 機能はいくつかのパッケージに影響をあたえ誤作動を起こす。

だから、マルチなデフォルトGWをLuciで作るとなると怖い。

MWANは、何も考えずに使うと、ちょっとやばい気がする。とくにDDNS関連が崩壊する。

そこで、Luciで作らずに、デフォルトGWを増やす

MWANの役割

MWANの役割は、上流GWをクライアントごとに切り替えて、マルチホーミング(死語?)な上流を構成して、負荷軽減を図る

または、上流がダウンしたときに呼び回線に自動的に切り替えるというものだ。

VRRPのようなスジのわるい実装とは違い、ポリシールーティングと ip route add default metric を使っているシンプルな実装。上流GWをpingで監視してダウンしたら、パケットを切り替えるという感じ。

たぶんポリシールーティングでやってると思う。

冗長化だけなら、MWANいらなくね?

冒頭の記事を読んで試して思ったのだが、負荷分散ならともかく、冗長化ならGWだけでよくね。 要は、メインの回線が死んだときに予備回線に切り替わればいいわけだから。

metric 指定してGWを2つ入れればいい。

root@OpenWrt:~# ip route
default via 221.110.204.8 dev pppoe-ybb proto static metric 100
default via 192.168.55.5 dev eth2 proto static metric 200

mwan にある死活監視やセッションの切り替えのような便利なものはなくなってしまうので、ストリーミングは切れてしまうと思うが。ダウンしたときでもちゃんと繋がるのは良い。

pppoe や map-e の再起動が手軽になった。

いままでは、家族に気を使いながら、再起動や、pppoeのIP再取得を行っていたが、全然気にせずにバンバン落とせる。気楽でいいわコレ。

ストリーミングといってもyoutube 程度ならhttpセッションが再開するだけなのでほとんど気にならない。ゲームなどの連続の通信は駄目出し、MWANを使ってても駄目だと思う。ニンテンドースイッチのようなUDPならなおさら無理だと思うが、通常ブラウジング程度ならダウンしたことに気づかない。

設定

主回線のインターフェイスのGWメトリックを指定して

予備回線のインターフェイスのGWメトリックをを指定する

こっちは、uci/ luci で行うとほかのパッケージに影響するのでコマンドから流す。

ip route add default via 192.168.55.5 dev eth2 proto static metric 200

後は、192.168.55.5 宛に送るときにmasquerade するようにする。

masquerade は nft コマンドから流してもいいい、Luciから作ってもいい。

nft の例

nft add rule inet fw4 srcnat meta nfproto ipv4 oifname "eth2" jump srcnat_opnsense comment "takuya:to-opnsense-masq"
nft add rule inet fw4 srcnat_opnsense  oifname "eth2" ip saddr 192.168.10.0/24 counter masquerade comment "takuya:to-opnsense-masq"

後は、起動時に、自動的に予備回線宛のdefault gw 設定を登録するようにする。

/etc/hotplug.d/iface/97-ifup-InnerVM.sh

#!/usr/bin/env sh


function add_default_route(){

  ip route add default via 192.168.55.5 dev eth2 proto static metric 200

}

function google_home_route_to_vm(){
  /etc/config/custom/radiko-route/radiko-route-to-opnsense.sh add
}
function google_home_route_to_default(){
  /etc/config/custom/radiko-route/radiko-route-to-opnsense.sh del
}


function main(){
  ##
  TARGET_ACTION=ifup
  TARGET_INTERFACE=InnerVM
  TARGET_DEVICE=eth2
  ###

  [ "$INTERFACE" = "$TARGET_INTERFACE"  ] && {
    logger "iface $TARGET_INTERFACE / $TARGET_DEVICE $ACTION detected, do hotplug actions."
    case $ACTION in
      ifup)
        add_default_route
        google_home_route_to_vm
        ;;
      ifdown)
        google_home_route_to_default
        ;;
        *)
        ;;
    esac


  }
}


main

google home は、メイン回線のオンオフでストリーミングが止まるので、最初から、予備回線を通すことにした。

コレで、冗長化が終わる。

あとはダウンして試す。

メイン回線をダウンさせて、様子を見る。

ifdown my-main-isp
ping 1.1.1.1

ちゃんと切り替わってるのが面白い。

まとめ

フェイルオーバーなら、mwan3 は機能が多すぎてややこしいが、GUIで完結するので初心者にはいいかも。

ロードバランサーなら、ポリシールーティングを書くのがめっちゃめんどくさいので、mwan3 を使ったら幸せになる。

ただの冗長化なら、linuxではdefault ゲートウェイのmetric 機能で十分だった。

参考資料