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 withfeatures.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
Setfeatures.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
Setfeatures.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 onlyatoll-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.
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. Pointfeatures.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.