
Interface web pour le pare-feu nftables sous Linux, écrite en Go. La commande apply s'annule automatiquement après 120 secondes, sauf si vous la confirmez — vous ne pouvez pas vous verrouiller hors du système. Installation via Debian et 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>Votre pare-feu. Vos règles. Aucune surprise.</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>Démo en ligne</strong></a> ·
<a href="https://easywall-project.org"><strong>Documentation</strong></a> ·
<a href="https://github.com/jp1337/easywall/blob/main/CHANGELOG.md">Journal des modifications</a>
</p>
nftables via une interface web qui ne peut pas vous verrouiller dehors : **chaque
application s'annule d'elle-même tant que vous ne l'avez pas confirmée.**
<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="Le tableau de bord easywall : état du pare-feu avec statut d'acceptation, modifications en attente et dernière application ; des tuiles comptant les ports TCP, les ports UDP, la liste de blocage, la liste d'autorisation, les règles personnalisées et le transfert ; et une liste d'activité récente.">
</picture>
## L'idée
Modifier une règle ne change rien. L'appliquer change tout — pendant 120 secondes.
Si les nouvelles règles coupent votre connexion, vous ne pouvez pas cliquer sur
Confirmer, et c'est le fait de *ne pas* confirmer qui rétablit les anciennes règles.
<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="Machine à états : la modification mène à Préparé, l'application mène à Actif, la confirmation dans la fenêtre mène à Confirmé, et l'expiration de la fenêtre mène à Annulé, d'où les modifications préparées restent disponibles.">
</picture>
## Architecture
Deux processus. Celui exposé au réseau ne détient aucun privilège qui vaille la peine d'être volé.
<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="Le navigateur communique en HTTPS avec easywall-web, qui s'exécute sans privilèges ; easywall-web communique en JSON typé via un socket Unix avec easywall-core, qui s'exécute en root et parle netlink à la table nftables inet easywall.">
</picture>
Une réécriture complète de l'easywall d'origine — Python, Flask, `iptables` via
subprocess — qui a été archivé en 2022 après une CVE. Les deux causes profondes ont disparu :
les privilèges résident dans un processus différent, et le chemin d'application construit des
structs Go au lieu d'une ligne de commande. [Comment ça marche →](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="Arbre de décision : simple curiosité mène au mode démo ; Debian ou Ubuntu mène au paquet .deb ; conteneurs déjà en cours d'exécution mène à Docker ; sinon, compilation depuis les sources.">
</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
```
Ouvrez ensuite `https://localhost:12227`. La première visite
[configure le compte et prépare les premières règles](https://easywall-project.org/installation/first-run/).
## Ce que vous obtenez
| | |
|---|---|
| **Ports** | TCP et UDP, simple ou plage, avec routage anti-force brute SSH par règle |
| **Liste de blocage et liste d'autorisation** | IPv4, IPv6 et CIDR, évalués avant toute règle de port |
| **Modules de protection** | Douze, cinq activés par défaut — floods, scans, bogons, fragments, broadcast/multicast/anycast |
| **Redirection de ports** | Redirections NAT avec sélection du protocole |
| **Règles personnalisées** | nftables brut, vérifié syntaxiquement avant d'être appliqué |
| **Export / import** | L'ensemble des règles au format JSON |
| **Journal d'audit** | Ce qui a changé et quand, un objet JSON par ligne |
| **Coexistence Docker** | Possède `table inet easywall`, ne touche à rien d'autre |
| **Anglais, Deutsch, Français** | Modifiable dans l'interface, y compris avant la connexion. Une langue peut être partielle : ce qui manque s'affiche en anglais, et la lacune est signalée plutôt que masquée |
| **Clair et sombre** | Suit le système, avec un basculement manuel ; les deux sont vérifiés pour le contraste |
## Construit avec
| | |
|---|---|
| Go 1.27, binaire unique | `go-chi/chi` · `html/template` |
| nftables via `google/nftables` | netlink direct, pas de sous-processus `nft` |
| Argon2id | `golang.org/x/crypto`, sel de 16 octets par mot de passe |
| CSRF | `net/http.CrossOriginProtection`, natif Go 1.25 |
| Système de design | [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md) + Tailwind v4 — aucune bibliothèque UI tierce |
| Polices | Inter + JetBrains Mono, auto-hébergées, ~145 KB — fonctionne hors ligne |
| CI | `govulncheck`, `gosec`, CodeQL, `-race`, et une suite d'intégration contre un vrai noyau |
## Obtenir de l'aide
| | |
|---|---|
| Une question, ou quelque chose qui ne se comporte pas comme prévu | [Discord](https://discord.gg/3zJMvChvUA) |
| Un bug, ou une fonctionnalité souhaitée | [GitHub issues](https://github.com/jp1337/easywall/issues) |
| Une vulnérabilité de sécurité | [Security advisory](https://github.com/jp1337/easywall/security/advisories/new) — **pas** Discord, et pas un ticket public |
## Contribuer
Configuration, conventions de commit et liste de vérification pour la revue : [CONTRIBUTING.md](https://github.com/jp1337/easywall/blob/main/CONTRIBUTING.md).
Tout ce qui est visuel passe d'abord par [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md).
Problèmes de sécurité : **pas** en tant que ticket public — utilisez les
[GitHub Security Advisories](https://github.com/jp1337/easywall/security/advisories/new).
## Licence
GPL-3.0 — voir [LICENSE](https://github.com/jp1337/easywall/blob/main/LICENSE).