- 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.
102 lines
5.3 KiB
Markdown
102 lines
5.3 KiB
Markdown
# Agents
|
||
|
||
## Short install (рекомендуется)
|
||
|
||
В UI `/agents` → **Добавить агента**:
|
||
|
||
1. Создаётся агент со статусом **Invited** (сразу виден в таблице) + install-ссылка.
|
||
2. Скопируйте one-liner (колонка Install или Sheet):
|
||
|
||
**Linux:**
|
||
```bash
|
||
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
|
||
```
|
||
|
||
3. После enroll статус станет **Pending** — одобрите агента (Approve).
|
||
4. **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)
|
||
|
||
```bash
|
||
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):**
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
sudo rm -f /var/lib/evofw/last_hash
|
||
sudo /usr/local/sbin/evofw-firewall.sh
|
||
```
|