- remove Java plugins (velocity/paper), dashboard, all MC-specific code
(handshake, death_code, varint, hostname-HMAC); available in history pre-v0.2
- merge crates/* into one package with src/bin/{rampart,rampart-manager,rampart-cli}
- ProtocolHandler trait + registry (no implementations yet), universal PoW kept
- XDP: universal L3/L4 filter (xdp/core/) + pluggable hook API (xdp/hooks/),
fix IPv6 saddr bug; clang build verified
- docs: bilingual knowledge base (docs/kb/: attacks x4, defense-levels,
practice x3), rewrite README/architecture for universal concept
- TODO.md v4.0: <=300-line module limit, competitor benchmark section (ref/)
- deploy/CI/docs cleanup: no MC references, new binary names
cargo build/clippy(-D warnings)/test green (55 tests)
15 KiB
15 KiB
Rampart — Development TODO & Roadmap
Живой документ. Философия: KISS → DRY → SOLID → YAGNI.
v0.3.0-dev — big-bang редизайн: из Minecraft-специфичной защиты в универсальную L3/L4/L7 платформу сетевой защиты. MC-код, Java-плагины и dashboard удалены (доступны в git-истории до тега v0.2.0).
0. Принципы разработки
KISS
- Не добавляй абстракцию до третьего повторения.
- Функция ≤ 60 строк, модуль ≤ 300 строк (жёсткий лимит; больше — декомпозиция).
- Не используй generics где хватит
&strиVec<u8>.
DRY
- Повтор > 2 раз → выноси, но лучше копипаста чем неправильная абстракция.
SOLID (Rust)
- S: один файл = одна ответственность
- O: расширяй через трейты (
ProtocolHandler,Filter,StateStore) - L:
dyn Filter— любая реализация без side effects - I: маленькие трейты вместо одного God-trait
- D: core зависит от trait-ов, не от Redis/ClickHouse напрямую
YAGNI
- Не пиши BGP до v0.6, WASM-плагины до стабилизации compile-time API.
- Не добавляй feature flag если фича не готова.
Rust-специфичные
unwrap()— только в main() и тестахunsafe— только в xdp/, комментарий// SAFETY:обязателенclone()осознанно, профилируй hot path- Блокирующие операции →
spawn_blocking - Логи:
tracing::info!/debug!/error! - Метрики: register один раз при старте, инкремент в hot path
1. Целевая структура (v0.3)
guard/
├── Cargo.toml # ОДИН пакет rampart, features = ["protocol-http", ...]
├── src/
│ ├── bin/{rampart, rampart-manager, rampart-cli}.rs
│ ├── engine/ # listener, tunnel (generic TCP proxy), challenge (PoW)
│ ├── filter/ # blacklist, rate_limit, geo — trait Filter
│ ├── traffic/ # EWMA, detector, profiler, reputation, alert
│ ├── store/ # redis (+ trait StateStore)
│ ├── manager/ # api/, auth/, sync/
│ ├── cli/ # команды CLI
│ └── protocol/ # trait ProtocolHandler + registry (реализаций пока 0)
├── xdp/
│ ├── core/ # universal_filter.c + maps/stats/config/common.h
│ └── hooks/hook_api.h # контракт подключаемых BPF-протокол-хуков
├── tests/ # интеграционные
└── docs/ # kb/ (knowledge base) + research/ + ops-доки
1a. Статус после редизайна (2026-08-24)
| Что | Статус |
|---|---|
| plugins/ velocity+paper, dashboard/ | ✅ удалены (git-история) |
crates/* → единый пакет rampart + src/bin |
✅ сделано |
| MC-код (handshake, death_code, varint, hostname-HMAC) | ✅ удалён полностью |
PoW как универсальный hashcash (engine/challenge.rs) |
✅ сохранён |
| XDP: universal L3/L4 фильтр + hooks API | ✅ код готов, clang build OK |
| IPv6 баг в XDP (daddr→saddr) | ✅ исправлен |
| Knowledge Base docs/kb (attacks, defense-levels, practice) | ✅ написана, двуязычная |
| README + architecture.md под новую концепцию | ✅ переписаны |
| cargo build / clippy -D warnings / test | ✅ зелёные |
2. Ближайшие задачи (v0.3)
Subnet-level detection (ботнет с ротацией IP)
- XDP: карта
prefix_stats(LRU_HASH, ключ /24 v4 | /64 v6) — счётчики SYN/pps per-префикс рядом с per-IP (референс: caddy-mitigator CIDR promotion, lnvps_fw carpet-bomb). - Detector: префикс превышает порог при том что отдельные IP под лимитом → распределённая атака → флаг подсети.
- Мягкая эскалация для подсетей: monitor → strict limits → challenge → блок. Хард-бан /24 только через challenge (CGNAT: за одним /24 легитимно живут сотни людей).
- Блок самой подсети — уже умеем:
blacklist_mapэто LPM trie (CIDR из коробки).
Движок без протоколов — сделать полезным
- Первый протокол-плагин:
protocol-http(feature) — минимальный HTTP/1.1 handshake-анализ (request line, заголовки, размер), чтобы edge-нода заработала для веб-сервисов. - TCP-proxy режим: generic upstream forwarding за ProtocolHandler (tunnel.rs уже generic — проверить интеграцию).
- Fail-fast сообщение при пустом registry — улучшить текст подсказки сборки.
Подключение мёртвого интеллекта (правило: «мёртвый код = баг»)
- Layer Traffic Intel подключить в hot path: AttackDetector/IpReputation → метрики + auto-ban (сейчас не вызывается).
- Blacklist:
clear_expired()по таймеру. - RateLimiter: TTL-эвикция idle bucket'ов + cap карты.
Безопасность (перенос из аудита v0.3, актуальное)
- Rate limiter на login endpoint manager API (5/60с).
- JWT: валидация ролей/audience, secret ≥ 32 байт.
- Redis:
KEYS→SCAN, reconnect pubsub-подписчика.
XDP
- Verifier-проверка на реальном ядре (в контейнере нет CAP_BPF — компиляция OK, загрузка не проверялась).
- Rust loader (
src/xdp/): пути к xdp/core/universal_filter.c, patch глобалов G_* из config.toml, ringbuf events → blacklist. - Smoke-test attach в CI (VM runner с CAP_BPF).
Документация
- docs/deployment.md, configuration.md, runbook.md — переписать под новую структуру (сейчас упоминают старые крейты/MC).
- docs/kb/README.md — индекс KB со ссылками на все статьи.
- TUI (ratatui): live-метрики из Prometheus endpoint (planned, v0.4).
3. Backlog
- protocol-gRPC plugin (после http)
- BPF hook #1 реальный: HTTP поверх XDP (rate-limit до userspace)
- GeoIP/ASN reputation (enum есть, реализации нет)
- Bloom filter для blacklist
- io_uring runtime (feature flag)
- ML anomaly detection (Isolation Forest)
- Fuzzing парсеров (
cargo-fuzz) - BGP Anycast (AS + /24)
3a. Бенчмарк-конкуренты: чем превзойти
Все репо склонированы в
ref/(gitignored). Анализ issues/PRs проведён 2026-08-24 через gh по трекерам конкурентов. Ниже — выжимка «что у них болит и что берём».
Карта конкурентов
| Проект | Что это | Похож на Rampart тем, что | Что взять |
|---|---|---|---|
| eBPFsentinel | Rust, один бинарник: firewall+IDS+DDoS через XDP/TC/uprobe | Ближайший аналог, та же архитектура | Rootless BPF token (kernel 6.9+); tail-call цепочки; MITRE-теги алертов; Swagger UI |
| CrabShield | Rust + XDP, гибрид L7→L3 | «Умный юзерспейс, кара в ядре» | Static musl бинарник; reaper истекающих банов; (log-tailing НЕ брать — хрупко) |
| lnvps_fw | XDP+TC защита VDS | Прямо наша ниша | ⭐ SYN-proxy в XDP; port learning из TC egress; лестница PORT_FILTER→SYN_PROXY→SOURCE_BLOCK + spoof gate; netns+veth harness |
| Oubliette | Linerate scrubber | Решает нашу боль с PoW | ⭐ RST-challenge: SYN-ACK с неверным ACK → спуф молчит, живой клиент шлёт RST → whitelist. Совместимо с любым клиентом |
| Couic (CERT Франции) | XDP-фаервол + REST API | Наш manager API | Anti-lockout; теги+TTL записей; OpenAPI spec; синк инстансов; fail2ban-интеграция |
| gamemann/XDP-Firewall (~830★) | Классический C XDP-фаервол | Референс по XDP | Pinned maps для внешнего управления; их issues = карта граблей верификатора |
| gen0sec/synapse | NDR: eBPF + JA4-фингерпринты + ratatui TUI | TUI как наш план | JA4+/JA4T фингерпринтинг (бан по отпечатку); fallback-цепочка XDP→nftables→iptables |
Топ-10 выводов из их issues/PRs (приоритет)
- Диагностика окружения при старте — проверять ядро/BTF/driver NIC до загрузки, человекочитаемый вердикт. ≈80% issues XDP-Firewall — про attach на неподдерживаемом окружении (#70/#71/#9/#44). Печатать режим (native/generic) честно.
- Эскалационная лестница защиты (lnvps_fw): pass-all steady state → PORT_FILTER → SYN_PROXY (tail-call, keyed cookie, ротация секрета) → SOURCE_BLOCK только со spoof-gate.
- RST-challenge (Oubliette) вместо мёртвого текстового PoW — универсально совместимо.
- REST API + OpenAPI + pinned maps: динамические IP-списки без перекомпиляции — самый частый feature request (#79/#77/#78 у gamemann); web-панель так и не сделана автором = свободная ниша.
- Anti-lockout + per-port баны: слепой XDP_DROP по IP = self-lockout по SSH (crab-shield docs). Whitelist обязателен, но не единственная защита.
- LRU во всех data-path maps — иначе silent default-deny под атакой (netshield DD-003). Per-src-IP rate limit не работает против spoofed flood 50–100 Mpps (gamemann #45) — нужны per-port/per-subnet/flow агрегаты.
- netns+veth тестовый харнесс + eBPF test_run тесты в CI (подтверждено в 2 проектах, отсутствует у всех) — наше конкурентное преимущество в надёжности.
- IPv6-паритет с первого дня + VLAN/QinQ парсинг (issue #75 висит годами).
- Rootless BPF token как опция, fallback CAP_BPF для ядер 5.15+ — не повторять жёсткий floor 6.9+ (ebpfsentinel отсёк enterprise) и не требовать root (crab-shield).
- События атак наружу с первого дня: poll-and-persist, дедуп алертов на переходе состояния (урок LNVPS #331 — отложили = дыра в продукте).
Наши козыри (чем превзошли уже)
- Двуязыная Knowledge Base (docs/kb/) — educational killer-feature, нет ни у одного конкурента
- Один Rust-бинарник без C-зависимостей сборки (класс сегфолтов/libbpf-hell gamemann исключён)
- Честные бенчмарки: цифры только с отчётами, методология опубликована
- Модульный лимит ≤300 строк + no-dead-code политика в CI
4. Anti-Regression — правила приёмки
- No dead code: каждый
pubимеет вызова вне#[cfg(test)]. - Config field = потребитель: нет поля без использования.
- Метрика регистрируется → обновляется: единственный writer на каждую метрику.
- Feature flag = сборка в CI:
--all-featuresзелёный, иначе фичи нет. - По умолчанию безопасно: нет дефолтных секретов; отсутствие обязательного env = fail-fast.
- Интеграционный тест на слой: config parse, filter logic, registry fail-fast (есть); новый слой = новый тест.
- Модуль ≤ 300 строк: CI-гейт через grep/wc скрипт или ревью.
- CI guardrails:
cargo clippy --all-targets -- -D warnings,cargo test, clang-build xdp/core/universal_filter.c, grep наchangeme. - README/TODO не врут: каждое число имеет ссылку на тест или отчёт.
5. Definition of Done
☐ cargo check / cargo test проходят
☐ cargo clippy --all-targets -- -D warnings — 0 warnings
☐ cargo fmt --check проходит
☐ Ни один модуль не превышает 300 строк
☐ Unit тесты покрывают happy path + 2+ error cases
☐ Нет мёртвого кода: pub без вызовов, конфиг-поле без потребителя, метрика без writer
☐ Нет дефолтных секретов
☐ README соответствует коду
☐ Документация обновлена
☐ CI зелёный
6. Anti-Patterns
❌ Тесты после кода. Пиши вместе.
❌ Модуль > 300 строк — сигнал декомпозировать немедленно.
❌ TODO в коде без issue.
❌ Мёртвый код: pub без вызовов, конфиг-поле без потребителя, метрика без writer.
❌ «Бумажный слой»: фича описана, но не вызывается.
❌ Дефолтный секрет.
❌ Парсер за «один read» — TCP-поток приходит фрагментами.
❌ Feature flag, который не собирается в CI.
Версия: 4.0 | Обновлён: 2026-08-24 (universal redesign)