sentinella
// sorveglianza di livello 2

Un soldato di guardia sulla tua LAN.

Un Raspberry sempre acceso che ascolta la rete e ti scrive su Telegram quando qualcosa non torna: qualcuno che si spaccia per il router, un DHCP abusivo, i DNS cambiati, una scansione, un dispositivo mai visto.

Rust, 700 KB niente root impara da sola tutto in italiano
pi@rpi3:~ $ sentinella --version
      ▄▄▄▄▄       ▄█▄
   ▄█████████▄     █
  ▄███████████▄    █
    ██▀███▀██      █
    ▀███████▀      █    sentinella
  ▄▄▄▄▄███▄▄▄▄▄    █    sorveglia la tua LAN
 ███▀███████▀███   █
 ███ ███████ ███   █    versione 0.1.0
 ███ ███████ ▀██▄▄▄█
 ▀▀  ███▀███   ▀▀▀▀█
     ███ ███       █
     ███ ███       █
   ▄████ ████▄     ▀

Ti scrive solo quando serve

Ogni avviso dice cosa è successo, chi è stato e cosa fare, in italiano. Lo stesso avviso non si ripete prima di mezz'ora, e se qualcuno prova a sommergerla di eventi ti arriva un riassunto invece di cento messaggi.

sentinellabot
🟢 Sentinella avviata su eth0 (192.168.1.10): router 192.168.1.1 (2c:91:ab:10:4e:01), 23 dispositivi noti.08:00
ℹ️ 🆕 Nuovo dispositivo in rete: a4:cf:12:8b:3e:70 · Espressif Inc. con IP 192.168.1.5709:14
⚠️ Il server DHCP 192.168.1.1 ora annuncia gateway 192.168.1.1 e DNS 192.168.1.10 (prima: gateway 192.168.1.1, DNS 192.168.1.1). Se non l'hai cambiato tu, controlla il router.11:32
ℹ️ Scansione ARP da 192.168.1.31 (Portatile (3c:7c:3f:62:19:c8)): 254 richieste verso 254 indirizzi in un secondo. Normale per hub domotici e NAS (mettili in ignora_scan), sospetta per tutto il resto.11:40
🚨 Il router 192.168.1.1 risulta con un MAC diverso: 3c:22:fb:7a:01:9e (quello vero è 2c:91:ab:10:4e:01). Possibile ARP spoofing: qualcuno si mette in mezzo al traffico.23:07

criticoQualcuno si mette in mezzo

Un dispositivo che risponde al posto del router, un server DHCP che non è il tuo, un MAC nuovo che usa l'IP del DHCP vero, migliaia di MAC inventati al secondo per confondere lo switch. Sono gli attacchi che portano il tuo traffico a passare da qualcun altro.

attenzioneQualcosa è cambiato

DNS o gateway annunciati dal DHCP diversi da ieri, due dispositivi che si contendono lo stesso IP, un flood di ARP, il router o il DHCP che smettono di rispondere. A volte sei stato tu, a volte no: lei te lo dice subito.

infoChi c'è in rete

Ogni dispositivo mai visto, con il produttore ricavato dal MAC e il nome che gli hai dato tu nella configurazione. E le scansioni ARP: normali per un NAS, sospette per una lampadina smart.

Cosa controlla

Gli otto controlli di L2 Anomaly di NetForge, riscritti per girare sempre, giorno e notte.

🛡️

MAC del router

Ascolta l'ARP e ogni 30 secondi chiede lei stessa chi è il router. Un MAC diverso o due che rispondono insieme è ARP spoofing.

📡

Server DHCP

Ogni 5 minuti chiede un indirizzo e guarda chi lo offre. Un server non ammesso è il modo classico per dirottare tutta la LAN.

🧭

DNS e gateway

Confronta cosa annuncia il DHCP con la volta prima: DNS cambiati sono il segno tipico di un router compromesso.

⚔️

IP conteso

Lo stesso indirizzo usato da due MAC in pochi minuti: un conflitto, o qualcuno che ruba l'identità di un altro.

🌊

Flood e scansioni

Conta gli ARP al secondo e quanti indirizzi diversi chiede ogni MAC: distingue un flood da una scansione, anche velocissima.

🆕

Dispositivi nuovi

Ogni MAC mai visto, con il produttore. Riconosce i MAC casuali dei telefoni, così non ti allarmi per niente.

🔇

Router e DHCP muti

Tre controlli di fila senza risposta e ti avvisa; quando tornano, te lo dice con un ✅.

🌪️

MAC flooding

Migliaia di MAC inventati al secondo, su qualunque protocollo, per mandare in tilt lo switch. Un solo allarme, e intanto non impara la spazzatura.

Come funziona

Niente configurazione obbligatoria, niente pannello web, niente cloud: un servizio che parte con il Raspberry e resta lì.

Impara

Al primo avvio osserva la rete in silenzio per 10 minuti: router, server DHCP, DNS, dispositivi. Poi ti manda un riepilogo da confrontare con il pannello del router.

Ascolta e chiede

Su una rete con switch molte risposte non arrivano a chi ascolta e basta. Per questo chiede lei stessa al router e al DHCP: le risposte arrivano a lei.

Ricorda e avvisa

Si ricorda la rete tra un riavvio e l'altro, non ripete lo stesso avviso e non si fa zittire da chi la sommerge di eventi. Se muore lei, ti avvisa healthchecks.io.

Un programma da bifolco

Niente pannelli, niente cloud, niente database. Un contadino col fucile davanti al cancello, che urla su Telegram quando passa qualcuno di strano.

Per sorvegliare una rete è esattamente quello che serve: meno pezzi ha, meno cose possono rompersi o essere attaccate. La sentinella non apre nessuna porta.

Se vuoi dare un'occhiata alla rete senza aspettare un avviso, sentinella --html scrive una pagina di stato: chi c'è in rete adesso, i dispositivi nuovi, gli allarmi degli ultimi 7 giorni con una fascia rossa in cima quando qualcosa non va. La genera il cron, la serve il web server che hai già.

*/5 * * * * root /usr/sbin/runuser -u sentinella -- \
  /usr/local/bin/sentinella --html > /var/www/stato/index.html
La pagina di stato della sentinella: fascia rossa per un possibile ARP spoofing, la settimana degli avvisi e l'elenco dei dispositivi
La pagina di stato, con dati inventati

Leggera e chiusa a chiave

  • Un binario Rust statico da circa 700 KB: sul Pi serve solo curl.
  • Non gira come root: utente di sistema dedicato, con il solo permesso CAP_NET_RAW per leggere i pacchetti.
  • Il token di Telegram sta in un file leggibile solo da lei e passa a curl da stdin, mai sulla riga di comando.
  • Nessun limite all'infinito: al massimo 2048 dispositivi ricordati, 20 messaggi al minuto, coda limitata.
  • Orologio monotono: l'ora del Pi che salta all'arrivo di NTP non manda in confusione i controlli.

Cosa non vede

  • Lo spoofing mirato verso un'altra vittima con sole risposte ARP unicast, senza annunci in broadcast: per quello servono uno switch gestito con il mirroring di porta o il DHCP snooping del router.
  • Un intruso già presente al primo avvio verrebbe imparato come normale: per questo puoi scrivere nella configurazione il MAC del router e i server DHCP ammessi, che hanno la precedenza.
  • Il traffico: non guarda cosa fai in rete, solo chi c'è e chi risponde a livello 2.

Installazione

Va su un qualsiasi Raspberry con Raspberry Pi OS, a 32 o a 64 bit, collegato alla LAN che vuoi sorvegliare. Meglio con il cavo.

# sul Raspberry, nella cartella del pacchetto
sudo sh install.sh
sudo nano /etc/sentinella/config.toml        # token e chat_id del tuo bot Telegram
sudo -u sentinella sentinella --prova-telegram
sudo systemctl restart sentinella
# e poi, quando vuoi
sudo -u sentinella sentinella --dispositivi  # chi ha visto finora
sudo sentinella --reset                      # dimentica la rete, prima di spostare il Pi

Lo script installa quello che serve, crea l'utente sentinella e il servizio, e se lo rilanci aggiorna il binario senza toccare la configurazione.

Vuoi una sentinella sulla tua rete?

Per ora la distribuisco a mano: scrivimi e ti preparo il pacchetto per il tuo Raspberry.

Scrivimi