Сентябрь 2026, версия 1.4.2. Проект открыт под Apache-2.0: github.com/sbezpalov/easy-waf.
У любого, кто всерьёз занимается умным домом, рано или поздно появляется зоопарк веб-интерфейсов: Home Assistant, Frigate, Nextcloud, Node-RED, Grafana, веб-морда АТС, NAS. И рано или поздно хочется открыть это наружу — посмотреть камеры из командировки, получить push от Home Assistant, дать семье доступ к фотоархиву.
Дальше обычно два пути. Первый — пробросить на роутере десяток портов и надеяться, что встроенная авторизация каждого приложения выдержит интернет. Второй — поднять reverse proxy, и через неделю обнаружить себя в роли администратора HAProxy: сертификаты, ACL, rate limit, списки блокировок, бот-трафик, откат после неудачной правки. На работе это делает команда с change management. Дома — вы, вечером, без бэкапа конфига.
Я прошёл оба пути и в итоге собрал третий: Easy Home WAF — appliance, который превращает «открыть сервис наружу» в заполнение формы в веб-панели. Сегодня открыл репозиторий. Ниже — что это, как устроено и где имеет смысл.
Что это такое
Easy Home WAF — self-hosted WAF и защищённый reverse proxy на базе HAProxy. Одна виртуальная машина на Ubuntu 24.04, наружу смотрят два порта (80/443), за ней — все ваши сервисы в LAN.
Ключевая идея: конфиг HAProxy никто не правит руками. У каждого опубликованного приложения есть имя хоста, backend и профиль безопасности. Всё хранится в PostgreSQL, из базы рендерится haproxy.cfg, проверяется через haproxy -c, перечитывается — и каждая такая операция сохраняется как ревизия, к которой можно откатиться.
Что даёт из коробки:
- Слои защиты на каждое приложение, переключаемые по хосту: rate limiting, базовые WAF-правила (SQLi/XSS/traversal), CrowdSec через SPOE, блок- и allow-листы IP с внешними фидами, GeoIP по странам, блокировка ботов по User-Agent, фильтр методов и путей, пути «только из LAN».
- Сертификаты без церемоний: ACME HTTP-01 и DNS-01 (Cloudflare, CloudNS, Route53, webhook), автопродление, проверка TLS у HTTPS-бэкендов.
- Управление самим хостом из той же панели: сеть и nftables с откатом по таймеру, обновления системы с живым логом, сервисы, journal, локальные учётки.
- Эксплуатация: аудит привилегированных действий,
easy-waf-admin doctorдля диагностики, backup/restore одной командой.
Профили вместо ручных ACL
Самое полезное на практике — профили. Вместо того чтобы для каждого сервиса вспоминать, какой таймаут нужен WebSocket-у и какие пути сканеры дёргают первыми, выбираете профиль:
| Профиль | RPS / burst | Таймаут сервера | Для чего |
|---|---|---|---|
balanced |
50 / 100 | 50 с | типовые домашние приложения |
strict |
20 / 40 | 30 с | всё, что реально торчит в интернет |
public-app |
30 / 60 | 60 с | публичный сервис общего вида |
home-assistant |
40 / 80 | 3600 с | долгоживущие WebSocket/SSE |
trusted-lan |
200 / 400 | 120 с | высокое доверие, в основном LAN |
Поверх профиля — пресеты режимов: Full protection (всё включено, включая GeoIP, профиль strict), Balanced (всё, кроме GeoIP), Trusted LAN и Reverse proxy only. Последний выключает вообще всю защиту и оставляет только маршрутизацию и TLS — он для отладки, в продакшене ему не место.
Отдельно отмечу профиль home-assistant: часовой таймаут сервера — не прихоть. С дефолтными 30–50 секундами WebSocket-соединение Home Assistant будет рваться, и вы потратите вечер на поиск причины «почему отваливается приложение на телефоне».
Как устроено
cmd/easy-waf-api/ Management API + встроенный UI, рендер и apply HAProxy
cmd/easy-waf-acmed/ ACME-воркер (Lego)
cmd/easy-waf-hostd/ root-брокер: разрешённые привилегированные операции
cmd/easy-waf-admin/ CLI: диагностика, enrollment, аварийное восстановление
Всё на Go, PostgreSQL — единый source of truth. Рядом на той же машине — HAProxy, CrowdSec (агент, LAPI и SPOA-bouncer), fail2ban, nftables.
Типовая топология — NGFW → WAF → бэкенды. На границе стоит ваш роутер или межсетевой экран (MikroTik, FortiGate — что угодно), он пробрасывает 80/443 на appliance. Easy Home WAF терминирует TLS, маршрутизирует по имени хоста, прогоняет запрос через CrowdSec и ACL и отдаёт его Home Assistant, Frigate, веб-интерфейсу 3CX или Synology. Панель управления (HTTPS 8443) наружу не пробрасывается — только LAN, VPN или SSH-туннель; nftables по умолчанию пускает на неё только loopback и RFC1918.
Модель безопасности: исходим из того, что взломают
Это устройство терминирует TLS на границе сети, поэтому проектировалось в предположении, что часть компонентов будут атаковать и однажды один из них проиграет.
- API работает без привилегий (
NoNewPrivileges,ProtectSystem=strict). Всё, что требует root, идёт черезeasy-waf-hostd— брокер на unix-сокете, который проверяет вызывающего черезSO_PEERCRED, принимает только разрешённые опкоды и заново валидирует каждый аргумент. Скомпрометированный API в модели угроз учтён явно. - Пароля по умолчанию нет. Первый администратор регистрируется по одноразовому секрету, который читается только с локальной консоли.
- Повторная валидация на этапе рендера. Config injection даёт файл, который
haproxy -cспокойно примет, — синтаксически он корректен. Поэтому всё, что попадает в конфиг, проверяется и при записи в базу, и при генерации. - Исходящие запросы (фиды блоклистов, CrowdSec LAPI) перепроверяют IP в момент подключения — против DNS rebinding — и не ходят по редиректам.
- Цепочка поставок: установщик сверяет артефакты релиза с
SHA256SUMSи отказывается ставить то, что проверку не прошло. Нет доступа к GitHub — установка останавливается, а не собирает Go-тулчейн на машине, которая смотрит в интернет.
И любимая фича лично для меня — nftables и netplan с откатом по таймеру. Применяете правило, у вас от 30 до 600 секунд (по умолчанию 90), чтобы подтвердить, что доступ не потерян. Не подтвердили — правило откатывается само. Кто хоть раз запирал себя снаружи удалённого файрвола, оценит. В корпоративных железках это давно норма (commit confirmed в Junos, cfg-save revert в FortiOS), в домашнем Linux — почти нигде.
Установка
Требования: Ubuntu 24.04 LTS — единственная поддерживаемая платформа, и это осознанно. Минимум 2 vCPU / 2 ГБ RAM, для all-in-one с CrowdSec комфортнее 4 ГБ; диск — от 32 ГБ. Работает на ESXi, Proxmox, любом KVM.
На чистой ВМ:
git clone https://github.com/sbezpalov/easy-waf.git
cd easy-waf
sudo bash scripts/install.sh
Установщик поставит HAProxy, PostgreSQL, CrowdSec с SPOA-bouncer, fail2ban, правила nftables и сам пакет easy-waf из GitHub Releases. Затем — вход:
sudo easy-waf-admin print-enrollment # одноразовый секрет
Открываете https://<IP-appliance>:8443, проходите enrollment и добавляете первое приложение:
- Applications → Add, профиль — например,
home-assistant. - Имя хоста, IP:порт бэкенда, при необходимости WebSocket.
- Certificates — выпускаете сертификат (сначала на staging Let’s Encrypt, чтобы не упереться в лимиты).
- Apply —
haproxy -c, reload, новая ревизия.
Если PostgreSQL, nftables и CrowdSec у вас уже настроены по-своему, можно поставить только .deb-пакет — предварительно проверив контрольную сумму. Обновление — apt install более нового пакета; /etc/easy-waf/easy-waf.env объявлен conffile и не перезаписывается.
Сценарии применения
- Умный дом. Home Assistant, Node-RED, Zigbee2MQTT наружу через один хост с профилем
home-assistantи GeoIP «только своя страна». Приложение на телефоне работает, сканеры со всего мира — нет. - Видеонаблюдение. Frigate или веб-интерфейс NVR — классический кандидат в «только из LAN» для админских путей и
strictдля просмотра. Если строите систему с нуля — у меня есть подробный проект видеонаблюдения для частного дома, Easy Home WAF хорошо ложится перед ним. - Малый офис. Nextcloud, веб-клиент АТС, Grafana, NAS — за одним IP, с нормальными сертификатами, без покупки коммерческого WAF.
- Лаборатория. Стенд, который нужно показать заказчику на пару недель: опубликовали с
strict, показали, выключили.
Чего Easy Home WAF не делает: это не замена NGFW на периметре, не enterprise-WAF с сигнатурами уровня коммерческих продуктов и не кластер. Базовые WAF-правила отсекают массовые сканеры и грубые атаки, основную поведенческую работу делает CrowdSec. Если публикуете что-то с персональными данными клиентов — нужен другой класс решений.
Итог
Easy Home WAF — молодой проект, который ведёт один человек, и я использую его в продакшене на своей домашней сети. Интерфейсы стабильны, всё ломающее проходит через CHANGELOG.md с примечанием об обновлении. Прежде чем ставить его перед тем, что жалко потерять, прочитайте docs/SECURITY.ru.md и настройте бэкапы (scripts/backup.sh).
Если у вас дома больше трёх веб-интерфейсов и хотя бы один из них уже проброшен наружу напрямую — попробуйте. Баг-репорты, исправления и правки документации приветствуются: начните с CONTRIBUTING.md. Об уязвимостях — только через приватный канал в SECURITY.md, не в публичных issue.
Ссылки:
- Репозиторий: github.com/sbezpalov/easy-waf
- Быстрый старт: docs/QUICKSTART.ru.md
- Безопасность: docs/SECURITY.ru.md
- Релизы: github.com/sbezpalov/easy-waf/releases