The script performs the first function of increasing the route depending on which WAN interface is down. In my environment, these two interfaces are Internet-Main and Internet-Backup
I've created two other scripts firewall-to-backup and firewall-to-main which look for firewall filters and nat rules matching the in-interface or out-interface of the downed interface, and will switch to the up interface.
When the failover script switches to the Internet-Backup the firewall-to-backup script should run which performs the following:
Code: Select all
/ip firewall filter set [f w in-interface="Internet-Main"] in-interface=Internet-Backup
/ip firewall filter set [f w out-interface="Internet-Main"] out-interface=Internet-Backup
/ip firewall nat set [f w in-interface="Internet-Main"] in-interface=Internet-Backup
/ip firewall nat set [f w out-interface="Internet-Main"] out-interface=Internet-Backup
/queue simple set [f w target="Internet-Main"] target=Internet-Backup
/ip firewall connection remove [find]
Code: Select all
/ip firewall filter set [f w in-interface="Internet-Backup"] in-interface=Internet-Main
/ip firewall filter set [f w out-interface="Internet-Backup"] out-interface=Internet-Main
/ip firewall nat set [f w in-interface="Internet-Backup"] in-interface=Internet-Main
/ip firewall nat set [f w out-interface="Internet-Backup"] out-interface=Internet-Main
/queue simple set [f w target="Internet-Backup"] target=Internet-Main
/ip firewall connection remove [find]
Code: Select all
# ------------------- header -------------------
# Script by Tomas Kirnak, version 1.0.7
# If you use this script, or edit and
# re-use it, please keep the header intact.
#
# For more information and details about
# this script please visit the wiki page at
# http://wiki.mikrotik.com/wiki/Failover_Scripting
# ------------------- header -------------------
# ------------- start editing here -------------
# Edit the variables below to suit your needs
# Please fill the WAN interface names
:local InterfaceISP1 Internet-Main
:local InterfaceISP2 Internet-Backup
# Please fill the gateway IPs (or interface names in case of PPP)
:local GatewayISP1 X.X.X.X
:local GatewayISP2 X.X.X.X
# Please fill the ping check host - currently: resolver1.opendns.com
:local PingTarget 8.8.8.8
# Please fill how many ping failures are allowed before fail-over happends
:local FailTreshold 5
# Define the distance increase of a route when it fails
:local DistanceIncrease 2
# Editing the script after this point may break it
# -------------- stop editing here --------------
# Declare the global variables
:global PingFailCountISP1
:global PingFailCountISP2
# This inicializes the PingFailCount variables, in case this is the 1st time the script has ran
:if ([:typeof $PingFailCountISP1] = "nothing") do={:set PingFailCountISP1 0}
:if ([:typeof $PingFailCountISP2] = "nothing") do={:set PingFailCountISP2 0}
# This variable will be used to keep results of individual ping attempts
:local PingResult
# Check ISP1
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP1]
:put $PingResult
:if ($PingResult = 0) do={
:if ($PingFailCountISP1 < ($FailTreshold+2)) do={
:set PingFailCountISP1 ($PingFailCountISP1 + 1)
:if ($PingFailCountISP1 = $FailTreshold) do={
:log warning "ISP1 has a problem en route to $PingTarget - increasing distance of routes."
:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
:log warning "Route distance increase finished."
/system script run firewall-to-backup
}
}
}
:if ($PingResult = 1) do={
:if ($PingFailCountISP1 > 0) do={
:set PingFailCountISP1 ($PingFailCountISP1 - 1)
:if ($PingFailCountISP1 = ($FailTreshold -1)) do={
:log warning "ISP1 can reach $PingTarget again - bringing back original distance of routes."
:foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
:log warning "Route distance decrease finished."
/system script run firewall-to-main
}
}
}
# Check ISP2
:set PingResult [ping $PingTarget count=1 interface=$InterfaceISP2]
:put $PingResult
:if ($PingResult = 0) do={
:if ($PingFailCountISP2 < ($FailTreshold+2)) do={
:set PingFailCountISP2 ($PingFailCountISP2 + 1)
:if ($PingFailCountISP2 = $FailTreshold) do={
:log warning "ISP2 has a problem en route to $PingTarget - increasing distance of routes."
:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] + $DistanceIncrease)}
:log warning "Route distance increase finished."
/system script run firewall-to-main
}
}
}
:if ($PingResult = 1) do={
:if ($PingFailCountISP2 > 0) do={
:set PingFailCountISP2 ($PingFailCountISP2 - 1)
:if ($PingFailCountISP2 = ($FailTreshold -1)) do={
:log warning "ISP2 can reach $PingTarget again - bringing back original distance of routes."
:foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
{/ip route set $i distance=([/ip route get $i distance] - $DistanceIncrease)}
:log warning "Route distance decrease finished."
/system script run firewall-to-backup
}
}
}