Files
EvoFirewall/docs/agents.md
T
Denozordec 4ee78032c4
Build and Push EvoFirewall Docker Image / build-and-push (push) Successful in 1m51s
Build and Push EvoFirewall Docker Image / create-release (push) Skipped
feat(api, web): implement per-IP blocked stats for agents
- Added functionality to report per-IP drop counters in the `evofw-firewall.sh` script, capturing the top 200 IPs with packet counts.
- Introduced new API endpoints to retrieve blocked IP statistics and reset these stats for agents, enhancing monitoring capabilities.
- Updated the agent detail view to display blocked IPs, improving user visibility into agent performance.
- Enhanced database schema and repositories to support the storage and management of IP block statistics.

These changes provide a comprehensive view of blocked IPs, improving the overall management and monitoring of agents.
2026-08-07 14:15:10 +07:00

5.3 KiB
Raw Blame History

Agents

Short install (рекомендуется)

В UI /agentsДобавить агента:

  1. Создаётся агент со статусом Invited (сразу виден в таблице) + install-ссылка.
  2. Скопируйте one-liner (колонка Install или Sheet):

Linux:

curl -fsSL https://<cp>/agent-install/<id> | bash

MikroTik:

/tool fetch url="https://<cp>/agent-install/<id>" dst-path=evofw-install.rsc; /import file-name=evofw-install.rsc
  1. После enroll статус станет Pending — одобрите агента (Approve).
  2. Approved — агент синхронизирует политику.

Повторный запуск той же install-ссылки на хосте, где агент уже стоит: обновляет sync-скрипт / timer (или MikroTik scheduler), без повторного enroll — CLIENT_ID/token сохраняются. Полный переустановки с новым токеном: EVOFW_INSTALL_FORCE=1 (Linux).

API (auth): POST /api/v1/install-links { "name": "web-01", "platform": "linux" | "mikrotik" }.

Linux (legacy one-liner)

curl -fsSL https://<cp>/v1/agent/install.sh | \
  EVOFW_CP_URL=https://<cp> \
  EVOFW_SEED=<seed> \
  EVOFW_CLIENT_NAME="web-01" \
  bash

Создаёт нового агента со статусом Pending (без Invited).

Файлы: /etc/evofw/agent.conf, /usr/local/sbin/evofw-firewall.sh, timer evofw-firewall.timer (default 1min).

Install сам ставит зависимости через apt/dnf/yum/apk: curl, jq (или python3), nftables/iptables(+ipset). Планировщик: systemd timer если есть /run/systemd/system, иначе ставит cron/cronie и пишет crontab. Значения в agent.conf всегда в single quotes (имена с пробелами безопасны). Sync при статусе pending завершается с exit 0 (pending approval), чтобы systemd timer не был failed.

Если /etc/evofw/agent.conf уже есть — install переходит в update: скачивает свежий sync-script + uninstall.sh, перезаписывает unit/timer, оставляет токен. EVOFW_INSTALL_FORCE=1 — полный re-enroll (новый токен; для уже Approved install-link обычно не сработает).

Uninstall (Linux):

curl -fsSL https://<cp>/v1/agent/uninstall.sh | bash
# или локально после install:
sudo /usr/local/sbin/evofw-uninstall.sh

Backend auto-detect: nft → ipset → iptables.

Whitelist: nft chain policy drop + allow set. Blacklist: policy accept + deny set.

Per-IP blocked stats (Linux)

Linux agent reports optional ip_hits in POST /v1/agent/apply-report:

  • nft: set deny_v4 with flags interval; counter; — per-element packets; collected before flush/recreate and on unchanged-hash sync.
  • ipset: hash:net … counters — same idea from ipset list.
  • Payload: only entries with packets > 0, top 200 by packets.
  • Control plane stores cumulative totals in agent_ip_block_stats (delta vs last absolute report). GET /api/v1/agents/:id/blocked-ips. Reset via POST …/stats/reset.
  • UI: agent detail → Blocked IPs (Frame + DataGrid).

IPv6 skipped (as in apply). MikroTik: see below — no per-IP in v1.

MikroTik (RouterOS 7.21+)

В UI /agentsДобавить агента → platform MikroTik. Скопируйте one-liner:

/tool fetch url="https://<cp>/agent-install/<id>" dst-path=evofw-install.rsc; /import file-name=evofw-install.rsc

Или короткий slug: https://<cp>/<slug>.

Install RSC:

  1. Enroll (с install_link_id → агент Invited → Pending).
  2. Создаёт filter-правила evofw-* и address-list EVOFW_DENY / EVOFW_ALLOW.
  3. Scheduler evofw-sync каждую минуту: GET /v1/agent/policy (JSON) → rebuild address-list + toggle default. Не использует /import огромного .rsc (на больших списках часто падает молча).

Лог: /log print where message~"evofw". Ручной sync: /system script run evofw-sync. Traffic ↓/↑ в UI — сумма packets с filter-правил evofw-deny-* / evofw-allow-* / evofw-default-drop-* (накопительно, пока правила не пересозданы re-install).

Per-IP / blocked IPs: на MikroTik нет. У /ip firewall address-list в ROS 7 нет packets/bytes на записи — только суммарные counters filter-правил. В карточке агента секция Blocked IPs показывает пояснение.

Default action задаётся на агенте (default_action: accept | drop):

  • accept — пакет вне deny/allow пропускается
  • drop — пакет вне deny/allow отбрасывается (forward)

Цепочка всегда: deny-drop → allow-accept → default. Наборы несут только правила deny/allow, без exclusive mode.

Force sync

sudo rm -f /var/lib/evofw/last_hash
sudo /usr/local/sbin/evofw-firewall.sh