
Weboberfläche für die nftables-Firewall unter Linux, geschrieben in Go. Das Anwenden macht sich nach 120 Sekunden selbst rückgängig, sofern du es nicht bestätigst — du kannst dich also nicht aussperren. Debian- & Docker-Installation.
<p align="center">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/web/static/icon.svg" alt="" width="88" height="88">
</p>
<h1 align="center">easywall</h1>
<p align="center"><em>Deine Firewall. Deine Regeln. Keine Überraschungen.</em></p>
<!-- Ein Badge-Dienst, damit die Sammlung eine gemeinsame Form, Schriftart und
Logo-Behandlung teilt. Die drei Status-Badges lesen die Workflows über den
Namen aus; die Versions-, Lizenz- und Go-Badges lesen aus dem Repository
und der go.mod, sodass keines von ihnen so abdriften kann wie eine
handgeschriebene Versionsnummer. -->
<p align="center">
<a href="https://github.com/jp1337/easywall/actions/workflows/test.yml"><img src="https://img.shields.io/github/actions/workflow/status/jp1337/easywall/test.yml?branch=main&label=tests&logo=github&logoColor=white" alt="Tests"></a>
<a href="https://github.com/jp1337/easywall/actions/workflows/build.yml"><img src="https://img.shields.io/github/actions/workflow/status/jp1337/easywall/build.yml?branch=main&label=build&logo=github&logoColor=white" alt="Build"></a>
<a href="https://github.com/jp1337/easywall/actions/workflows/security.yml"><img src="https://img.shields.io/github/actions/workflow/status/jp1337/easywall/security.yml?branch=main&label=security&logo=github&logoColor=white" alt="Security"></a>
<a href="https://codecov.io/gh/jp1337/easywall"><img src="https://img.shields.io/codecov/c/github/jp1337/easywall?logo=codecov&logoColor=white&label=coverage" alt="Coverage"></a>
</p>
<p align="center">
<a href="https://github.com/jp1337/easywall/releases/latest"><img src="https://img.shields.io/github/v/release/jp1337/easywall?logo=github&logoColor=white&label=release" alt="Latest release"></a>
<a href="https://go.dev"><img src="https://img.shields.io/github/go-mod/go-version/jp1337/easywall?logo=go&logoColor=white&label=go" alt="Go version"></a>
<a href="https://www.gnu.org/licenses/gpl-3.0"><img src="https://img.shields.io/github/license/jp1337/easywall?logo=opensourceinitiative&logoColor=white&label=license&color=blue" alt="GPL-3.0"></a>
<a href="https://discord.gg/3zJMvChvUA"><img src="https://img.shields.io/badge/discord-join-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
<a href="https://ko-fi.com/jp1337"><img src="https://img.shields.io/badge/ko--fi-support-13C3FF?logo=kofi&logoColor=white" alt="Support on Ko-fi"></a>
</p>
<p align="center">
<a href="https://demo.easywall-project.org"><strong>Live-Demo</strong></a> ·
<a href="https://easywall-project.org"><strong>Dokumentation</strong></a> ·
<a href="https://github.com/jp1337/easywall/blob/main/CHANGELOG.md">Changelog</a>
</p>
nftables über eine Weboberfläche, die dich nicht aussperren kann: **Jede
Anwendung macht sich selbst rückgängig, solange du sie nicht bestätigst.**
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/img/screens/dashboard-dark.png">
<img src="https://assets.kitploit.com/production/public/readmes/43596/614cbeca6ebf752bf79ddc8d910eb14f46b45390f1cb5b8f53032578aed5fb40.png" alt="Das easywall-Dashboard: Firewall-Status mit Annahme-Status, ausstehenden Änderungen und letzter Anwendung; Kacheln mit Zählungen von TCP-Ports, UDP-Ports, Blocklist, Allowlist, benutzerdefinierten Regeln und Weiterleitung; sowie eine Liste der letzten Aktivitäten.">
</picture>
## Die Idee
Eine Regel zu bearbeiten ändert nichts. Sie anzuwenden ändert alles — für 120 Sekunden.
Wenn die neuen Regeln deine Verbindung kappen, kannst du nicht auf Bestätigen klicken,
und *nicht* zu bestätigen ist genau das, was die alten Regeln zurückbringt.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/diagrams/apply-flow-dark.svg">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/docs/assets/diagrams/apply-flow-light.svg" alt="Zustandsautomat: Bearbeiten führt zu Vorgemerkt, Anwenden führt zu Aktiv, Bestätigen innerhalb des Zeitfensters führt zu Bestätigt, und Ablaufenlassen des Zeitfensters führt zu Zurückgerollt, von wo aus die vorgemerkten Änderungen weiterhin verfügbar sind.">
</picture>
## Architektur
Zwei Prozesse. Der eine, der dem Netzwerk ausgesetzt ist, hält keine Privilegien,
die es sich zu stehlen lohnt.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/diagrams/architecture-dark.svg">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/docs/assets/diagrams/architecture-light.svg" alt="Der Browser spricht HTTPS mit easywall-web, das unprivilegiert läuft; easywall-web spricht typisiertes JSON über einen Unix-Socket mit easywall-core, das als root läuft und über netlink mit der nftables-Tabelle inet easywall spricht.">
</picture>
Eine vollständige Neufassung des ursprünglichen easywall — Python, Flask, `iptables`
über subprocess — das 2022 nach einer CVE archiviert wurde. Beide Ursachen sind
beseitigt: Die Privilegien liegen in einem anderen Prozess, und der Anwendungspfad
baut Go-Strukturen statt einer Kommandozeile. [So funktioniert es →](https://easywall-project.org/architecture/)
## Installation
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/diagrams/install-choice-dark.svg">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/docs/assets/diagrams/install-choice-light.svg" alt="Entscheidungsbaum: Nur mal reinschauen führt zum Demo-Modus; Debian oder Ubuntu führt zum .deb-Paket; bereits laufende Container führen zu Docker; andernfalls aus dem Quellcode bauen.">
</picture>
```bash
# Debian / Ubuntu — amd64 und arm64
ARCH=$(dpkg --print-architecture)
wget https://github.com/jp1337/easywall/releases/latest/download/easywall_$ARCH.deb
sudo dpkg -i easywall_$ARCH.deb && sudo apt-get install -f
# Docker
git clone https://github.com/jp1337/easywall.git && cd easywall && docker compose up -d
# Aus dem Quellcode — Go 1.27+, nftables
git clone https://github.com/jp1337/easywall.git && cd easywall
make build && sudo make install
sudo systemctl enable --now easywall-core easywall-web
```
Öffne dann `https://localhost:12227`. Der erste Besuch
[richtet das Konto ein und merkt die ersten Regeln vor](https://easywall-project.org/installation/first-run/).
## Was du bekommst
| | |
|---|---|
| **Ports** | TCP und UDP, einzeln oder als Bereich, mit SSH-Brute-Force-Routing pro Regel |
| **Blocklist & Allowlist** | IPv4, IPv6 und CIDR, ausgewertet vor jeder Portregel |
| **Schutzmodule** | Zwölf, fünf standardmäßig aktiv — Floods, Scans, Bogons, Fragmente, Broadcast/Multicast/Anycast |
| **Portweiterleitung** | NAT-Redirects mit Protokollauswahl |
| **Benutzerdefinierte Regeln** | Rohes nftables, vor der Anwendung auf Syntax geprüft |
| **Export / Import** | Der gesamte Regelsatz als JSON |
| **Audit-Log** | Was sich wann geändert hat, ein JSON-Objekt pro Zeile |
| **Docker-Koexistenz** | Besitzt `table inet easywall`, berührt nichts anderes |
| **Englisch, Deutsch, Französisch** | In der Oberfläche umschaltbar, auch vor der Anmeldung. Eine Sprache darf unvollständig sein: Fehlendes wird auf Englisch dargestellt, und die Lücke wird gemeldet statt verborgen |
| **Hell & dunkel** | Folgt dem Betriebssystem, mit manuellem Umschalter; beide auf Kontrast geprüft |
## Gebaut mit
| | |
|---|---|
| Go 1.27, einzelnes Binary | `go-chi/chi` · `html/template` |
| nftables über `google/nftables` | direktes netlink, kein `nft`-Subprozess |
| Argon2id | `golang.org/x/crypto`, 16-Byte-Salt pro Passwort |
| CSRF | `net/http.CrossOriginProtection`, Go 1.25 nativ |
| Designsystem | [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md) + Tailwind v4 — keine UI-Bibliothek von Drittanbietern |
| Schriften | Inter + JetBrains Mono, selbst gehostet, ~145 KB — funktioniert air-gapped |
| CI | `govulncheck`, `gosec`, CodeQL, `-race` und eine Integrationssuite gegen einen echten Kernel |
## Hilfe erhalten
| | |
|---|---|
| Eine Frage oder etwas, das sich nicht wie erwartet verhält | [Discord](https://discord.gg/3zJMvChvUA) |
| Ein Bug oder ein gewünschtes Feature | [GitHub-Issues](https://github.com/jp1337/easywall/issues) |
| Eine Sicherheitslücke | [Security Advisory](https://github.com/jp1337/easywall/security/advisories/new) — **nicht** Discord und kein öffentliches Issue |
## Mitwirken
Einrichtung, Commit-Konventionen und die Review-Checkliste: [CONTRIBUTING.md](https://github.com/jp1337/easywall/blob/main/CONTRIBUTING.md).
Alles Visuelle läuft zuerst über [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md).
Sicherheitsprobleme: **nicht** als öffentliches Issue — nutze
[GitHub Security Advisories](https://github.com/jp1337/easywall/security/advisories/new).
## Lizenz
GPL-3.0 — siehe [LICENSE](https://github.com/jp1337/easywall/blob/main/LICENSE).