Your firewall. Your rules. No surprises.
Live demo · Documentation · Changelog
nftables through a web interface that cannot lock you out: every apply reverts itself unless you confirm it.
Editing a rule changes nothing. Applying it changes everything — for 120 seconds. If the new rules cut your connection you cannot click Confirm, and not confirming is what brings the old rules back.
Two processes. The one exposed to the network holds no privilege worth stealing.
A complete rewrite of the original easywall — Python, Flask, iptables via
subprocess — which was archived in 2022 after a CVE. Both root causes are gone:
the privileges live in a different process, and the apply path builds Go structs
instead of a command line. How it works →
# Debian / Ubuntu
wget https://github.com/jp1337/easywall/releases/latest/download/easywall_amd64.deb
sudo dpkg -i easywall_amd64.deb && sudo apt-get install -f
# Docker
git clone https://github.com/jp1337/easywall.git && cd easywall && docker compose up -d
# From source — Go 1.25+, nftables
git clone https://github.com/jp1337/easywall.git && cd easywall
make build && sudo make install
sudo systemctl enable --now easywall-core easywall-webThen open https://localhost:12227. The first visit runs the setup wizard.
| Ports | TCP and UDP, single or range, with per-rule SSH brute-force routing |
| Blacklist & whitelist | IPv4, IPv6 and CIDR, evaluated before any port rule |
| Protection modules | Nine, four on by default — floods, scans, bogons, fragments |
| Port forwarding | NAT redirects with protocol selection |
| Custom rules | Raw nftables, syntax-checked before it is applied |
| Export / import | The whole rule set as JSON |
| Audit log | Who changed what, when |
| Docker coexistence | Owns table inet easywall, touches nothing else |
| English & German | Switchable in the interface, including before sign-in |
| Light & dark | Follows the OS, with a manual toggle; both contrast-checked |
| Go 1.25, single binary | go-chi/chi · html/template |
nftables via google/nftables |
direct netlink, no nft subprocess |
| Argon2id | golang.org/x/crypto, 16-byte salt per password |
| CSRF | net/http.CrossOriginProtection, Go 1.25 native |
| Design system | DESIGN.md + Tailwind v4 — no third-party UI library |
| Fonts | Inter + JetBrains Mono, self-hosted, ~145 KB — works air-gapped |
| CI | govulncheck, gosec, CodeQL, 90% web coverage |
| 2FA / TOTP | Second factor for the web interface |
| Let's Encrypt ACME | Certificates without a reverse proxy |
| Audit log for logins | Authentication events are not recorded yet |
| REST API | For Ansible and automation |
Setup, commit conventions and the review checklist: CONTRIBUTING.md.
Anything visual goes through DESIGN.md first.
Security issues: not as a public issue — use GitHub Security Advisories.
GPL-3.0 — see LICENSE.