Use this checklist when deploying PacketYeeter into production-like environments.
- Build and deploy the analyzer first.
- Start the analyzer with
-dry-runso detections update logs and metrics without sending BLOCK commands. - Deploy one collector on a canary host with conservative thresholds and explicit allowlists for trusted networks.
- Review structured logs, Prometheus metrics, and
yeetctl list. - Tune thresholds and allowlists, then expand to a small host batch.
- Disable dry-run only after canary behavior is understood.
Default listeners are convenient for labs but should be deliberately bound in production.
| Component | Listener | Default | Guidance |
|---|---|---|---|
| Analyzer gRPC | -listen-addr |
0.0.0.0:9090 |
Expose only to collectors over trusted networks or firewall rules. |
| Analyzer metrics | -metrics-addr |
:9091 |
Bind to loopback/management networks or restrict with firewall/VPN. |
| Analyzer inspector | -inspect-addr |
127.0.0.1:9092 |
Keep loopback unless placed behind trusted access controls. |
| Analyzer pprof | -pprof-addr |
:6060 when enabled |
Enable only temporarily for diagnostics and bind securely. |
| Collector metrics | -metrics-addr |
:2112 |
Scrape from Prometheus over a trusted network. |
| Collector management | -socket |
/var/run/packetyeeter-collector.sock |
Keep local and permission-restricted. |
| HAProxy peer/SPOE | -haproxy-port, -spoe-port |
8765, 9876 |
Expose only to trusted HAProxy peers. |
The analyzer is userspace-only and can run with normal hardening such as NoNewPrivileges=true, ProtectSystem=strict, ProtectHome=true, and a narrow ReadWritePaths=/var/lib/packetyeeter.
The collector is intentionally less restricted because it loads eBPF, attaches XDP/TC programs, opens raw/network resources, and uses pinned kernel maps. It needs BPF/network capabilities and LimitMEMLOCK=infinity. Avoid adding hardening directives that hide devices, remove BPF capabilities, block network address families, or prevent kernel map/program access unless validated on the target kernel.
- Begin with analyzer
-dry-run. - Keep
-enable-high-cardinality-metrics=falseduring normal operations; turn it on only for short diagnostic windows. - Set allowlists for monitoring systems, load balancers, bastion hosts, health checks, and upstream trusted proxies.
- Watch
packetyeeter_*_blocks_total, reputation scores, AI detections, SPOE queue depth/drops, and collector/analyzer logs before enabling enforcement. - Treat UDP reflection campaign labels as observability metadata. The analyzer can distinguish common vectors such as DNS, NTP, SSDP, CLDAP, Memcached, and QUIC Initial only when existing signal metadata carries useful port or protocol hints; ambiguous UDP campaigns remain labeled
udp_flood. - Treat adaptive campaign baselines as rollout context, not enforcement. During analyzer startup or a new service/vector mix,
baseline_enough_samples=falsemeans the EWMA is still warming up; comparebaseline_current_rate,baseline_rate, andbaseline_multiplieronly after enough samples have accumulated for that service key. - The adaptive baseline caps how fast it can rise per observation (
MaxGrowthPerObservation, default 1.5x) to resist slow-ramp attacks that try to normalize themselves into the baseline; if legitimate traffic grows unusually fast, the baseline may lag for a few observation cycles before catching up. Seedocs/observability.mdfor details and tuning guidance. - Campaign/carpet-bombing detections now penalize reputation (representative sample IP/ASN, scaled by campaign severity) the same way regular detections do, instead of bypassing reputation entirely - repeated campaign involvement from the same source/ASN accumulates over time. This does not change
WouldBlock/enforcement behavior for campaigns; they remain observe-only. - Roll back by re-enabling dry-run or stopping collectors before changing eBPF-related systemd hardening.
Use this workflow when campaign metrics or logs indicate a possible L3/L4 DDoS. Campaign and carpet-bombing detections are observe-only aggregate signals; they help operators understand blast radius and vector mix, but do not create block commands on their own.
- Confirm analyzer health and visibility. Check collector connectivity, signal
queue pressure,
packetyeeter_active_attack_campaigns, and recentattack_campaign_observedlogs. If queues are dropping, treat the data as incomplete until backpressure is resolved. - Identify the dominant vector with
sum by (vector) (rate(packetyeeter_attack_campaign_detections_total[5m])). Interpret specific UDP labels as hints from existing port/protocol metadata:dns_reflection,ntp_reflection,ssdp_reflection,cldap_reflection,memcached_reflection, andquic_initial_floodare more specific than the fallbackudp_flood. - Triage carpet-bombing breadth with
packetyeeter_carpet_bombing_detections_total{reason=...}and the matching logs. Destination-subnet breadth usually points to distributed target selection; destination-port breadth may indicate service discovery or multi-service pressure; source breadth indicates distributed origin volume. - Compare the current campaign to adaptive service baselines. Ignore
enough_samples="false"for enforcement decisions because the service key is still warming up. Once enough samples exist, use the p95 baseline multiplier andpacketyeeter_campaign_baseline_rateto decide whether the campaign is unusual for that protocol/port bucket/vector. - Keep enforcement staged. Start or return to analyzer
-dry-run, add or verify allowlists for health checks, trusted proxies, monitoring, and upstream providers, then canary enforcement on one collector before widening rollout. - Document the vector, affected services, baseline state, actions taken, and whether any block commands came from per-source detection paths rather than observe-only campaign aggregation.
An example scrape configuration is available in examples/prometheus-scrape.yml. Adjust target hostnames and ports to match your deployment and keep scrape access on a trusted network.
Example alert rules for modern DDoS observations are available in
examples/prometheus-alerts.yml.