CI / changes (push) Successful in 12s
CI / commitlint (push) Has been skipped
CI / openapi (push) Successful in 25s
CI / web (push) Successful in 46s
CI / go (push) Successful in 1m15s
CI / bird2 (push) Successful in 18s
CI / release (push) Successful in 3m59s
Introduced a comprehensive firewall blocklist feature, allowing for the management of firewall clients and their associated rules. This includes endpoints for enrolling clients, listing clients and rules, and reporting apply statuses. Enhanced the API to support firewall operations, including the ability to handle block/accept policies. Updated the documentation to reflect these changes and added necessary components in the web UI for better user interaction. Additionally, modified the agent server to support firewall failover and integrated firewall functionality into the existing architecture.
6.1 KiB
6.1 KiB
Удалённые BGP-спикеры (Remnawave-style)
Runbook для реплик bird2 + evobgp-agent на отдельных VPS. Control plane (evobgp-all) инициирует доставку после module_refresh → deploy_apply; реплика не собирает префиксы сама.
Модель
| Remnawave | EvoBGP |
|---|---|
| Panel → Node:PORT | CP POST https://AGENT_DOMAIN/v1/agent/sync |
| SECRET_KEY | agent_secret (Bearer) |
| Copy compose | Web UI → карточка спикера |
| Push Xray JSON | Wake-up → pull signed bundle → verify Ed25519 → apply |
Подробнее: architecture.md.
Быстрый старт
- CP (microvps-full): зафиксируйте
EVOBGP_BUNDLE_SEED_HEX(32 байта hex) — стабильный ключ подписи бандлов. - Web UI → Сеть → Спикеры: создайте спикер
role=replica, укажите Agent domain, IP ноды, BGP source (по умолчанию = IP ноды). - Сохраните
agent_secret(показывается один раз) и скопируйте docker-compose из UI. - Выдайте node API-ключ (access.md) для
EVOBGP_NODE_TOKEN. GET /v1/bundle/signing-public-key→EVOBGP_BUNDLE_PUBKEY_BASE64на реплике.- На VPS реплики:
cd deploy/compose cp .env.remote-speaker.example .env.remote-speaker cp .env.remote-speaker-tls.example .env.remote-speaker-tls # заполните переменные из UI docker compose -f docker-compose.remote-speaker.yaml \ --env-file .env.remote-speaker --env-file .env.remote-speaker-tls \ --profile production up -d - CP:
EVOBGP_NODE_DISPATCH_ENABLED=1— Panel шлёт wake-up после publish. - Cloudflare:
AGENT_DOMAIN→ IP VPS, DNS only (как Web UI в quickstart.md).
Compose-профили
| Profile | Состав |
|---|---|
production |
bird2 (host) + agent + Traefik LE |
plain |
bird2 + agent на хосте без Traefik (только lab) |
fallback |
+ sync-bundle polling (scripts/sync-bundle.sh) |
Файлы: docker-compose.remote-speaker.yaml.
Firewall
| Порт | Кто | Зачем |
|---|---|---|
| 443 | IP CP (PANEL_IP_WHITELIST) |
HTTPS dispatch, health, GET /v1/agent/bird/protocols (live peer sessions) |
| 179 | BGP peers | Data plane |
| 80 | ACME | Traefik → 443 |
Подготовка VPS (перед docker compose up)
bird2 — network_mode: host. Docker не может задать net.ipv4.ip_forward в таком контейнере; включите на хосте:
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
echo 'net.ipv4.ip_forward=1' | tee /etc/sysctl.d/99-evobgp-bird.conf
echo 'net.ipv6.conf.all.forwarding=1' >> /etc/sysctl.d/99-evobgp-bird.conf
sysctl --system
Безопасность (три участка)
- CP → реплика: HTTPS (LE) + Traefik ipallowlist +
agent_secret. - Реплика → CP: HTTPS + роль
node(только bundle/latest/enroll). - Конфиг: Ed25519
bundle.sig, SHA-256 manifest,bird -p, LKG на ноде.
Prod checklist:
EVOBGP_CONTROL_PLANE_URL=https://...EVOBGP_NODE_DISPATCH_ENABLED=1на CPEVOBGP_BUNDLE_SEED_HEXна CP (не менять после выдачи pubkey репликам)- Уникальные
agent_secretи node token на спикер - Не использовать profile
plainв prod - Не отключать verify-bundle в agent
Per-speaker BGP source
В UI: IP ноды (meta_json.node_ipv4) и BGP source IPv4 (bird_bgp_source_ipv4, default = IP ноды). Pipeline накладывает overlay при GET .../bundle/{revision_id} — меняются router id и peer local.
Tenant /v1/settings (bird_bgp_source_ipv4) — fallback для master / если у спикера не задано.
Drift и dispatch
published_revision_idvslast_applied_revision_id— в UI иevobgp-deploy.- Job
deploy_applymeta:node_dispatch.results[]— статус wake-up per speaker. - Canary:
POST /v1/speakers/{id}/applyсrevision_id.
Troubleshooting
| Симптом | Проверка |
|---|---|
sysctl net.ipv4.ip_forward not allowed in host network |
Уберите sysctls из compose (уже так в main); включите ip_forward на VPS (см. выше) |
no service selected |
--profile production или COMPOSE_PROFILES=production |
| Offline в UI | GET https://AGENT_DOMAIN/v1/agent/health с CP; LE cert; whitelist |
| dispatch error | CP logs job meta; firewall 443; agent_secret |
| verify-bundle fail | pubkey совпадает с CP seed; пересоберите pubkey после смены seed |
| BGP не поднимается | bird2 network_mode: host; peers; MD5 BGP отдельно от HTTP sync |
Ограничения (scale-review)
- Peers не фильтруются по
speaker_id— один tenant-wide peers fragment на все реплики. - Разные peer-наборы per site — отдельная итерация pipeline.
- Если Panel не достучится до agent — включите profile
fallback(polling).
Связанные env
| Переменная | Где |
|---|---|
EVOBGP_NODE_DISPATCH_ENABLED=1 |
CP |
EVOBGP_AGENT_SECRET |
реплика |
EVOBGP_NODE_TOKEN |
реплика |
EVOBGP_FIREWALL_FAILOVER_ENABLED=1 |
реплика (опционально: отдавать /v1/firewall/blocklist при недоступности CP) |
EVOBGP_FIREWALL_STATE_FILE |
реплика (default /var/lib/evobgp-agent/firewall-state.json) |
EVOBGP_BUNDLE_PUBKEY_BASE64 |
реплика |
PANEL_IP_WHITELIST |
Traefik на реплике |