
Interfaz web para el cortafuegos nftables en Linux, escrita en Go. Los cambios aplicados se revierten automáticamente después de 120 segundos a menos que los confirmes — es imposible quedarse sin acceso. Instalación para Debian y 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>Tu firewall. Tus reglas. Sin sorpresas.</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 en vivo</strong></a> ·
<a href="https://easywall-project.org"><strong>Documentación</strong></a> ·
<a href="https://github.com/jp1337/easywall/blob/main/CHANGELOG.md">Registro de cambios</a>
</p>
nftables a través de una interfaz web que no puede dejarte fuera: **cada aplicación se revierte a sí misma a menos que la confirmes.**
<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="El panel de easywall: estado del firewall con estado de aceptación, cambios pendientes y última aplicación; mosaicos que cuentan puertos TCP, puertos UDP, lista de bloqueo, lista de permitidos, reglas personalizadas y reenvío; y una lista de actividad reciente.">
</picture>
## La idea
Editar una regla no cambia nada. Aplicarla lo cambia todo — durante 120 segundos.
Si las nuevas reglas cortan tu conexión no puedes hacer clic en Confirmar, y *no* confirmar
es lo que devuelve las reglas antiguas.
<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="Máquina de estados: editar lleva a Preparado, aplicar lleva a Activo, confirmar dentro de la ventana lleva a Confirmado, y dejar que la ventana expire lleva a Revertido, desde donde las ediciones preparadas siguen disponibles.">
</picture>
## Arquitectura
Dos procesos. El que está expuesto a la red no tiene ningún privilegio que merezca la pena robar.
<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="El navegador habla HTTPS con easywall-web, que se ejecuta sin privilegios; easywall-web habla JSON tipado a través de un socket Unix con easywall-core, que se ejecuta como root y habla netlink con la tabla nftables inet easywall.">
</picture>
Una reescritura completa del easywall original — Python, Flask, `iptables` vía
subprocess — que fue archivado en 2022 tras un CVE. Ambas causas raíz han desaparecido:
los privilegios viven en un proceso diferente, y la ruta de aplicación construye structs de Go
en lugar de una línea de comandos. [Cómo funciona →](https://easywall-project.org/architecture/)
## Instalación
<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="Árbol de decisión: solo echar un vistazo lleva al modo demo; Debian o Ubuntu lleva al paquete .deb; ya ejecutar contenedores lleva a Docker; en caso contrario, compilar desde el código fuente.">
</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
```
Luego abre `https://localhost:12227`. La primera visita
[configura la cuenta y prepara las primeras reglas](https://easywall-project.org/installation/first-run/).
## Lo que obtienes
| | |
|---|---|
| **Puertos** | TCP y UDP, individual o rango, con enrutamiento de fuerza bruta SSH por regla |
| **Lista de bloqueo y lista de permitidos** | IPv4, IPv6 y CIDR, evaluadas antes de cualquier regla de puerto |
| **Módulos de protección** | Doce, cinco activados por defecto — inundaciones, escaneos, bogons, fragmentos, broadcast/multicast/anycast |
| **Reenvío de puertos** | Redirecciones NAT con selección de protocolo |
| **Reglas personalizadas** | nftables en bruto, con comprobación de sintaxis antes de aplicarse |
| **Exportar / importar** | Todo el conjunto de reglas como JSON |
| **Registro de auditoría** | Qué cambió y cuándo, un objeto JSON por línea |
| **Coexistencia con Docker** | Posee `table inet easywall`, no toca nada más |
| **Inglés, Deutsch, Français** | Conmutable en la interfaz, incluso antes de iniciar sesión. Un idioma puede estar parcialmente traducido: lo que falte se muestra en inglés, y la carencia se informa en lugar de ocultarse |
| **Claro y oscuro** | Sigue al sistema operativo, con un conmutador manual; ambos con contraste verificado |
## Construido con
| | |
|---|---|
| Go 1.27, binario único | `go-chi/chi` · `html/template` |
| nftables vía `google/nftables` | netlink directo, sin subprocess `nft` |
| Argon2id | `golang.org/x/crypto`, salt de 16 bytes por contraseña |
| CSRF | `net/http.CrossOriginProtection`, nativo de Go 1.25 |
| Sistema de diseño | [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md) + Tailwind v4 — sin biblioteca de UI de terceros |
| Fuentes | Inter + JetBrains Mono, autoalojadas, ~145 KB — funciona sin conexión |
| CI | `govulncheck`, `gosec`, CodeQL, `-race`, y una suite de integración contra un kernel real |
## Obtener ayuda
| | |
|---|---|
| Una pregunta, o algo que no funciona | [Discord](https://discord.gg/3zJMvChvUA) |
| Un error, o una función que quieres | [GitHub issues](https://github.com/jp1337/easywall/issues) |
| Una vulnerabilidad de seguridad | [Aviso de seguridad](https://github.com/jp1337/easywall/security/advisories/new) — **no** Discord, y no un issue público |
## Contribuir
Configuración, convenciones de commits y la lista de comprobación de revisión: [CONTRIBUTING.md](https://github.com/jp1337/easywall/blob/main/CONTRIBUTING.md).
Cualquier cosa visual pasa primero por [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md).
Problemas de seguridad: **no** como issue público — usa
[GitHub Security Advisories](https://github.com/jp1337/easywall/security/advisories/new).
## Licencia
GPL-3.0 — consulta [LICENSE](https://github.com/jp1337/easywall/blob/main/LICENSE).