v0.8.1 · aggiornata · GitHub

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 altrovePacchettoCollegamento
“Caddy JSON → LogEntry”pkg/parserAPI → parser
“Paese/asn principale, cache GeoIP”pkg/enrichAPI → enrich
“26 categorie, MITRE, Sigma”pkg/analysisAPI → analysis, Rilevamento
“8 feed, trie CIDR, cache 7g”pkg/blocklistAPI → blocklist
“finestra scorrevole, audit, stato”pkg/guard + guard/firewallAPI → guard
“file/docker/k8s/journalctl”pkg/readerAPI → reader
“table/html/json”pkg/outputAPI → output
“dashboard live”pkg/tuiTUI 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.

Vedi anche
API / Pacchetti — importazione e uso per pacchetto. Contribuire — dove aggiungere un rilevamento (pkg/analysis/detect.go), un feed (pkg/blocklist) o un backend firewall (pkg/guard/firewall).