guard/docs/research/architecture.md
loki5512344 cf9608ce5d
Initial commit: Rampart v0.2.0
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
2026-07-20 20:53:32 +02:00

127 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Architecture - Rampart
> Актуально: v0.1+
> Статус: основной документ
---
## Компоненты системы
```
┌─────────────────────────────────────────────────────────────────┐
│ EDGE LAYER │
│ XDP/eBPF (C) → Rust Core → mTLS/QUIC → Manager │
└─────────────────────────┬───────────────────────────────────────┘
│ чистый трафик
┌─────────────────────────▼───────────────────────────────────────┐
│ PROXY LAYER │
│ Rust Load Balancer → Velocity Cluster (x20) │
└─────────────────────────┬───────────────────────────────────────┘
│
┌─────────────────┼──────────────────┐
▼ ▼ ▼
Hub (x100) Game Servers Game Servers
лобби Survival (x100) Skyblock (x100)
разные VDS/дедики
```
## Типы нод и требования к хостингу
| Нода | Роль | CPU | RAM | Тип VDS | XDP нужен |
|---|---|---|---|---|---|
| **Edge** | Фильтрация DDoS | 2-4 vCPU | 2-4 GB | KVM / Bare Metal | ✅ |
| **Load Balancer** | L4 балансировка | 2 vCPU | 2 GB | KVM | ❌ |
| **Velocity** | MC Proxy | 4 vCPU | 4-8 GB | KVM | ❌ |
| **Manager** | API + Redis + NATS | 2-4 vCPU | 4-8 GB | KVM | ❌ |
| **Hub** | Лобби сервер | 4-8 vCPU | 8-16 GB | KVM / Bare Metal | ❌ |
| **Game Server** | Игровой процесс | 4-8 vCPU | 8-32 GB | KVM / Bare Metal | ❌ |
> ⚠️ **Важно:** XDP требует KVM или Bare Metal.
> OpenVZ / LXC контейнеры - XDP не работает вообще.
> Проверить тип виртуализации: `systemd-detect-virt`
## Sizing Guide
| Игроков онлайн | Edge нод | Velocity нод | Память Edge | Стоимость/мес (примерно) |
|---|---|---|---|---|
| до 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 |
> Цены ориентировочные для Hetzner/Contabo/Vultr. Bare Metal дешевле при большом трафике.
## Выбор WireGuard решения (для v0.1-v0.3)
**Используем hub-and-spoke + wg-quick.** Это просто, надёжно, понятно.
```
Manager нода = WireGuard Hub (10.0.0.1)
Все остальные ноды = Spoke, пиры с Hub
```
Headscale / Nebula / Tailscale - рассматриваем в v0.6+, когда нод станет 50+.
## Граница XDP / Rust (важно)
```
XDP делает: Rust делает:
L3: IP блэклист L7: MC handshake парсинг
L4: SYN flood drop HMAC подпись hostname
L4: rate limit (pps) rate limit (connections/sec)
L4: invalid TCP flags блэклист (сложные правила)
L4: UDP drop (MC=TCP) bot challenge
GeoIP/ASN lookup
```
XDP **не делает** HMAC, SHA256, GeoIP lookup - нет floating point до kernel 6.x,
нет доступа к heap, нет сложной логики. Всё L7 - только в Rust userspace.
## C4 - Container Diagram
```mermaid
graph TB
subgraph Edge["Edge Layer (VDS)"]
XDP[XDP Filter\nC/eBPF\nL3/L4 only]
Core[Rust Core\nL7 filter + HMAC]
end
subgraph Core_Infra["Core Infrastructure"]
LB[Rust Load Balancer]
Vel[Velocity Cluster\nJava x20]
Mgr[Manager API\nRust + Axum]
Redis[(Redis\nServer Registry\nBlacklist)]
NATS[NATS JetStream\nCritical Events]
CH[(ClickHouse\nAttack Log)]
end
subgraph Backends["Game Backends (WireGuard)"]
Hub[Hub x100]
Game[Game Servers x300]
end
XDP --> Core --> LB --> Vel --> Hub --> Game
Core -->|blacklist events| NATS
NATS --> Mgr
Mgr --> Redis
Mgr --> CH
Vel <-->|server registry| Redis
```
## 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
**Redis Pub/Sub оставляем для:** server registry updates, global chat (потеря допустима)