Layers: Layer 1: XDP/eBPF — TCP state machine, SYN throttle, blacklist, ringbuf Layer 2: PoW Challenge — SHA-256 hashcash, dynamic difficulty, constant-time verify Layer 3: Rust Core — HMAC handshake, rate limit, death code (existing) Layer 4: Velocity — Physics check, CAPTCHA, protocol verification Layer 5: Paper — Heartbeat, auto-registration (existing) Layer 6: Traffic Intel — EWMA, 168h profiling, reputation, alerts Infra: XDP→Prometheus metrics, ClickHouse + Grafana dashboard, Docker Compose Testing: 100-IP DDoS simulation, MHDDoS ref analysis, load test report Fixes: VarInt sign extension UB, pure ACK deadlock, RST/FIN cleanup Ref: MHDDoS, Sonar, LimboFilter, AtomGuard, Infrarust, MC-XDP-eBPF, PowGo
183 lines
13 KiB
Markdown
183 lines
13 KiB
Markdown
# Architecture - Rampart
|
||
|
||
> Актуально: v0.2+
|
||
> Статус: основной документ
|
||
|
||
---
|
||
|
||
## 6-слойная архитектура защиты
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────────┐
|
||
│ LAYER 1: XDP/eBPF (ядро) дроп L3/L4 до kernel TCP stack │
|
||
│ ───────────────────────────── │
|
||
│ TCP state machine (minecraft_filter.c): │
|
||
│ AWAIT_ACK → AWAIT_MC_HANDSHAKE → AWAIT_LOGIN → verified │
|
||
│ + SYN throttle per-IP │
|
||
│ + IP blacklist (LPM_TRIE) │
|
||
│ + Invalid TCP flags drop (SYN+FIN, SYN+RST, URG, пустые) │
|
||
│ + UDP drop (MC = TCP only) │
|
||
│ + Per-connection seq tracking │
|
||
│ + bpf_timer idle cleanup │
|
||
│ + IP/CIDR whitelist │
|
||
│ ─────────────────────────────────────── │
|
||
│ Reference: Minecraft-XDP-eBPF (исправленный: нет pure ACK deadlock,│
|
||
│ LRU maps, IPv6, idle таймеры на conntrack) │
|
||
├──────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 2: PoW Challenge (Rust) анти-handshake-flood │
|
||
│ ───────────────────────────── │
|
||
│ SHA256 hashcash перед HMAC handshake: │
|
||
│ 1. Edge шлёт challenge (random + timestamp + difficulty) │
|
||
│ 2. Клиент решает PoW (nonce brute-force) │
|
||
│ 3. Edge верифицирует SHA256(data + nonce) prefix │
|
||
│ + Dynamic difficulty: повышается при CPS > threshold │
|
||
│ + Per-connection одноразовый challenge (nonce replay защита) │
|
||
│ ─────────────────────────────────────── │
|
||
│ Reference: PowGo (адаптирован: per-request challenge, timestamp, │
|
||
│ dynamic difficulty, без Redis, без IP+UA сессии) │
|
||
├──────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 3: Rust Core (userspace) L7 фильтрация │
|
||
│ ───────────────────────────── │
|
||
│ + MC handshake парсинг (VarInt, bounds check) │
|
||
│ + HMAC-SHA256 hostname signature │
|
||
│ + Rate limit (token bucket per-IP) │
|
||
│ + Death code auto-ban (8 паттернов) │
|
||
│ + ASN/GeoIP reputation │
|
||
│ + Blacklist (Redis sync) │
|
||
├──────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 4: Velocity Proxy (Java) верификация игроков │
|
||
│ ───────────────────────────── │
|
||
│ + Domain whitelist (блок прямых IP) │
|
||
│ + HMAC verification (constant-time compare) │
|
||
│ + Falling check (детерминированная физика: pre-computed кэш) │
|
||
│ + Protocol check (Transaction, SetHeldItem, ArmAnimation) │
|
||
│ + Vehicle check (Boat/Minecart gravity) │
|
||
│ + CAPTCHA challenge (Map item / PoW) │
|
||
│ + Redis server registry (delta-sync) │
|
||
│ + TPS-aware load balancer (circuit breaker < 12 TPS) │
|
||
│ ─────────────────────────────────────── │
|
||
│ Reference: Sonar pipeline + LimboFilter falling check │
|
||
│ (исправлено: HMAC fingerprint, idempotent finishVerification, │
|
||
│ без QuietDecoderException, без race в handler switching) │
|
||
├──────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 5: Paper Agent (Java) авто-регистрация │
|
||
│ ───────────────────────────── │
|
||
│ + Redis heartbeat (TPS, online игроки, память, CPU) │
|
||
│ + Auto-registration/unregistration │
|
||
│ + HMAC login check │
|
||
│ + Graceful shutdown │
|
||
├──────────────────────────────────────────────────────────────────────┤
|
||
│ LAYER 6: Traffic Intelligence (Rust + Redis) аналитика │
|
||
│ ───────────────────────────── │
|
||
│ + 168-hour traffic profiling (per-hour-slot baseline) │
|
||
│ + EWMA adaptive thresholds (правильная variance формула) │
|
||
│ + Z-Score anomaly detection (3 consecutive minutes для алерта) │
|
||
│ + Attack detection (CPS, PPS thresholds) │
|
||
│ + Reputation system (IP score -100..+100) │
|
||
│ + Discord webhook на события │
|
||
│ ─────────────────────────────────────── │
|
||
│ Reference: AtomGuard (исправлено: EWMA variance, Isolation Forest │
|
||
│ реально используется, без race в pipeline) │
|
||
└──────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## Схема прохождения трафика
|
||
|
||
```
|
||
Атакующий (ботнет)
|
||
|
|
||
v
|
||
[1] XDP/eBPF ─── TCP state machine ─── blacklist ─── SYN throttle
|
||
| дроп: SYN flood, UDP, invalid flags, non-MC port
|
||
v (чистый TCP, прошёл state machine)
|
||
[2] PoW Challenge ─── SHA256 hashcash ─── dynamic difficulty
|
||
| дроп: не решил PoW за N секунд
|
||
v (валидный PoW)
|
||
[3] Rust Core ─── handshake parse ─── HMAC sign ─── rate limit ─── death code
|
||
| дроп: rate limit, invalid packet, bad HMAC
|
||
v (валидный MC handshake + HMAC)
|
||
[4] Velocity ─── domain check ─── HMAC verify ─── falling/physics check ─── CAPTCHA
|
||
| дроп: bad domain, bad HMAC, failed physics
|
||
v (верифицированный игрок)
|
||
[5] Game Server
|
||
| Чистый трафик, без DDoS нагрузки
|
||
```
|
||
|
||
## Компоненты системы
|
||
|
||
```
|
||
┌────────────────────────────────────────────────────────────────┐
|
||
│ EDGE NODE │
|
||
│ XDP/eBPF (C) → PoW (Rust) → Rust Core → Manager API │
|
||
│ ──────────────────────────────────────────────────────────── │
|
||
│ Требования: KVM/Bare Metal, 2-4 vCPU, 2-4 GB, kernel 5.10+ │
|
||
│ XDP native: Intel i40e, Mellanox ConnectX, virtio (generic) │
|
||
└────────────────────────┬───────────────────────────────────────┘
|
||
│ mTLS/QUIC
|
||
┌────────────────────────▼───────────────────────────────────────┐
|
||
│ VELOCITY CLUSTER │
|
||
│ Java 21, Velocity 3.4+, x20 нод │
|
||
│ Domain check → HMAC verify → Physics → CAPTCHA → Router │
|
||
└────────────────────────┬───────────────────────────────────────┘
|
||
│
|
||
┌───────────────┼───────────────┐
|
||
▼ ▼ ▼
|
||
Hub (x100) Game Servers Game Servers
|
||
лобби Survival (x100) Skyblock (x100)
|
||
разные VDS/дедики
|
||
```
|
||
|
||
## Требования к хостингу
|
||
|
||
| Нода | Роль | CPU | RAM | Тип | XDP |
|
||
|------|------|-----|-----|-----|-----|
|
||
| **Edge** | XDP + PoW + фильтрация | 2-4 vCPU | 2-4 GB | KVM / Bare Metal | ✅ |
|
||
| **Velocity** | MC Proxy + верификация | 4 vCPU | 4-8 GB | KVM | ❌ |
|
||
| **Manager** | API + Redis | 2-4 vCPU | 4-8 GB | KVM | ❌ |
|
||
| **Hub** | Лобби | 4-8 vCPU | 8-16 GB | KVM / Bare Metal | ❌ |
|
||
| **Game** | Игровой процесс | 4-8 vCPU | 8-32 GB | KVM / Bare Metal | ❌ |
|
||
|
||
> ⚠️ XDP требует KVM или Bare Metal. OpenVZ/LXC контейнеры — XDP не работает.
|
||
> Проверить: `systemd-detect-virt`
|
||
|
||
## Sizing guide
|
||
|
||
| Игроков | Edge нод | Velocity нод | Edge RAM | Стоимость/мес |
|
||
|---------|----------|--------------|----------|---------------|
|
||
| до 500 | 1 | 2 | 2 GB | ~$15-30 |
|
||
| до 2 000 | 2 | 4 | 4 GB | ~$40-80 |
|
||
| до 10 000 | 4-6 | 8-10 | 8 GB | ~$150-300 |
|
||
| до 50 000 | 10-15 | 15-20 | 16 GB | ~$600-1200 |
|
||
|
||
## Граница XDP / Rust (критично)
|
||
|
||
```
|
||
XDP делает: Rust делает:
|
||
TCP state machine (stateful) PoW challenge (SHA256)
|
||
SYN throttle per-IP MC handshake парсинг
|
||
IP blacklist (LPM_TRIE) HMAC подпись hostname
|
||
Invalid TCP flags drop Rate limit (connections/sec)
|
||
UDP drop Death code auto-ban
|
||
Per-connection seq tracking GeoIP/ASN lookup
|
||
bpf_timer idle cleanup Blacklist (сложные правила)
|
||
```
|
||
|
||
XDP **не может**: SHA256, HMAC, floating point, heap allocation, сложные строки.
|
||
Всё L7 — только в Rust userspace.
|
||
|
||
## ADR-001: Rust для Edge Core
|
||
|
||
**Решение:** Rust + tokio
|
||
**Альтернативы:** Go (GC паузы), C (небезопасен), Java (память)
|
||
**Причина:** Zero-cost abstractions, memory safety, нет GC, libbpf-rs
|
||
|
||
## ADR-002: Redis как хранилище состояния
|
||
|
||
**Решение:** Redis + локальный кэш на edge нодах
|
||
**Оговорка:** При падении Redis — edge работает с кэшем, Velocity с кэшем серверов
|
||
**Масштаб:** Redis Cluster при 1000+ серверов, Redis Sentinel для HA
|
||
|
||
## ADR-003: NATS для критических событий
|
||
|
||
**Решение:** NATS JetStream для blacklist updates, attack events, audit log
|
||
**Причина:** Redis Pub/Sub — fire-and-forget, NATS — at-least-once delivery
|