
Веб-интерфейс для межсетевого экрана nftables в Linux, написанный на Go. Применение автоматически откатывается через 120 секунд, если вы не подтвердите его — вы не сможете заблокировать себе доступ. Установка на Debian и 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>Ваш фаервол. Ваши правила. Без сюрпризов.</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>Живое демо</strong></a> ·
<a href="https://easywall-project.org"><strong>Документация</strong></a> ·
<a href="https://github.com/jp1337/easywall/blob/main/CHANGELOG.md">Список изменений</a>
</p>
nftables через веб-интерфейс, который не может заблокировать вам доступ: **каждое применение откатывается само, если вы его не подтвердите.**
<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="Панель управления easywall: состояние фаервола с состоянием подтверждения, ожидающие изменения и последнее применение; плитки с подсчётом TCP-портов, UDP-портов, блок-листа, разрешённого списка, пользовательских правил и перенаправления; а также список последних действий.">
</picture>
## Идея
Редактирование правила ничего не меняет. Его применение меняет всё — на 120 секунд.
Если новые правила оборвут ваше соединение, вы не сможете нажать «Подтвердить», а
*не*подтверждение — это именно то, что возвращает старые правила.
<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="Конечный автомат: редактирование приводит к состоянию «Подготовлено», применение — к состоянию «Активно», подтверждение в течение окна — к состоянию «Подтверждено», а истечение окна — к состоянию «Откачено», откуда подготовленные изменения по-прежнему доступны.">
</picture>
## Архитектура
Два процесса. Тот, что открыт в сеть, не обладает привилегиями, которые стоило бы украсть.
<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="Браузер общается по HTTPS с easywall-web, который работает без привилегий; easywall-web общается типизированным JSON через Unix-сокет с easywall-core, который работает от root и общается через netlink с таблицей nftables inet easywall.">
</picture>
Полная переработка оригинального easywall — Python, Flask, `iptables` через
subprocess — который был заархивирован в 2022 году после CVE. Обе первопричины устранены:
привилегии находятся в другом процессе, а путь применения строит структуры Go,
а не командную строку. [Как это работает →](https://easywall-project.org/architecture/)
## Установка
<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="Дерево решений: просто посмотреть — ведёт к демо-режиму; Debian или Ubuntu — к пакету .deb; уже запущенные контейнеры — к Docker; в остальных случаях — сборка из исходников.">
</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
```
Затем откройте `https://localhost:12227`. Первый визит
[настраивает учётную запись и подготавливает первые правила](https://easywall-project.org/installation/first-run/).
## Что вы получаете
| | |
|---|---|
| **Порты** | TCP и UDP, отдельные или диапазон, с маршрутизацией SSH brute-force для каждого правила |
| **Блок-лист и разрешённый список** | IPv4, IPv6 и CIDR, проверяются до любого правила порта |
| **Модули защиты** | Двенадцать, пять включены по умолчанию — флуды, сканирования, bogon-адреса, фрагменты, broadcast/multicast/anycast |
| **Перенаправление портов** | NAT-редиректы с выбором протокола |
| **Пользовательские правила** | Сырой nftables, проверяется на синтаксис перед применением |
| **Экспорт / импорт** | Весь набор правил в виде JSON |
| **Журнал аудита** | Что изменилось и когда, один JSON-объект на строку |
| **Сосуществование с Docker** | Владеет `table inet easywall`, не трогает ничего другого |
| **English, Deutsch, Français** | Переключается в интерфейсе, в том числе до входа. Язык может быть частичным: то, чего в нём не хватает, отображается на английском, а пробел сообщается, а не скрывается |
| **Светлая и тёмная темы** | Следует за ОС, с ручным переключателем; обе проверены на контраст |
## Создано с помощью
| | |
|---|---|
| Go 1.27, единый бинарник | `go-chi/chi` · `html/template` |
| nftables через `google/nftables` | напрямую netlink, без subprocess `nft` |
| Argon2id | `golang.org/x/crypto`, 16-байтовая соль на каждый пароль |
| CSRF | `net/http.CrossOriginProtection`, нативный в Go 1.25 |
| Система дизайна | [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md) + Tailwind v4 — без сторонних UI-библиотек |
| Шрифты | Inter + JetBrains Mono, self-hosted, ~145 КБ — работает в изолированной сети |
| CI | `govulncheck`, `gosec`, CodeQL, `-race` и набор интеграционных тестов на реальном ядре |
## Получение помощи
| | |
|---|---|
| Вопрос или что-то работает не так | [Discord](https://discord.gg/3zJMvChvUA) |
| Баг или нужная вам функция | [GitHub issues](https://github.com/jp1337/easywall/issues) |
| Уязвимость безопасности | [Security advisory](https://github.com/jp1337/easywall/security/advisories/new) — **не** Discord и не публичный issue |
## Участие в разработке
Настройка, соглашения о коммитах и чек-лист ревью: [CONTRIBUTING.md](https://github.com/jp1337/easywall/blob/main/CONTRIBUTING.md).
Всё визуальное сначала проходит через [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md).
Проблемы безопасности: **не** как публичный issue — используйте
[GitHub Security Advisories](https://github.com/jp1337/easywall/security/advisories/new).
## Лицензия
GPL-3.0 — см. [LICENSE](https://github.com/jp1337/easywall/blob/main/LICENSE).