Multi-layer DDoS protection for Minecraft servers. - rampart-core: Edge node with XDP/eBPF + Rust L7 filtering - rampart-manager: REST API with JWT auth, Redis sync - rampart-cli: CLI tool for operators - velocity-plugin: Domain check, HMAC verify, server registry, load balancer - paper-plugin: Auto-registration, heartbeat, HMAC verify - dashboard: React + Vite web UI for management
254 lines
9.2 KiB
Markdown
254 lines
9.2 KiB
Markdown
# Rampart — Development TODO & Roadmap
|
||
|
||
> Живой документ. Философия: **KISS → DRY → SOLID → YAGNI**.
|
||
|
||
---
|
||
|
||
## 0. Принципы разработки
|
||
|
||
### KISS
|
||
- Не добавляй абстракцию до третьего повторения.
|
||
- Функция ≤ 60 строк, модуль ≤ 500 строк.
|
||
- Не используй generics где хватит `&str` и `Vec<u8>`.
|
||
|
||
### DRY
|
||
- Повтор > 2 раз → выноси, но лучше копипаста чем неправильная абстракция.
|
||
|
||
### SOLID (Rust)
|
||
- **S**: один файл = одна ответственность
|
||
- **O**: расширяй через трейты
|
||
- **L**: `dyn Filter` — любая реализация без side effects
|
||
- **I**: маленькие трейты вместо одного `ShieldTrait`
|
||
- **D**: core зависит от `trait StateStore`, не от Redis
|
||
|
||
### YAGNI
|
||
- Не пиши io_uring до v0.4, BGP до v0.6, K8s Operator до v0.5
|
||
- Не добавляй feature flag если фича не готова
|
||
|
||
### Rust-специфичные
|
||
1. `unwrap()` — только в main() и тестах
|
||
2. `unsafe` — только в xdp/, комментарий обязателен
|
||
3. `clone()` осознанно, профилируй hot path
|
||
4. Блокирующие операции → `spawn_blocking`
|
||
5. Логи: `tracing::info!` / `debug!` / `error!`
|
||
6. Метрики: register один раз при старте, инкремент в hot path
|
||
|
||
---
|
||
|
||
## 1. Этапы разработки
|
||
|
||
### Этап 0: Bootstrap (неделя 1)
|
||
- [ ] Инициализировать Cargo workspace (`crates/*`)
|
||
- [ ] GitHub Actions: `cargo check`, `cargo test`, `cargo clippy -- -D warnings`
|
||
- [ ] `cargo-deny` (лицензии, CVE, дубликаты)
|
||
- [ ] `Makefile` с целями: `build`, `test`, `fmt`, `ebpf`, `docker`
|
||
- [ ] `docker-compose.yml` для dev (redis, clickhouse)
|
||
- [ ] `.gitignore`, `CONTRIBUTING.md`, `rustfmt.toml`, `clippy.toml`
|
||
- [ ] **DoD:** `make test` проходит, CI зелёный, `cargo build --release` собирает
|
||
|
||
---
|
||
|
||
### Этап 1: MVP — v0.1 (недели 2–4)
|
||
> Edge нода принимает MC соединения, парсит handshake, HMAC, проксирует на Velocity.
|
||
|
||
#### rampart-core
|
||
- [ ] TCP listener с SO_REUSEPORT
|
||
- [ ] VarInt парсер с bounds check
|
||
- [ ] MC Handshake парсер (packet_id=0x00)
|
||
- [ ] HMAC-SHA256 signer
|
||
- [ ] Timeout 1.5s на handshake (Slowloris защита)
|
||
- [ ] TCP proxy (tokio::io::copy_bidirectional)
|
||
- [ ] Config из `config.toml`
|
||
- [ ] Логи через `tracing`
|
||
|
||
#### rampart-cli
|
||
- [ ] `rampart pki init` — CA + сертификаты
|
||
- [ ] `rampart pki issue --name edge-1 --ip 10.0.100.1`
|
||
|
||
#### plugins/velocity
|
||
- [ ] DomainCheck: whitelist доменов, блок direct IP
|
||
- [ ] HmacCheck: verify HMAC, extract real IP
|
||
- [ ] Передача real IP в Velocity forwarding
|
||
|
||
#### plugins/paper
|
||
- [ ] ShieldAgent: авто-регистрация в YAML
|
||
- [ ] Heartbeat: online/tps в файл каждые 10 сек
|
||
|
||
#### docs
|
||
- [ ] `deployment.md`: как поднять v0.1
|
||
- [ ] `configuration.md`: примеры конфигов
|
||
|
||
#### Тестирование
|
||
- [ ] Unit: VarInt парсер (overflow, incomplete, граничные случаи)
|
||
- [ ] Unit: HMAC sign/verify (timing, wrong secret)
|
||
- [ ] Integration: tcpkali → handshake доходит до Velocity
|
||
- [ ] Ручной: реальный Minecraft клиент через edge
|
||
|
||
- [ ] **DoD v0.1:** Реальный игрок заходит через Edge → Velocity, HMAC работает, direct IP блокируется, `cargo test` проходит
|
||
|
||
---
|
||
|
||
### Этап 2: Registry + Redis — v0.2 (недели 5–7)
|
||
- [ ] `trait StateStore` + `impl StateStore for Redis`
|
||
- [ ] DashMap blacklist cache (TTL 5 мин)
|
||
- [ ] Pub/Sub `rampart:blacklist:events`
|
||
- [ ] Token bucket rate limiter per IP
|
||
- [ ] Graceful shutdown (SIGTERM)
|
||
|
||
#### rampart-manager
|
||
- [ ] Axum REST API: `GET /api/servers`, `POST /api/blacklist`
|
||
- [ ] JWT auth (Bearer token)
|
||
|
||
#### plugins/velocity
|
||
- [ ] ServerRegistry: delta-sync из Redis
|
||
- [ ] LoadBalancer: round-robin
|
||
|
||
#### plugins/paper
|
||
- [ ] ShieldAgent: писать в Redis (`rampart:servers`)
|
||
- [ ] HeartbeatTask: online/tps в Redis
|
||
- [ ] OnDisable: удалять себя из Redis
|
||
|
||
#### dashboard
|
||
- [ ] React + Vite
|
||
- [ ] Страница Servers (online, tps, статус)
|
||
- [ ] Страница Blacklist
|
||
|
||
- [ ] **DoD v0.2:** Серверы регистрируются автоматически, блэклист синхронизируется, dashboard работает
|
||
|
||
---
|
||
|
||
### Этап 3: Observability — v0.3 (недели 8–10)
|
||
#### rampart-core
|
||
- [ ] Prometheus метрики (порт 9090): connections, active, handshake duration, rate limit hits, blacklist size
|
||
- [ ] OpenTelemetry tracing (feature flag)
|
||
- [ ] Structured logs (JSON)
|
||
|
||
#### rampart-manager
|
||
- [ ] Prometheus метрики
|
||
- [ ] ClickHouse writer (batch, раз в сек, буфер 1000)
|
||
- [ ] ClickHouse schema: `rampart.blocked`
|
||
|
||
#### plugins/velocity
|
||
- [ ] Prometheus метрики: online, domain failures, registry size
|
||
|
||
#### plugins/paper
|
||
- [ ] Prometheus метрики: tps, mspt, online
|
||
|
||
#### dashboard / docs
|
||
- [ ] Grafana dashboard JSON
|
||
- [ ] Страница Attack Log
|
||
- [ ] `observability.md`
|
||
|
||
- [ ] **DoD v0.3:** Grafana показывает онлайн/TPS/блокировки, ClickHouse хранит логи, алерт на DDoS
|
||
|
||
---
|
||
|
||
### Этап 4: XDP + eBPF — v0.4 (недели 11–14)
|
||
#### xdp/
|
||
- [ ] `xdp_filter.c`: UDP drop, SYN rate limit, blacklist (LPM_TRIE)
|
||
- [ ] Ringbuf для событий (баны, rate limit hits)
|
||
- [ ] Rust loader (libbpf-rs, attach/detach)
|
||
- [ ] Feature flag: `xdp`
|
||
|
||
#### rampart-core
|
||
- [ ] Интеграция XDP loader в startup
|
||
- [ ] Чтение ringbuf → DashMap blacklist
|
||
- [ ] BPF stats → Prometheus
|
||
|
||
#### Тестирование
|
||
- [ ] `hping3 -S --flood` → XDP дропает, CPU < 30%
|
||
- [ ] `iperf3` UDP flood → XDP дропает
|
||
|
||
- [ ] **DoD v0.4:** SYN flood 1M pps дропается в XDP, CPU < 30%, XDP отключается feature flag
|
||
|
||
---
|
||
|
||
### Этап 5: Anti-Bot — v0.5 (недели 15–18)
|
||
- [ ] GeoIP lookup (maxminddb)
|
||
- [ ] ASN reputation (datacenter строже, mobile мягче)
|
||
- [ ] Adaptive rate limiting (EWMA)
|
||
- [ ] Bloom filter для whitelist
|
||
|
||
#### plugins/velocity
|
||
- [ ] Интеграция Sonar 3.0
|
||
- [ ] Custom challenge API (timing, map CAPTCHA)
|
||
- [ ] IP reputation score → Redis
|
||
|
||
- [ ] **DoD v0.5:** Боты блокируются, GeoIP работает, Sonar интегрирован
|
||
|
||
---
|
||
|
||
### Этап 6: Scale + HA — v0.6 (недели 19–24)
|
||
- [ ] WireGuard hub-and-spoke (CLI автоконфиг)
|
||
- [ ] Rust Load Balancer (SO_REUSEPORT, несколько инстансов)
|
||
- [ ] mTLS между всеми компонентами (rustls)
|
||
- [ ] QUIC канал Edge ↔ Manager
|
||
|
||
#### rampart-manager
|
||
- [ ] NATS JetStream (blacklist, drain)
|
||
- [ ] xDS-like API для динамической конфигурации
|
||
- [ ] Auto-discovery edge нод
|
||
|
||
#### rampart-cli
|
||
- [ ] `add-node`, `wg sync`, `drain`
|
||
|
||
- [ ] **DoD v0.6:** 5+ edge нод, drain без потери соединений, mTLS везде
|
||
|
||
---
|
||
|
||
### Этап 7: Polish — v0.7 (недели 25–28)
|
||
- [ ] io_uring runtime (feature flag, 5.10+)
|
||
- [ ] NUMA-aware allocation (bare metal)
|
||
- [ ] Zero-copy splice после handshake
|
||
- [ ] SLSA Level 3: signed releases, reproducible builds
|
||
- [ ] `cargo-vet`, secret rotation (dual-key HMAC)
|
||
- [ ] Docker images, GitHub Releases
|
||
|
||
- [ ] **DoD v0.7:** io_uring +30% throughput, релизы подписаны, доки позволяют поднять систему за час
|
||
|
||
---
|
||
|
||
## 2. Технический долг (Backlog)
|
||
|
||
- [ ] **Refactor:** Вынести `rampart-store` в отдельный crate
|
||
- [ ] **Refactor:** BufferPool на `crossbeam::queue::ArrayQueue`
|
||
- [ ] **Perf:** Registered buffers для io_uring
|
||
- [ ] **Feat:** Bedrock / RakNet (UDP модуль)
|
||
- [ ] **Feat:** Plugin API через WASM
|
||
- [ ] **Feat:** BGP Anycast (требует AS + /24)
|
||
- [ ] **Feat:** ML anomaly detection (IsolationForest)
|
||
- [ ] **Test:** Chaos engineering (random node kills)
|
||
- [ ] **Test:** Fuzzing для handshake parser (`cargo-fuzz`)
|
||
|
||
---
|
||
|
||
## 3. Definition of Done
|
||
|
||
```
|
||
☐ cargo check / cargo test проходят
|
||
☐ cargo clippy -- -D warnings — 0 warnings
|
||
☐ cargo fmt --check проходит
|
||
☐ Unit тесты покрывают happy path + 2+ error cases
|
||
☐ Интеграционный тест проходит
|
||
☐ Документация обновлена
|
||
☐ CI зелёный
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Anti-Patterns
|
||
|
||
```
|
||
❌ Тесты после кода. Пиши до (TDD) или вместе.
|
||
❌ Коммиты в main напрямую. Только PR.
|
||
❌ TODO в коде без issue. TODO = баг.
|
||
❌ Оптимизация без профиля.
|
||
❌ Зависимость ради 1 функции.
|
||
❌ async где хватит sync.
|
||
❌ Секреты в репозитории. Используй .env + SOPS.
|
||
❌ Игнор compiler warnings.
|
||
```
|
||
|
||
---
|
||
|
||
*Версия: 1.0 | Обновляется каждый понедельник*
|