# Firewall blocklist Подсистема синхронизации blocklist на произвольные Linux-серверы через bash-скрипт и HTTP API. ## Авторизация 1. **Enroll** — `POST /v1/firewall/enroll` с заголовком `X-EvoBGP-Seed` (значение `EVOBGP_BUNDLE_SEED_HEX` на CP). Клиент генерирует токен `evobgp_fw_*` локально. 2. **Approve** — operator в Web UI (`/firewall` → Запросы). 3. **Sync** — `GET /v1/firewall/blocklist` с `Authorization: Bearer `. ## Политика block/accept - **`block`** — добавить префиксы выбранного BGP community в kernel blocklist. - **`accept`** — не блокировать префиксы этого community. - **Community** — правило применяется к префиксам с этим `community_id` в опубликованной revision; пустое значение («Все») — ко всем communities. - **Default** — accept (пустой blocklist без явных `block`). Порядок: сначала per-server overrides клиента, затем tenant-default. Для каждого community берётся первое подходящее правило по приоритету. Справочник communities: Web UI → Справочники, или модули с привязкой community к префиксам. ## Установка на сервер Публичные URL (без API-ключа, вне `WEBUI_IP_WHITELIST` Traefik): `GET /v1/firewall/install.sh`, `GET /v1/firewall/sync-script`, `POST /v1/firewall/enroll`. Всегда **HTTPS**. Требуется миграция **`000027_firewall`** в PostgreSQL (применяется при старте API с актуальным бинарём). Если enroll отвечает `503` / `database schema outdated` — перезапустите `evobgp-api` / `evobgp-all` после деплоя новой версии. ```bash curl -fsSL https:///v1/firewall/install.sh | \ EVOBGP_CP_URL=https:// \ EVOBGP_SEED= \ EVOBGP_CLIENT_NAME="web-01" \ bash ``` Файлы: `/etc/evobgp/firewall.conf`, `/usr/local/sbin/evobgp-firewall.sh`, systemd timer `evobgp-firewall.timer`. После **approve** в UI выполните на сервере (или дождитесь timer): ```bash sudo rm -f /var/lib/evobgp-firewall/last_hash sudo /usr/local/sbin/evobgp-firewall.sh sudo nft list table inet evobgp_blocklist ``` Для парсинга JSON нужен `jq` или `python3` (install.sh ставит `jq` на Debian/Ubuntu при отсутствии). ## Failover через speaker При `EVOBGP_FIREWALL_FAILOVER_ENABLED=1` на speaker-agent CP реплицирует состояние через `POST /v1/agent/firewall-replicate`. Клиенты используют тот же DNS-домен. См. также [access.md](access.md), [remote-speakers.md](remote-speakers.md).