feat!: universal redesign — drop Minecraft stack, single-crate architecture

- 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)
This commit is contained in:
loki5512344 2026-08-24 01:50:22 +02:00
parent 0b53ed720b
commit 15f474486a
Signed by: boba
GPG key ID: 253067914055423B
179 changed files with 5044 additions and 11519 deletions

View file

@ -1,6 +1,6 @@
# Стресс-тест Rampart на VDS (без Redis/Velocity/Paper)
# Стресс-тест Rampart на VDS (без Redis/ClickHouse)
Проверяет edge ноду (слои 1–3) на реальном VDS. Не требует Redis, Velocity, Paper или ClickHouse — только `rampart-core` и stub-бэкенд (socat echo) в одном контейнере.
Проверяет edge-ноду (слои 1–3) на реальном VDS. Не требует Redis, ClickHouse или внешних сервисов — только бинарь `rampart` и stub-бэкенд (socat echo) в одном контейнере.
## Топология
@ -9,7 +9,7 @@
│ docker bridge 172.30.0.0/24 │
│ │
│ rampart-edge (172.30.0.2) │
│ ├─ rampart-core :25565 (bind 0.0.0.0)│
│ ├─ rampart :25565 (bind 0.0.0.0)│
│ ├─ socat echo :25566 (127.0.0.1) │ ← stub бэкенд
│ └─ metrics :9090 │
│ │
@ -26,7 +26,7 @@
```bash
# 1. На VDS: клонировать репозиторий, собрать бинарь
git clone https://github.com/loki5512344/rampart.git && cd rampart
cargo build --release --bin rampart-core
cargo build --release --bin rampart
# 2. Запустить весь цикл (setup + 4 фазы)
# run-stress.sh сам найдёт бинарь (target/release), а папку — по себе (переменная DIR опциональна)
@ -40,21 +40,19 @@ bash run-stress.sh
| Фаза | Конфиг | Что делает | Проверяет |
|------|--------|-----------|-----------|
| A | `edge-high.toml` (лимиты 100k) | флуд валидными handshake с 100 IP | сырую пропускную способность L7 |
| B | `edge-defense.toml` (дефолт 5 pps/IP) | та же атака | rate limit + reputation ban, доступность легитимных клиентов |
| A | `edge-high.toml` (лимиты 100k) | TCP connect flood со 100 IP | сырую пропускную способность L4 |
| B | `edge-defense.toml` (дефолтные лимиты) | та же атака | rate limit + reputation ban, доступность легитимных клиентов |
| C | — | SYN flood hping3 (rand-source) | поведение без XDP (обрабатывает kernel) |
| D | `edge-high.toml` | 300 keepalive-коннектов | удержание активных соединений |
Во время фаз A и B параллельно подключается `legit.py` (легитимные MC клиенты), меряющий RTT — доказывает, что реальные игроки проходят во время атаки.
Во время фаз A и B параллельно подключается `legit.py` (generic TCP-клиенты), меряющий RTT — доказывает, что реальные клиенты проходят во время атаки.
## Атака маскируется под обычный трафик
## Атаки
`flood.py` шлёт **валидные** Minecraft handshake (протокол 767, packet id 0x00) со случайными hostname из пула (`play.example.com`, `mc.example.com`, ...) и ждёт ответ бэкенда — на уровне L7 флуд неотличим от легитимного клиента. Различие даёт только per-IP rate limit и репутация.
`flood.py` открывает чистые TCP-соединения (connect / slowloris / keepalive режимы) со случайных source IP. Никакой протокольной маскировки нет: на уровне L3/L4 флуд неотличим от легитимного трафика. Различие даёт только per-IP rate limit и репутация.
## Метрики для сбора
```bash
curl -s http://127.0.0.1:9090/metrics | grep -E 'rampart_(connections_total|pow_challenges|attack_status)'
curl -s http://127.0.0.1:9090/metrics | grep -E 'rampart_(connections_total|rate_limit_hits|attack_status)'
```
См. [load-test-report.md](../../research/load-test-report.md) — результаты прогона на VDS (2026-08-04).