A cosa serve Netwatch?

Netwatch è la sentinella di RouterOS: ogni tanto bussa a un indirizzo e, quando smette di rispondere o torna a farlo, esegue uno script. Lo script può fare quello che vuoi; il più utile di tutti è avvisarti. È la differenza fra “il cliente ti chiama alle 9 perché la telecamera del magazzino è spenta da ieri sera” e “alle 23:14 ti arriva sul telefono: telecamera magazzino non risponde”.

In questo howto Netwatch sorveglia due cose: un apparato della rete (una telecamera) e la linea internet. Gli avvisi arrivano su Telegram.

Schema: MikroTik con Netwatch che controlla una telecamera, un NVR e la linea internet e manda gli avvisi su Telegram
Netwatch sorveglia la telecamera, l’NVR e la linea internet: quando qualcosa cade o torna, lo script manda il messaggio su Telegram.

Passo 1: il router sa già scrivere su Telegram?

Gli avvisi usano lo script telegram dell’howto su come collegare MikroTik a Telegram. Se non l’hai ancora fatto, parti da lì: sono pochi minuti. Controlla che funzioni:

{
:local telegram [:parse [/system script get telegram source]]
$telegram "prova prima di Netwatch"
}

Se il messaggio arriva sul telefono, sei pronto.

Passo 2: come sorveglio un apparato?

Un Netwatch per ogni apparato, con due script: uno per quando cade e uno per quando torna. Nell’esempio la telecamera dell’ingresso è 192.168.88.20: metti l’indirizzo del tuo apparato.

/tool netwatch add name=telecamera-ingresso host=192.168.88.20 type=icmp interval=10s \
    ignore-initial-up=yes \
    down-script={
        :local telegram [:parse [/system script get telegram source]]
        $telegram ("ATTENZIONE: " . $name . " (" . $host . ") non risponde")
    } \
    up-script={
        :local telegram [:parse [/system script get telegram source]]
        $telegram ("OK: " . $name . " (" . $host . ") di nuovo raggiungibile")
    }
  • type=icmp: ogni 10 secondi (interval) manda una raffica di ping e decide se l’apparato è su o giù;
  • negli script $name e $host sono già pronti: il nome del Netwatch e l’indirizzo sorvegliato. Così lo stesso script va bene per tutti gli apparati;
  • ignore-initial-up=yes lo spiego al passo 5.

Per controllare l’indirizzo e la rete dell’apparato c’è l’IP calculator del Dojo.

Passo 3: come lo provo?

Stacca il cavo dell’apparato, o spegni la porta del router a cui è collegato, e aspetta una ventina di secondi. In laboratorio, staccando e riattaccando la porta, nel log è comparso questo:

netwatch,info event down [ telecamera-ingresso ]
fetch,info Download from api.telegram.org FINISHED
netwatch,info event up [ telecamera-ingresso ]
fetch,info Download from api.telegram.org FINISHED

E sul telefono sono arrivati i due messaggi, “ATTENZIONE: telecamera-ingresso (…) non risponde” e poi “OK: … di nuovo raggiungibile”. Lo stato di tutte le sentinelle lo vedi così:

/tool netwatch print
/log print where topics~"netwatch"

Passo 4: come sorveglio la linea internet?

Stesso Netwatch, ma verso un indirizzo su internet che risponde sempre al ping, per esempio 1.1.1.1:

/tool netwatch add name=internet host=1.1.1.1 type=icmp interval=30s \
    thr-avg=300ms thr-loss-percent=50 ignore-initial-up=yes \
    down-script={
        :local telegram [:parse [/system script get telegram source]]
        $telegram "ATTENZIONE: la linea internet non risponde"
    } \
    up-script={
        :local telegram [:parse [/system script get telegram source]]
        $telegram "OK: la linea internet è tornata"
    }

Qui le due soglie contano:

  • thr-avg: se la latenza media supera questo valore, per Netwatch la linea è giù. Di serie è 100 ms: su una linea 4G, satellitare o radio molto carica, una linea che funziona può sembrare morta. Con 300 ms sei più tollerante;
  • thr-loss-percent: la percentuale di ping persi oltre la quale la linea è giù.

Ma come fa ad avvisarti se la linea è giù? Il messaggio di “giù” parte quando internet non c’è, quindi si perde. Se hai una seconda linea il messaggio esce da lì; se ne hai una sola, ti arriva comunque l'”OK” al ritorno, e già sapere che c’è stata un’interruzione, e a che ora, è prezioso. In alternativa, nello script di “giù” puoi scrivere nel log o mandare una mail a un server interno.

Passo 5: cosa succede dopo un riavvio?

Due cose da sapere, viste in laboratorio:

  • dopo l’avvio Netwatch aspetta 5 minuti prima di cominciare (startup-delay). In quei minuti tutte le sentinelle restano in stato unknown: è normale, non è un guasto;
  • allo scadere dei 5 minuti ogni sentinella passa da “sconosciuto” a “su” e, di serie, esegue lo script di “su”. Con dieci apparati sorvegliati, a ogni riavvio ti arrivano dieci messaggi “OK”. ignore-initial-up=yes salta proprio quel primo “su”. Il primo “giù”, invece, resta: se dopo il riavvio un apparato non risponde, lo vuoi sapere.

Per sapere quando il router stesso si riavvia c’è lo scheduler del passo 6 dell’howto Telegram.

Passo 6: si può sorvegliare qualcosa di più di un ping?

Sì. Oltre a icmp, Netwatch sa fare altri tipi di controllo:

  • tcp-conn: apre una connessione TCP su una porta, per esempio la 554 di una telecamera o la 443 di un server. Il ping può rispondere anche quando il servizio è morto;
  • http-get e https-get: chiede una pagina web e controlla il codice di risposta;
  • dns: interroga un server DNS e controlla che risponda.
/tool netwatch add name=nvr-web host=192.168.88.30 type=tcp-conn port=443 interval=30s

Soglie e opzioni di ogni tipo di controllo sono nel manuale MikroTik: Netwatch.

Cosa controllo prima di metterlo in produzione?

Un router che sorveglia la rete e manda messaggi deve essere a sua volta protetto. Se non l’hai ancora fatto, segui l’Hardening di base di un router MikroTik. E prova davvero ogni sentinella almeno una volta, staccando il cavo: un avviso mai provato è un avviso che non arriverà.

Provato in laboratorio su PNETLab con CHR RouterOS 7.24.5 (stable), un client Linux come apparato sorvegliato e un bot Telegram vero: avvisi di “giù” e “su” ricevuti sul telefono, linea internet con soglie personalizzate, attesa di 5 minuti dopo il riavvio e messaggio “su” iniziale, ignore-initial-up. Il tipo tcp-conn e gli altri tipi di controllo vengono dalla documentazione MikroTik.

Domande frequenti

Che cos’è Netwatch in MikroTik?

È uno strumento di RouterOS che controlla periodicamente un indirizzo (con ping, connessione TCP, HTTP o DNS) ed esegue uno script quando l’indirizzo smette di rispondere o torna raggiungibile.

Perché dopo un riavvio Netwatch resta in stato unknown?

Perché di serie aspetta 5 minuti dall’avvio prima di cominciare i controlli (startup-delay). Passati i 5 minuti, le sentinelle passano a “su” o “giù”.

Come evito un messaggio per ogni apparato a ogni riavvio?

Con ignore-initial-up=yes: Netwatch salta lo script di “su” al primo controllo dopo l’avvio, ma esegue comunque quello di “giù” se un apparato non risponde.

Perché Netwatch dice che la linea è giù se internet funziona?

Probabilmente per la latenza: con type=icmp la soglia di serie della latenza media (thr-avg) è 100 ms, e su linee 4G, satellitari o radio cariche viene superata. Alza la soglia, per esempio a 300 ms.

Quali variabili posso usare negli script di Netwatch?

Fra le altre $name e $host, il nome della sentinella e l’indirizzo sorvegliato, più le statistiche dell’ultimo controllo. Quelle con il trattino si scrivono fra virgolette, per esempio $"done-tests".