Ciao Ragazzi,
oggi vi parlo di come effettuare il monitoraggio di connessioni IPSec in una maniera particolare.
Esistono diversi sistemi che potremmo utilizzare (Watchdog, script basati su ping, etc. etc.) ma non mi hanno convinto, specie perchè nel mio caso ho dei concentratori che hanno connessioni IPSec verso diversi siti remoti.
L’idea di fondo è quella di monitorare la “Phase 2” dell’IPSec che è quella che ci dice se la connessione è stata stabilita oppure se c’è stato qualche errore.
Andiamo direttamente allo script RouterOS che poi vi spiego in dettaglio:
:global err "0";
:global site "";
:foreach i in=[/ip ipsec policy find] do={
:local state [/ip ipsec policy get $i value-name=ph2-state]
if ($state != "established") do={
:set err "1";
:set site [/ip ipsec policy get $i value-name=comment]
:log error "Errore $site"
}
}
if ($err != "0") do={
/tool fetch "https://api.telegram.org/botXXXXXXXXXXX:XXXXXXXXX/sendMessage\?chat_id=YYYYYY&text=$site" keep-result=no
}
Andiamo nel dettaglio, visto che nel mio caso sono più connessioni da monitorare mi serve il foreach, ma il comando che davvero ci salva è questo:
/ip ipsec policy get $i value-name=ph2-state
Con questo comando vado a prendere direttamente il valore della ph2-state che se la connessione è correttamente instaurata è “established” altrimenti vuol dire che per qualche motivo non viene stabilita.
Finita la mia iterazione (se scopro un errore setto la variabile err a 1) se c’è stato un errore lo scrivo nel log e mi mando una notifica Telegram dove:
XXXXXXXXXXX:XXXXXXXXX è il Token del mio Bot e YYYYYY è la chat id (entrambi facilmente reperibili sfruttando le api di telegram)
In realtà questo script nasce con la possibilità di automatizzare e velocizzare il ripristino della connessione IPSec, ma c’è il rischio che se il problema è legato ad una mancanza di connessione internet del sito remoto, la connessione si riavvia di continuo, io ve lo scrivo lo stesso anche se ci sto lavorando!
if ($err != "0") do={
:log warning "Restarting IPSec Peers"
/ip ipsec remote-peers kill-connections
/tool fetch "https://api.telegram.org/botXXXXXXXXXXX:XXXXXXXXX/sendMessage\?chat_id=YYYYYY&text=$site" keep-result=no
}
Oppure un’altra variante è farlo prima, quando abbiamo valorizzato ancora la variabile i e fare un disable/enable della singola policy che è andata in errore.
Se vi è stato d’aiuto offritemi una birra che programmare fa venire sete!!
Enjoy!