
Interfaccia web per il firewall nftables su Linux, scritta in Go. L'applicazione si annulla da sola dopo 120 secondi a meno che non la confermi: non puoi rimanere bloccato fuori. Installazione Debian e Docker.
<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>Il tuo firewall. Le tue regole. Nessuna sorpresa.</em></p>
<!-- One badge service, so the set shares a shape, a typeface and a logo
treatment. The three status badges read from the workflows by name; the
version, licence and Go badges read from the repository and go.mod, so
none of them can drift the way a hand-written version number could. -->
<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>Demo live</strong></a> ·
<a href="https://easywall-project.org"><strong>Documentazione</strong></a> ·
<a href="https://github.com/jp1337/easywall/blob/main/CHANGELOG.md">Changelog</a>
</p>
nftables attraverso un'interfaccia web che non può chiuderti fuori: **ogni applicazione si annulla da sola a meno che tu non la confermi.**
<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="La dashboard di easywall: stato del firewall con stato di accettazione, modifiche in sospeso e ultima applicazione; riquadri che contano porte TCP, porte UDP, blocklist, allowlist, regole personalizzate e forwarding; e un elenco delle attività recenti.">
</picture>
## L'idea
Modificare una regola non cambia nulla. Applicarla cambia tutto — per 120 secondi.
Se le nuove regole interrompono la tua connessione non puoi fare clic su Conferma, e *non*
confermare è ciò che ripristina le vecchie regole.
<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="Macchina a stati: la modifica porta a In attesa, l'applicazione porta ad Attivo, la conferma entro la finestra porta a Confermato, e lasciar scadere la finestra porta a Ripristinato, da dove le modifiche in attesa sono ancora disponibili.">
</picture>
## Architettura
Due processi. Quello esposto alla rete non detiene alcun privilegio che valga la pena rubare.
<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="Il browser comunica in HTTPS con easywall-web, che viene eseguito senza privilegi; easywall-web comunica JSON tipizzato tramite un socket Unix con easywall-core, che viene eseguito come root e parla netlink con la tabella nftables inet easywall.">
</picture>
Una riscrittura completa dell'originale easywall — Python, Flask, `iptables` via
subprocess — che è stato archiviato nel 2022 dopo una CVE. Entrambe le cause profonde sono state eliminate:
i privilegi risiedono in un processo diverso, e il percorso di applicazione costruisce struct Go
invece di una riga di comando. [Come funziona →](https://easywall-project.org/architecture/)
## Installazione
<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="Albero decisionale: se vuoi solo dare un'occhiata vai alla modalità demo; Debian o Ubuntu portano al pacchetto .deb; se hai già container in esecuzione vai a Docker; altrimenti compila dai sorgenti.">
</picture>
```bash
# Debian / Ubuntu — amd64 and 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
# From source — 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
```
Poi apri `https://localhost:12227`. La prima visita
[configura l'account e prepara le prime regole](https://easywall-project.org/installation/first-run/).
## Cosa ottieni
| | |
|---|---|
| **Porte** | TCP e UDP, singole o intervalli, con instradamento brute-force SSH per regola |
| **Blocklist e allowlist** | IPv4, IPv6 e CIDR, valutate prima di qualsiasi regola di porta |
| **Moduli di protezione** | Dodici, cinque attivi per impostazione predefinita — flood, scansioni, bogon, frammenti, broadcast/multicast/anycast |
| **Port forwarding** | Reindirizzamenti NAT con selezione del protocollo |
| **Regole personalizzate** | nftables grezzo, con controllo di sintassi prima dell'applicazione |
| **Esportazione / importazione** | L'intero set di regole in JSON |
| **Registro di controllo** | Cosa è cambiato e quando, un oggetto JSON per riga |
| **Coesistenza con Docker** | Possiede `table inet easywall`, non tocca nient'altro |
| **Inglese, Deutsch, Français** | Selezionabile nell'interfaccia, anche prima dell'accesso. Una lingua può essere parziale: ciò che manca viene mostrato in inglese, e la lacuna viene segnalata invece che nascosta |
| **Chiaro e scuro** | Segue il sistema operativo, con un interruttore manuale; entrambi verificati per il contrasto |
## Costruito con
| | |
|---|---|
| Go 1.27, binario singolo | `go-chi/chi` · `html/template` |
| nftables via `google/nftables` | netlink diretto, nessun subprocess `nft` |
| Argon2id | `golang.org/x/crypto`, salt di 16 byte per password |
| CSRF | `net/http.CrossOriginProtection`, nativo di Go 1.25 |
| Design system | [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md) + Tailwind v4 — nessuna libreria UI di terze parti |
| Font | Inter + JetBrains Mono, self-hosted, ~145 KB — funziona in ambienti air-gapped |
| CI | `govulncheck`, `gosec`, CodeQL, `-race`, e una suite di integrazione su un kernel reale |
## Ottenere aiuto
| | |
|---|---|
| Una domanda, o qualcosa che non funziona | [Discord](https://discord.gg/3zJMvChvUA) |
| Un bug, o una funzionalità che desideri | [GitHub issues](https://github.com/jp1337/easywall/issues) |
| Una vulnerabilità di sicurezza | [Security advisory](https://github.com/jp1337/easywall/security/advisories/new) — **non** su Discord, e non come issue pubblica |
## Contribuire
Configurazione, convenzioni di commit e checklist di revisione: [CONTRIBUTING.md](https://github.com/jp1337/easywall/blob/main/CONTRIBUTING.md).
Qualsiasi cosa visiva passa prima da [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md).
Problemi di sicurezza: **non** come issue pubblica — usa
[GitHub Security Advisories](https://github.com/jp1337/easywall/security/advisories/new).
## Licenza
GPL-3.0 — vedi [LICENSE](https://github.com/jp1337/easywall/blob/main/LICENSE).