Skip to content

Repository files navigation

netmon-dashboard

„Pi-hole auf Steroiden, ohne Blocker": ein durchsuchbares Query-Log + Geräte- Sicht über das, was Suricata ohnehin mitschreibt (eve.json) — alias-aware, nach den eigenen VLANs gefiltert, mit Historie.

Eigenständige Flask-App mit genau einer Laufzeit-Abhängigkeit (flask), ausgelegt für einen kleinen Sensor-Host an einem Mirror-/SPAN-Port. Bindet nur intern (127.0.0.1), erreichbar über einen SSH-LocalForward.

Beispieldaten. Topologie (vlans.py), Defaults (config.py) und das Demo-sample_eve.jsonl nutzen Dokumentations-Adressen nach RFC 5737 (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24). Für den echten Betrieb über NETMON_HOME_NETS und das Mapping in vlans.py an die eigenen Subnetze anpassen.

Architektur

/var/log/suricata/eve.json   (Suricata, append-only)
        │  tail (inode+offset-Checkpoint, rotationssicher)
        ▼
   ingest.py  ──►  SQLite  /var/lib/netmon/netmon.db
                   ├─ events (tls=SNI, dns=query, alert=signature)  ← Query-Log
                   └─ hosts  (HOME_NET-Quellen + DHCP-Namen)         ← Geräte
        ▲
   app.py (Flask, 127.0.0.1:3001)  ◄── SSH-LocalForward ── Browser
  • Trennung der Zuständigkeit: ingest.py schreibt, app.py liest nur (WAL). eve.json wird nie von der Web-Seite angefasst.
  • Alias-aware: hosts.hostname (DHCP Option-12) + kuratierte aliases.tsv (überschreibt). Eigene Geräte mit echten Namen statt nackter IPs/IPv6.
  • Intern: bindet nur auf 127.0.0.1, kein Egress, erreichbar nur über den SSH-LocalForward.

Sichten

Route Zweck
/ Geräte-Übersicht (VLAN, alias, #Ziele, #Alarme, last-seen)
/host/<ip> „mit wem redet das Gerät" — TLS-SNI + Klartext-DNS + Alerts
/log Query-Log, filterbar nach Domain / Gerät / Typ, paginiert
/alerts Suricata-Alerts (eigene Regeln, sid 1000001+)
/grenze Inter-VLAN-Flows (Ost-West-Matrix, Quelle → Ziel)

Lokal entwickeln/testen

cd netmon
uv sync                                  # flask
# Demo-eve einlesen (Dokumentations-Adressen):
NETMON_EVE=sample_eve.jsonl NETMON_DB=/tmp/netmon.db \
  NETMON_ALIASES=aliases.example.tsv uv run python ingest.py --once
NETMON_DB=/tmp/netmon.db NETMON_ALIASES=aliases.example.tsv \
  NETMON_BIND=127.0.0.1 uv run python app.py        # -> http://127.0.0.1:3001

Alles ist via Env überschreibbar (config.py): NETMON_EVE, NETMON_DB, NETMON_ALIASES, NETMON_HOME_NETS, NETMON_BIND, NETMON_PORT.

Deploy

Siehe deploy/README.md — systemd-Units für Ingester und Web, plus optionaler ARP-/Presence-/Watchdog-Dienste.

TODO / bewusst offen

  • arpwatch-Neugeräte aus dem Follower-Log in die Alarme-Sicht mergen (aktuell nur Suricata-eve-Alerts).
  • flow-Events werden bewusst sparsam geloggt (Volumen) — bei Bedarf für Byte-Statistik/Top-Talker nachrüsten.
  • Retention/Rotation der events-Tabelle (Cron-DELETE WHERE ts < …), sobald die DB-Größe relevant wird.

About

Searchable query-log & device dashboard over Suricata eve.json — Flask + SQLite, per-VLAN device view, JA3 registry and inter-VLAN flow matrix.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages