Mikrotik – Server Failover Script

By | 23/02/2021

Last Updated on 07/02/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:

mikrotik 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=
    

Dobrovolný dar

Ahoj čtenáři, rád bych tě poprosil aby ses zamyslel, co je vše potřeba ke vzniku článku.
Jakožto amatérký softwarový kutil musím:

1) Nejdříve vše nastudovat v cizích jazycích.
2) Vše následně prakticky vyzkoušet.
3) Svoje poznatky a zkušenosti napsat do článku který si právě přečetl v jazyku kterému rozumíš.
4) Dát článku hlavu a patu a publikovat.

Každý článek zabere několik hodin práce, za kterou mi nikdo neplatí.
Prosím zvaž, kolik času jsem ti právě ušetřil.
Pokud ti to stojí aspoň za cenu jedné kávy, tak mi ji kup.
Předem moc děkuji.

Příspěvek tak můžeš provést zasláním libovolné částky na mé číslo účtu 1558701011/3030

Nebo můžeš dar poslat kliknutím na tento odkaz Podpořit tento WEB , který tě přesměruje na mou platební bránu Revolut.

Dar je také možné poslat ve formě Bitcoinu na BTC peněženku bc1qqdf5fp42a7srwwhh2rut8zr9x4jm5c8fqc9qw6

Veškeré peněžní prostředky budu také používat na zlepšení kvality své webové tvorby a na psaní nových technických návodů. Za každý dar předem děkuji.

Leave a Reply

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