Easy Home WAF: домашний reverse proxy с WAF, CrowdSec и ACME — без ручного HAProxy

Сентябрь 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 и добавляете первое приложение:

  1. Applications → Add, профиль — например, home-assistant.
  2. Имя хоста, IP:порт бэкенда, при необходимости WebSocket.
  3. Certificates — выпускаете сертификат (сначала на staging Let’s Encrypt, чтобы не упереться в лимиты).
  4. 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.

Ссылки:

Оставьте комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.