Skip to main content
Every project has a Firewall tab: IP blocking, custom rules, rate limits, bot and AI crawler rulesets, OWASP core rules and attack mode (design: docs/platform/firewall.md). On Kubernetes the rules run in atoll-edge, the server image started in edge mode, next to Traefik in every cluster that serves apps. Traefik asks the edge about each request through a forwardAuth Middleware before the request reaches the app; atoll-server itself is not in the request path.

What gets installed

The chart installs it with features.firewall.enabled (the default) when the ingress controller is Traefik (ingress.controller: traefik). With another controller nothing is installed: web apps are then filtered by the server itself and Ktor apps are not filtered. Traefik needs its kubernetesCRD provider (on in deploy/selfhost/values/traefik.yaml.gotmpl). Its entry points trust no forwarded headers: whatever a client sends in X-Forwarded-For is dropped and Traefik sets the address it sees, which externalTrafficPolicy: Local keeps real. The edge reads the client IP from the first X-Forwarded-For entry. Keep it that way: a load balancer that SNATs makes every client look like a private address, which the edge counts as in-cluster traffic, so attack mode and bot protection would let it through. If you put a proxy or CDN in front of Traefik, add its addresses to forwardedHeaders.trustedIPs of both entry points. Requests the firewall stops (deny, challenge, rate limit, persistent block) never reach the app’s Service, so they don’t show up in the Traefik service metrics that billing and the Metrics tab read: mitigated traffic is not billed.

Settings

Server and edge settings (env): Plan limits (ATOLL_FIREWALL_MAX_RULES, ATOLL_FIREWALL_FREE_RULES, …) are listed under Limits in docs/platform/firewall.md.

Turning OWASP off

Set features.firewall.owasp.enabled: false (helmfile: firewall.owasp: false). The edge pods then run without the waf sidecar and projects’ OWASP settings have no effect; everything else keeps working. The local k3d rehearsal turns it off because the waf image isn’t built there.

Turning the firewall off

Set features.firewall.enabled: false. The server then stops adding the Middleware to Ingresses, but the ones it made before keep referencing it, and forwardAuth to a missing edge fails every request. So first remove the annotation traefik.ingress.kubernetes.io/router.middlewares from the Ingresses in atoll-apps and atoll-domains, then upgrade the release.

Region clusters

A region needs its own edge: install the chart in edge mode with the region’s kubeconfig. It installs only atoll-firewall and the rights the home server’s ServiceAccount there needs (features.firewall.regionServer, the one in the region’s kubeconfig, by default atoll-apps/atoll as in Regions). Set urls.appsDomain to the region’s apps domain (--set urls.appsDomain=...), so the edge recognizes preview hosts.
The region’s Traefik needs the kubernetesCRD provider as well. Until a region runs the edge, the server leaves the Ingresses there unfiltered (it looks for the atoll-edge Service once a minute) and the Firewall tab’s rules don’t apply to apps in that region. Each region generates its own challenge key; solved challenges don’t carry over between regions.

Geolocation

IP geolocation by DB-IP (db-ip.com). The edges download the free DB-IP Lite country and ASN databases (licensed under CC BY 4.0) into an emptyDir and refresh them monthly. Point features.firewall.geo.url at your own mirror if the edges can’t reach the internet, or turn geo off with features.firewall.geo.enabled: false: country, continent and ASN conditions then never match.

Troubleshooting