Architettura
Singolo binario, zero CGO, memoria limitata (LRU + istogramma). Per le firme dei pacchetti e gli esempi di importazione, consulta API / Pacchetti. Per aggiungere una funzionalita, consulta Contribuire.
Flusso dei dati
Sources Reader Parser
────────── ────── ──────
file / glob ─┐
stdin - ├─▶ reader.FromSource(follow) ─▶ parser.Parse(line) ─┐
docker:// ───┤ fan-in + rotation │
k8s:// ──────┤ stdout+stderr merge ▼
journalctl ──┘ ┌─────────────────┐
│ analysis.Engine │
│ ├─ MatchEntry() │◀── types.Filters (--from, --ip, --country, --grep, --level…)
│ ├─ Enrich ───────▶ enrich.GeoIP.Lookup(ip) → Country/ASN (LRU 50K, TTL 24h)
│ ├─ Detect ───────▶ analysis.Detector (26 cats, dual-pass, MITRE)
│ └─ Stats (TopN, histogram 1K buckets, human/bot) │
└────────┬────────┘
│
┌────────────────────────┼────────────────────────┐
│ │ │
output.Report tui.Model (watch) guard.Guard
table/json/csv/html 9 tabs, 2s tick ├─ Evaluate(entry) ──▶ blocklist.Manager.Contains(ip) → immediate
├─ enrich.GeoIP ──▶ country-block → immediate
├─ sliding window (per-sec buckets) → Tick()
├─ firewall.Backend (auto → hybrid/iptables/docker/nftables)
└─ audit + state (JSONL + blocked.json)
Pacchetti — dove risiedono i concetti
| Concetto letto altrove | Pacchetto | Collegamento |
|---|---|---|
| “Caddy JSON → LogEntry” | pkg/parser | API → parser |
| “Paese/asn principale, cache GeoIP” | pkg/enrich | API → enrich |
| “26 categorie, MITRE, Sigma” | pkg/analysis | API → analysis, Rilevamento |
| “8 feed, trie CIDR, cache 7g” | pkg/blocklist | API → blocklist |
| “finestra scorrevole, audit, stato” | pkg/guard + guard/firewall | API → guard |
| “file/docker/k8s/journalctl” | pkg/reader | API → reader |
| “table/html/json” | pkg/output | API → output |
| “dashboard live” | pkg/tui | TUI e report |
Limiti di memoria
MaxCardinality 100k per contatore, LRU IP da 100k, istogramma da 1000 bucket (log10, 1µs–10s), LRU GeoIP da 50k. Nessuna mappa senza limiti.
Flusso degli IP del server in guard
cmd/guard.go chiama guard.DetectSelfIPs(ctx) prima di costruire guard, salvo --protect-self=false. Gli IP delle interfacce e il rilevamento HTTPS diretto inizializzano Config.SelfIPs; Config.SelfIPLookup abilita l'aggiornamento ogni 30 secondi in Run e prima dei nuovi ban nel percorso condiviso block.
Il confronto esclude anche le subnet candidate che contengono un IP proprio. Il recupero dello stato non ricrea ban protetti; la pulizia rimuove regole/stato tracciati e riprova le rimozioni fallite. Un errore di rilevamento conserva gli indirizzi precedenti ma impedisce nuovi ban. Il rilevamento è sincrono e limitato da timeout; non ricava mai IP fidati dai log di accesso o dagli header inoltrati.
Flusso di configurazione
caddy-analyzer.json (locale → globale) → PersistentPreRunE applyTuning() → override dei flag CLI. Guard aggiunge l'unione di whitelist + --never-block. Consulta Configurazione.
pkg/analysis/detect.go), un feed (pkg/blocklist) o un backend firewall (pkg/guard/firewall).