„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.jsonlnutzen 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 überNETMON_HOME_NETSund das Mapping invlans.pyan die eigenen Subnetze anpassen.
/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.pyschreibt,app.pyliest nur (WAL).eve.jsonwird nie von der Web-Seite angefasst. - Alias-aware:
hosts.hostname(DHCP Option-12) + kuratiertealiases.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.
| 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) |
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:3001Alles ist via Env überschreibbar (config.py): NETMON_EVE, NETMON_DB,
NETMON_ALIASES, NETMON_HOME_NETS, NETMON_BIND, NETMON_PORT.
Siehe deploy/README.md — systemd-Units für Ingester und
Web, plus optionaler ARP-/Presence-/Watchdog-Dienste.
- 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.