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:
parent
0b53ed720b
commit
15f474486a
179 changed files with 5044 additions and 11519 deletions
284
docs/runbook.md
284
docs/runbook.md
|
|
@ -4,281 +4,155 @@
|
|||
|
||||
---
|
||||
|
||||
## 1. DDoS атака - пошагово (3 ночи, вы сонный)
|
||||
## 1. DDoS атака — пошагово
|
||||
|
||||
```bash
|
||||
# ── ШАГ 1: Подтвердить атаку ──
|
||||
|
||||
# Открыть Grafana → посмотреть алерты
|
||||
# Или в CLI:
|
||||
curl -s http://localhost:9090/api/v1/alerts | jq '.data.alerts[] | select(.state=="firing")'
|
||||
# Метрики edge ноды
|
||||
curl -s http://EDGE_IP:9090/metrics | grep -E "rampart_(connections|rate_limit|attack_status)"
|
||||
|
||||
# Проверить метрики edge ноды
|
||||
curl -s http://EDGE_IP:9090/metrics | grep -E "rampart_(connections|rate_limit|blocked)"
|
||||
# rampart_attack_status: 0 = normal, 1 = suspicious, 2 = under_attack
|
||||
# (детектор по порогу pps, см. src/traffic/detector.rs)
|
||||
|
||||
# ── ШАГ 2: Определить тип атаки ──
|
||||
|
||||
# Если CPU < 50% и много DROP → XDP работает, атака L3/L4
|
||||
# Если CPU > 80% → атака L7 (handshake flood)
|
||||
# Много SYN без завершения handshake → L3/L4, смотрим kernel/XDP
|
||||
ss -s
|
||||
|
||||
# Проверка XDP счётчиков
|
||||
cat /sys/kernel/debug/tracing/trace_pipe | head -20
|
||||
# Много установленных коннектов с малым трафиком → slow-атака (L4)
|
||||
# Много коннектов/сек с одних IP → connection flood
|
||||
|
||||
# ── ШАГ 3: Действия ──
|
||||
# ── ШАГ 3: Действия через конфиг (правка + рестарт) ──
|
||||
|
||||
# A) SYN flood (XDP справляется)
|
||||
# → просто наблюдаем, XDP дропает на уровне ядра
|
||||
# → проверить CPU: должен быть < 30%
|
||||
echo "Наблюдаем, XDP работает"
|
||||
# A) Connection flood → ужесточить per-IP лимиты в /etc/rampart/config.toml:
|
||||
# [limits]
|
||||
# rate_limit_pps = 2.0
|
||||
# rate_limit_burst = 5.0
|
||||
# max_connections_per_ip = 5
|
||||
systemctl restart rampart
|
||||
|
||||
# B) Handshake flood (L7)
|
||||
# → Ужесточить rate limit на лету
|
||||
rampart config set rate_limit_login_pps 2
|
||||
rampart config set rate_limit_burst 5
|
||||
# B) Атака с известных подсетей → внести в blacklist через Manager API или CLI:
|
||||
rampart-cli blacklist add 1.2.3.4 "ddos source"
|
||||
rampart-cli blacklist list
|
||||
|
||||
# → Включить emergency mode (только whitelist)
|
||||
rampart emergency --enable
|
||||
# Это блокирует все IP кроме whitelist (доверенные ASN, verified players)
|
||||
# C) Доверенные IP (мониторинг, админы) → whitelist в config.toml
|
||||
# (только IP-адреса), затем systemctl restart rampart
|
||||
|
||||
# C) Атака с датацентров
|
||||
# → Заблокировать ASN
|
||||
rampart blacklist add asn 16276 # OVH
|
||||
rampart blacklist add asn 24940 # Hetzner
|
||||
|
||||
# → Включить GeoIP фильтр (блокировать страну)
|
||||
rampart geoip block CN RU
|
||||
|
||||
# D) Атака на конкретный протокол
|
||||
# → Временно заблокировать статус пинги
|
||||
rampart config set rate_limit_status_pps 0.1
|
||||
|
||||
# → Заблокировать старые версии протокола
|
||||
rampart config set min_protocol_version 765
|
||||
# D) Повысить стоимость флуда → включить PoW:
|
||||
# [pow]
|
||||
# enabled = true
|
||||
# difficulty = 5
|
||||
systemctl restart rampart
|
||||
|
||||
# ── ШАГ 4: Если не помогает ──
|
||||
|
||||
# Включить challenge для ВСЕХ новых подключений
|
||||
rampart challenge --mode all --type timing
|
||||
# Emergency mode (через CLI):
|
||||
rampart-cli emergency enable
|
||||
# ... и обратно после атаки:
|
||||
rampart-cli emergency disable
|
||||
|
||||
# В крайнем случае - отключить все не-WG порты на edge
|
||||
systemctl stop rampart-edge
|
||||
# В крайнем случае — закрыть порт на firewall и разбираться:
|
||||
iptables -A INPUT -p tcp --dport 25565 -j DROP
|
||||
# Игроки не заходят, но серверы в безопасности
|
||||
# Проверить через провайдера: возможно у них есть tools для фильтрации
|
||||
|
||||
# ── ШАГ 5: После атаки ──
|
||||
|
||||
# Выключить emergency mode
|
||||
rampart emergency --disable
|
||||
|
||||
# Проверить логи в ClickHouse
|
||||
clickhouse-client --query "
|
||||
SELECT src_country, count() as attacks
|
||||
FROM rampart.blocked
|
||||
WHERE ts > now() - INTERVAL 1 HOUR
|
||||
GROUP BY src_country
|
||||
ORDER BY attacks DESC
|
||||
LIMIT 10
|
||||
"
|
||||
# События атак пишутся в ClickHouse (если настроен clickhouse_url):
|
||||
clickhouse-client --query "SELECT count() FROM rampart.events WHERE event_type='attack'"
|
||||
|
||||
# Написать post-mortem
|
||||
```
|
||||
|
||||
---
|
||||
> Честно: hot-reload конфига не реализован — изменения применяются рестартом.
|
||||
> ASN/CIDR-баны, GeoIP-блокировки стран и выбор типов challenge через CLI не
|
||||
> реализованы; blacklist принимает цели в том виде, в котором их хранит Manager.
|
||||
|
||||
## 2. Edge нода не стартует
|
||||
|
||||
```bash
|
||||
# 1. Проверить статус
|
||||
systemctl status rampart-edge
|
||||
systemctl status rampart
|
||||
journalctl -u rampart -n 50 --no-pager
|
||||
|
||||
# 2. Логи
|
||||
journalctl -u rampart-edge -n 50 --no-pager
|
||||
# Типичные причины:
|
||||
|
||||
# 3. Типичные причины:
|
||||
|
||||
# A) Порт занят
|
||||
# A) Порт занят
|
||||
ss -tlnp | grep 25565
|
||||
# Решение: сменить порт в /etc/rampart/config.toml
|
||||
|
||||
# B) Конфиг не валидный
|
||||
rampart config validate /etc/rampart/config.toml
|
||||
# B) Конфиг невалиден — проверь парсингом теста:
|
||||
cargo test --test config_parse
|
||||
# Или запусти вручную и прочитай ошибку:
|
||||
RAMPART_CONFIG=/etc/rampart/config.toml /usr/local/bin/rampart
|
||||
|
||||
# C) libbpf не найден (если собрано с XDP)
|
||||
ldd /usr/local/bin/rampart-core | grep bpf
|
||||
# Решение: apt-get install libbpf-dev
|
||||
# C) Нет ни одного protocol handler
|
||||
# rampart требует зарегистрированный ProtocolHandler (feature protocol-http
|
||||
# или внешний крейт). Пока плагинов нет — edge в исследовательском режиме.
|
||||
|
||||
# D) Нет прав на BPF
|
||||
# Решение: sudo setcap cap_bpf+ep /usr/local/bin/rampart-core
|
||||
|
||||
# 4. Запуск вручную (для диагностики)
|
||||
/usr/local/bin/rampart-core --config /etc/rampart/config.toml --verbose
|
||||
# D) XDP не загрузился
|
||||
journalctl -u rampart | grep -i xdp
|
||||
# Временное решение: [xdp] enabled = false в config.toml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. XDP не загружается
|
||||
|
||||
```bash
|
||||
# 1. Проверить виртуализацию
|
||||
systemd-detect-virt
|
||||
# openvz/lxc → XDP не работает. Сменить провайдера.
|
||||
|
||||
# 2. Проверить версию ядра
|
||||
uname -r
|
||||
# < 5.10 → обновить ядро
|
||||
|
||||
# 3. Проверить драйвер
|
||||
systemd-detect-virt # openvz/lxc → XDP не работает, нужен KVM
|
||||
uname -r # нужно 5.10+
|
||||
ethtool -i eth0 | grep driver
|
||||
# virtio → только generic mode
|
||||
# i40e/mlx5 → native mode
|
||||
|
||||
# 4. Проверить XDP поддержку
|
||||
sudo ip link set dev eth0 xdp off 2>&1
|
||||
# "Operation not supported" → XDP не поддерживается
|
||||
# Проверить компиляцию BPF-программы:
|
||||
clang -O2 -g -target bpf -c xdp/core/universal_filter.c -o /tmp/universal_filter.o
|
||||
|
||||
# 5. Решение: отключить XDP в config.toml
|
||||
# [xdp]
|
||||
# enabled = false
|
||||
# И перезапустить edge
|
||||
systemctl restart rampart-edge
|
||||
# Отключить XDP:
|
||||
# [xdp] enabled = false → systemctl restart rampart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. Игроки не могут зайти
|
||||
## 4. Клиенты не могут подключиться
|
||||
|
||||
```bash
|
||||
# 1. Проверить edge ноду
|
||||
curl -s http://EDGE_IP:9090/metrics | grep rampart_connections
|
||||
# Если 0 → edge не принимает соединения
|
||||
|
||||
# 2. Проверить что порт открыт
|
||||
nc -zv EDGE_IP 25565
|
||||
|
||||
# 3. Проверить HMAC
|
||||
# На velocity: /logs/rampart-hmac.log
|
||||
# "HMAC mismatch" → не совпадает secret
|
||||
# "Direct IP blocked" → игрок подключился не через edge
|
||||
|
||||
# 4. Проверить firewall
|
||||
nc -zv EDGE_IP 25565 # порт открыт?
|
||||
iptables -L INPUT -n -v | grep 25565
|
||||
dig +short your.domain # DNS указывает на edge?
|
||||
|
||||
# 5. Проверить DNS
|
||||
dig +short play.example.com
|
||||
# Должен показывать IP edge ноды
|
||||
|
||||
# 6. Проверить rate limit
|
||||
# Если игроков много с одного IP (NAT) - превышают лимит
|
||||
rampart config set max_connections_per_ip 50 # увеличить
|
||||
# NAT: много клиентов за одним IP упираются в max_connections_per_ip — увеличь.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Высокая нагрузка на edge
|
||||
|
||||
```bash
|
||||
# 1. Определить bottleneck
|
||||
htop -p $(pgrep -d',' rampart)
|
||||
iftop -i eth0 # pps/bandwidth
|
||||
|
||||
# CPU
|
||||
htop -p $(pgrep -d',' rampart-core)
|
||||
|
||||
# Память
|
||||
ps aux | grep rampart-core
|
||||
|
||||
# I/O (если много логов)
|
||||
iotop
|
||||
|
||||
# Сеть (pps, bandwidth)
|
||||
iftop -i eth0
|
||||
|
||||
# 2. Типичные причины:
|
||||
|
||||
# A) Не хватает воркеров
|
||||
# → Увеличить workers = vCPU
|
||||
rampart config set workers_count $(nproc)
|
||||
systemctl restart rampart-edge
|
||||
|
||||
# B) CPU > 80% от L7 парсинга
|
||||
# → Включить XDP чтобы разгрузить userspace
|
||||
# → Уменьшить rate_limit до разумных пределов
|
||||
# → Проверить что нет SQL injection или других атак (парсинг hostname!)
|
||||
|
||||
# C) Утечка памяти
|
||||
# → Проверить RSS за последние часы
|
||||
# → Если растёт - включить профилирование
|
||||
rampart debug pprof
|
||||
|
||||
# 3. Временное решение
|
||||
rampart config set max_connections 50000 # ограничить
|
||||
|
||||
# 4. Постоянное решение
|
||||
# Добавить ещё одну edge ноду
|
||||
rampart add-node --role edge --name edge-eu-2 --ip 45.200.10.2
|
||||
# Не хватает воркеров → [workers] count = vCPU, рестарт.
|
||||
# CPU > 80% от userspace → включи XDP ([xdp] enabled = true),
|
||||
# чтобы дропать мусор раньше, и ужесточи rate limit.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. ClickHouse переполнен
|
||||
|
||||
```bash
|
||||
# 1. Проверить дисковое пространство
|
||||
df -h /var/lib/clickhouse
|
||||
|
||||
# 2. Очистить старые партиции (> 90 дней)
|
||||
clickhouse-client --query "
|
||||
SELECT partition, formatReadableSize(bytes_on_disk)
|
||||
FROM system.parts
|
||||
WHERE table = 'blocked'
|
||||
ORDER BY partition
|
||||
"
|
||||
|
||||
# Удалить старые
|
||||
clickhouse-client --query "
|
||||
ALTER TABLE rampart.blocked DROP PARTITION '2025-01'
|
||||
"
|
||||
|
||||
# 3. Настроить TTL если не сделано
|
||||
clickhouse-client --query "
|
||||
ALTER TABLE rampart.blocked
|
||||
MODIFY TTL ts + INTERVAL 90 DAY
|
||||
"
|
||||
|
||||
# 4. Отключить логирование на время (если совсем плохо)
|
||||
rampart config set clickhouse_enabled false
|
||||
# Данные складываются в буфер, не теряются
|
||||
clickhouse-client --query "ALTER TABLE rampart.events MODIFY TTL ts + INTERVAL 90 DAY"
|
||||
# Временное отключение записи: закомментируй clickhouse_url в config.toml, рестарт.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 7. Краткий справочник команд
|
||||
|
||||
```bash
|
||||
rampart status # Общее состояние системы
|
||||
rampart doctor # Полная диагностика
|
||||
|
||||
rampart config get workers.count # Получить параметр
|
||||
rampart config set workers.count 4 # Установить параметр (hot reload)
|
||||
|
||||
rampart blacklist add 1.2.3.4 # Забанить IP
|
||||
rampart blacklist add asn 24940 # Забанить ASN
|
||||
rampart blacklist list # Список забаненных
|
||||
rampart blacklist remove 1.2.3.4 # Разбанить
|
||||
|
||||
rampart whitelist add 10.0.0.0/16 # Добавить в whitelist
|
||||
rampart emergency --enable # Включить emergency mode
|
||||
rampart emergency --disable # Выключить
|
||||
|
||||
rampart drain edge-eu-1 # Плавно вывести ноду
|
||||
rampart reload backend # Перезагрузить список бэкендов
|
||||
rampart pki rotate --role edge # Ротация сертификатов
|
||||
rampart wg sync # Синхронизация WireGuard
|
||||
|
||||
rampart debug pprof # CPU профиль
|
||||
rampart debug heap # Heap профиль
|
||||
rampart debug metrics # Prometheus метрики в CLI
|
||||
rampart-cli status # Общее состояние системы
|
||||
rampart-cli doctor # Полная диагностика
|
||||
rampart-cli config get <key> # Получить параметр
|
||||
rampart-cli config set <key> <value> # Установить параметр
|
||||
rampart-cli blacklist add <target> [reason]
|
||||
rampart-cli blacklist remove <target>
|
||||
rampart-cli blacklist list
|
||||
rampart-cli emergency enable|disable # Emergency mode
|
||||
rampart-cli drain <node> # Плавно вывести ноду
|
||||
```
|
||||
|
||||
Полный список: `rampart-cli --help` (источник — src/bin/rampart-cli.rs).
|
||||
|
||||
---
|
||||
|
||||
*Версия: 1.0 | Июль 2026*
|
||||
*Версия: 2.0 | Август 2026*
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue