なぜシステムにMulti-WAN Failoverが必要なのか?
サーバーが30分間オフラインになった場合の損失を計算してみてください。中規模のECサイトであれば、数千万ドンの売上損失に相当する可能性があります。単一のISP(インターネットサービスプロバイダー)に依存することは、非常に大きなリスクです。
デフォルトのLinuxは、メイン回線に障害が発生した際に自動で経路を切り替えるほどスマートではありません。メインゲートウェイが混雑したり、海底ケーブルが断線したりすると、システムはそのまま停止してしまいます。ip routeとKeepalivedを組み合わせることで、自動化メカニズムを構築できます。WAN 1に問題が発生すると、トラフィックはわずか数秒で自動的にWAN 2へ「ジャンプ」します。
環境の準備
実際に導入するには、Linuxサーバー(Ubuntu 22.04またはDebian 12が最適です)が必要です。デバイスには少なくとも3つのネットワークインターフェースが必要です:ISPへの接続用(WAN1、WAN2)が2ポート、ローカルネットワーク(LAN)用が1ポートです。
必要なツールをインストールします:
sudo apt update
sudo apt install keepalived iproute2 curl -y
システムの詳細設定
1. 個別のルーティングテーブルの設定
デフォルトでは、Linuxは1つのメインルーティングテーブル(Main table)のみを使用します。Multi-WANを運用するには、各プロバイダーのデータフローを分離する必要があります。/etc/iproute2/rt_tablesファイルに2つの「レーン」を追加定義しましょう:
100 isp1
101 isp2
ヒント:インターフェースのIP範囲(サブネット)を計算する必要がある場合は、IP Subnet Calculatorを使用することをお勧めします。このツールはネットワーク範囲とブロードキャストを素早く計算し、手動によるミスやIPの競合を防ぐのに役立ちます。
2. 回線ヘルスチェック・スクリプト
ネットワークカードの物理的なステータスだけを信じないでください。ランプが緑色でも、プロバイダーの国際ルーティング障害によりインターネットにアクセスできない場合があります。GoogleのDNSにpingを送信して、実際の通信状態を確認するスクリプトが必要です。
/etc/keepalived/check_wan.shファイルを作成します:
#!/bin/bash
# eth0インターフェース経由でpingを送信し、WAN 1をチェック
if ping -I eth0 -c 1 -W 2 8.8.8.8 > /dev/null; then
exit 0 # ネットワークは正常
else
exit 1 # ネットワーク障害発生
fi
Keepalivedがこのスクリプトを呼び出せるように実行権限を付与します:
sudo chmod +x /etc/keepalived/check_wan.sh
3. Gatewayを制御するKeepalivedの設定
通常、Keepalivedはサーバークラスターに使用されますが、ここではゲートウェイの状態管理に使用します。/etc/keepalived/keepalived.confファイルを編集します:
vrrp_script check_wan_status {
script "/etc/keepalived/check_wan.sh"
interval 2 # 2秒ごとにチェック
fall 2 # 2回連続で失敗したらエラーと見なす
rise 2 # 2回連続で成功したら正常と見なす
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
track_script {
check_wan_status
}
# WAN 1が正常に動作している時に実行
notify_master "/sbin/ip route add default via [IP_GW_1] dev eth0 metric 10"
# WAN 1に障害が発生した時に実行
notify_fault "/sbin/ip route del default via [IP_GW_1] dev eth0 metric 10"
}
注意: [IP_GW_1]は、プロバイダーから提供された実際のゲートウェイアドレスに置き換えてください。
メトリック優先度の仕組み(フェイルオーバー・ロジック)
メトリック(Metric)値を使用して優先順位を付けます。メインのルーティングテーブルで、両方の回線を設定しますが、優先度を変えて設定します:
# WAN 1: 高優先度(低メトリック)
sudo ip route add default via [IP_GW_1] dev eth0 metric 10
# WAN 2: バックアップ(高メトリック)
sudo ip route add default via [IP_GW_2] dev eth1 metric 20
WAN 1がダウンすると、Keepalivedはnotify_faultコマンドを実行してメトリック10のルートを削除します。この時、Linuxは自動的にすべてのトラフィックをWAN 2의 メトリック20のルートに切り替えます。WAN 1が復旧すると、Keepalivedは元のルートを再挿入し、システムを初期状態に戻します。
テストと監視
設定を適用するためにサービスを再起動します:
sudo systemctl restart keepalived
テストとして、WAN 1のネットワークケーブルを抜くか、sudo ip link set eth0 downコマンドでインターフェースを無効化してみてください。その後、リアルタイムでシステムログを確認します:
tail -f /var/log/syslog | grep Keepalived
「Entering FAULT state」という行が表示されれば、バックアップモードへの切り替えは成功です。切り替え時間は通常3〜5秒程度で、エンドユーザーへの影響はほとんどありません。
このアプローチにより、ネットワークの完全な制御が可能になります。intervalパラメータを調整することで、レスポンスの速さと安定性のバランスを取り、ネットワークの不安定さ(フラッピング)によってシステムが2つのプロバイダー間を頻繁に行き来するのを防ぐことができます。

