Mikrotik – Server Failover Script

By | 23/02/2021

Last Updated on 27/08/2021 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:

Varianta 1:

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

Varianta 2:

Druhou variatou je použití nástroje Netwatch

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. 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"

Leave a Reply

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