Mikrotik – Server Failover Script

By | 23/02/2021

Last Updated on 05/01/2022 by administrator

Mikrotik – Server Failover Script

Mikrotik – Server Failover Script

Motivace:

Tento jednoduchý script řeší problém, že pokud dojde k výpadku primárního serveru (SERVER1), přesměruje se provoz na záložní server (SERVER2). Jakmile SERVER1 znovu najede, přesměruje se provoz opět na něj.

Script jsem si vytvářel sám, a tak budu rád za zpětnou vazbu pro nápady na zlepšení.

Mikrotik - Server Failover Script

OS:

Script je odzkoušený na verzi RouterOS 6.x, přesněji na verzích 6.46.8 a 6.48.3

Implementace pomocí scriptu:

Varianta 1 – Script (preemtivní volba):

Script níže vložit v sekci System > Script:

Mikrotik Script

Jednotlivé části scriptu jsou označeny čísly pomocí komentáře (#1, #2, ..). Každá tato jednotlivá číselná část scriptu je popsána pod celým kódem níže.

#1
:local status true

#2
/ip firewall nat set [find comment~"SERVER1"] disabled=no
#3
/ip firewall nat set [find comment~"SERVER2"] disabled=yes

#4
do {
#5
	if (([/ping 192.168.0.100 count=5]=0) and ($status = true)) do={
		/ip firewall nat set [find comment~"SERVER1"] disabled=yes
		/ip firewall nat set [find comment~"SERVER2"] disabled=no
		:log info "SERVER1 is DOWN"		
		:set status false
#6
} else={ 
	:if (([/ping 192.168.0.100 count=5]=5) and ($status = false)) do={
		/ip firewall nat set [find comment~"SERVER1"] disabled=no
		/ip firewall nat set [find comment~"SERVER2"] disabled=yes
		:set status true
		:log info "SERVER1 is UP"
	}
}
} while=( true )

#1 – local definuje proměnnou “status”, která se nastaví na “true”
#2 – pokud se najde v komentáři dané NAT rule řetezec “SERVER1”, enabluje ji pro primární server “SERVER1”
#3 – pokud najde v komentáři dané NAT rule řetezec “SERVER2”, disabluje ji pro záložní server “SERVER2”
#4 – do, while=( true ) je nekonečná smyčka
#5 – první podmínka říká, že pokud nebude úspěšná odpověď z 5-ti ICMP zpráv ze “SERVER1” běžící na IP 192.168.0.100 a zároveň pokud bude nastavena proměnná “status” na “true”, enabluje se NAT rule pro “SERVER2″ a disabluje NAT rule pro” SERVER1″, následně se proměnná “status” nastaví na “false” a vypíše se do logu “SERVER1 is DOWN”
#6 – druhá podmínka říká, že pokud bude úspěšná odpověď z 5-ti ICMP zpráv ze “SERVER1” běžící na IP 192.168.0.100 a zároveň pokud bude nastavena proměnná “status” na “false”, enabluje se NAT rule pro “SERVER1” a disabluje NAT rule pro “SERVER2”, následně se proměnná “status” nastaví na “true” a vypíše se do logu “SERVER1 is UP”

Pozn. Výhodou scriptu je, že lze tímto přepínat více NAT rulí a to díky find comment~. Stačí když NAT rule bude obsahovat komentář s řetězcem SERVER1 či SERVER2

Test scriptu:

Mikrotik RouterBoard mi běží na IP adrese 192.168.0.1. SERVER1 je linuxový server běžící na IP adrese 192.168.0.100. Na tomto SERVERU1 je za účelem simulace výpadku provedeno zakázání zasílání ICMP zpráv pomocí iptables (příkazem iptables -A INPUT -p icmp -s 192.168.0.1 -j DROP). Po chvíli, co Mikrotik nedostane ICMP odpovědi, disabluje NAT ruli SERVER1 a enabluje NAT ruli SERVER2, tímto dojde k failoveru. Následně je pravidlo pro ICMP přes iptables vymazáno (příkazem iptables -D INPUT 1), a tak Mikrotik po chvíli zaregistruje úspěšně ICMP odpovědi, a proto zpátky enabluje NAT ruli SERVER1 a disabluje NAT ruli SERVER2. Celý proces lze vidět níže:

Mikrotik - Server Failover Script

Po rebootu Mikrotiku script automaticky nenajede, nicméně to lze vyřešit pomocí nástroje Scheduler:

Varianta 2 – Script (nepreemtivní volba):

Zde script použit i tak, že po najetí primárního serveru (SERVER1), se bude provoz přesměrovávat stále na záložní server (SERVER2), ale v případě výpadku záložního serveru se zpátky přesměruje na primární server a naopak. Změny ve scriptu jsou vyznačeny červenou barvou:

#1
:local status true

#2
/ip firewall nat set [find comment~"SERVER1"] disabled=no
#3
/ip firewall nat set [find comment~"SERVER2"] disabled=yes

#4
do {
#5
	if (([/ping 192.168.0.100 count=5]=0) and ($status = true)) do={
		/ip firewall nat set [find comment~"SERVER1"] disabled=yes
		/ip firewall nat set [find comment~"SERVER2"] disabled=no
		:log info "SERVER1 is DOWN"		
		:set status false
#6
} else={ 
	:if (([/ping 192.168.0.101 count=5]=0) and ($status = false)) do={
		/ip firewall nat set [find comment~"SERVER1"] disabled=no
		/ip firewall nat set [find comment~"SERVER2"] disabled=yes
		:set status true
		:log info "SERVER2 is DOWN"
	}
}
} while=( true )

Implementace pomocí nástroje Netwatch

Výhody použití nástroje Netwatch:

  • zjednodušení konfigurace
  • po rebootu script najede automaticky (netřeba použít scheduler)

Nevýhody použití nástroje Netwatch:

  • pouze pro testovaní pomocí ICMP
  • pokud již po prvním ICMP requestu nedojde ICMP reply, Mikrotik považuje server za “down”

Varianta 1 – Netwatch (preemtivní volba):

Tento script funguje velmi podobně jako v prvním případě. Nástroj Netwatch bude dotazovat SERVER1 (192.168.0.100) ICMP zprávou co 10sec (interval). Zde je ale rozdíl v tom, že pokud již po první ICMP zprávě Mikrotik nedostane odpověď od SERVERU1 (což ve variantě 1 lze definovat), disabluje NAT ruli SERVER1 a enabluje NAT ruli SERVER2, tímto dojde k failoveru. Pokud Mikrotik po chvíli zaregistruje úspěšně ICMP odpovědi, zpátky enabluje NAT ruli SERVER1 a disabluje NAT ruli SERVER2, stejně jako u scriptu výše.

/tool netwatch
add disabled=no down-script=":log info \"SERVER1 is DOWN\"\r\
    \n/ip firewall nat set [find comment~\"SERVER1\"] disabled=yes\r\
    \n/ip firewall nat set [find comment~\"SERVER2\"] disabled=no\t" host=192.168.0.100 interval=10s up-script=\
    ":log info \"SERVER1 is UP\"\r\
    \n/ip firewall nat set [find comment~\"SERVER1\"] disabled=no\r\
    \n/ip firewall nat set [find comment~\"SERVER2\"] disabled=yes"

netwatch

Varianta 2 – Netwatch (nepreemtivní volba):

Zde script použit i tak, že po najetí primárního serveru (SERVER1), se bude provoz přesměrovávat stále na záložní server (SERVER2), ale v případě výpadku záložního serveru se zpátky přesměruje na primární server a naopak:

/tool netwatch
add disabled=no down-script=":log info \"SERVER1 is DOWN\"\r\
    \n/ip firewall nat set [find comment~\"SERVER1\"] disabled=yes\r\
    \n/ip firewall nat set [find comment~\"SERVER2\"] disabled=no\t" host=192.168.0.100 interval=10s up-script=
add disabled=no down-script=":log info \"SERVER2 is DOWN\"\r\
    \n/ip firewall nat set [find comment~\"SERVER1\"] disabled=no\r\
    \n/ip firewall nat set [find comment~\"SERVER2\"] disabled=yes\t" host=192.168.0.101 interval=10s up-script=
    

Leave a Reply

Your email address will not be published. Required fields are marked *