前提
- インターネット回線は二つ
- ルーターも二つ
- 平時もバックアップ回線を有効活用したい
- パソコンのゲートウェイは1つのアドレスで固定
図にすると、こんな感じのケース。
L3スイッチのGatewayは、10.10.0.254 を見ている想定です。
設定
コアな部分のみ書きます。
Router1
ip lan1 vrrp 1 10.10.0.254 priority=200
ip lan1 vrrp shutdown trigger 1 lan2
ip lan1 vrrp 2 10.10.0.253 priority=100
lan keepalive use lan2 icmp-echo 8.8.8.8 length=65
ip filter 2501 pass 192.168.200.1-192.168.200.253 * * * *
ip forward filter 1 1 gateway 10.10.0.253 filter 2501
ip lan1 forward filter 1
schedule at 1 startup * lua emfs:/vrrp-check.lua
Router1 の LUA
embedded file vrrp-check.lua <<EOF
LOG_PTN = "%[VRRP LAN1:2%].* (%w+)$"
CMD_ROUTING = "ip lan1 forward filter 1"
function change_routing_vrrp(VRRP_STATE)
if VRRP_STATE == "MASTER" then
rt.command("no " .. CMD_ROUTING)
else
rt.command(CMD_ROUTING)
end
end
function vrrp_status_check()
local rtn, str
rtn, str = rt.command("show status vrrp lan1 2")
if (not rtn) or (not str) then
return 1
end
if string.find(str,"Master") ~= nil then
change_routing_vrrp("MASTER")
else
change_routing_vrrp("BACKUP")
end
end
function wait_log()
local rtn, array
while true do
rtn, array = rt.syslogwatch(LOG_PTN)
if rtn > 0 then
change_routing_vrrp( string.match(array[1], LOG_PTN))
end
end
end
vrrp_status_check()
wait_log()
EOF
Router2
ip lan1 vrrp 1 10.10.0.254 priority=100
ip lan1 vrrp 2 10.10.0.253 priority=200
ip lan1 vrrp shutdown trigger 2 lan2
lan keepalive use lan2 icmp-echo 8.8.8.8 length=65
解説
両方の回線が生きている場合、
端末セグメント2はルーター1の パケット転送フィルター(ip lan1 forward filter ~)で、回線2 を使うようになっています。
回線1が障害の場合、
VRRPにより全通信がルーター2に向きます。
回線2が障害の場合、
端末セグメント2はパケット転送フィルターにより、NextHopが 10.10.0.253になりますが、これはルーター1自身のIPになってしまいます。これを回避するため、LUAで パケット転送フィルターの オン/オフを VRRPに連動して切り替えます。
LUA が必要な理由
- VRRPの状態により経路変更する仕組みがない
LUA が不要なパターン
- 端末のゲートウェイ設定をルーター1にしたり、ルーター2にしたり指定できる場合。(図のL3がなくなり、ルーターのLANセグメントに直接、端末がつながっているパターン)
DHCP サービスを走らせて、fallback オプションと gateway指定の組み合わせで分けたりできる。
後記
いろいろ試してみたけど、どうにも組み込みコマンドだけで設定するのは難しそう。
L3スイッチでソースアドレス指定した経路設定できたら問題ないんだけど。
ヤマハルータなら設定例みたいなソースアドレス指定で経路設計できるので、スイッチでも実装してくれたらいいのに。