CI / changes (push) Successful in 11s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 29s
CI / web (push) Successful in 58s
CI / go (push) Successful in 1m20s
CI / bird2 (push) Successful in 18s
CI / release (push) Successful in 4m37s
Updated the firewall scripts to improve blocklist handling by introducing a new method for fetching and parsing blocklist data using either `jq` or `python3`. Enhanced the installation script to ensure the presence of required dependencies and provided user guidance for post-approval actions. Additionally, improved logging for applied prefixes and total counts, ensuring better visibility into the firewall's operational status.
53 lines
3.0 KiB
Markdown
53 lines
3.0 KiB
Markdown
# 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 <client_token>`.
|
||
|
||
## Политика 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://<api>/v1/firewall/install.sh | \
|
||
EVOBGP_CP_URL=https://<api> \
|
||
EVOBGP_SEED=<bundle_seed_hex> \
|
||
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).
|