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
287 lines
7.8 KiB
Markdown
287 lines
7.8 KiB
Markdown
# Migration - Rampart
|
||
|
||
> Как обновляться между версиями без даунтайма.
|
||
|
||
---
|
||
|
||
## Общие принципы
|
||
|
||
1. **Читай CHANGELOG** перед обновлением
|
||
2. **Бэкап** перед любой миграцией: Redis RDB, конфиги, сертификаты
|
||
3. **Одна нода** сначала - тестируй на одной edge, потом на всех
|
||
4. **Откат** - всегда сохраняй предыдущую версию бинарника
|
||
|
||
---
|
||
|
||
## v0.1 → v0.2 (Redis + Registry)
|
||
|
||
### Изменения
|
||
- Edge нода начинает использовать Redis для синхронизации блэклиста
|
||
- Paper плагин пишет в Redis вместо локального YAML
|
||
- Velocity получает server registry из Redis
|
||
|
||
### Шаги
|
||
|
||
```bash
|
||
# 1. Поднять Redis (если ещё нет)
|
||
docker compose up -d redis
|
||
|
||
# 2. Настроить Redis пароль
|
||
echo "requirepass НОВЫЙ_ПАРОЛЬ" >> /etc/redis/redis.conf
|
||
systemctl restart redis
|
||
|
||
# 3. Обновить конфиг edge ноды
|
||
cat >> /etc/rampart/config.toml << 'EOF'
|
||
[store]
|
||
redis_url = "redis://:НОВЫЙ_ПАРОЛЬ@10.0.0.1:6379/0"
|
||
blacklist_cache_ttl_secs = 300
|
||
EOF
|
||
|
||
# 4. Обновить Paper плагин (перейти с file → redis)
|
||
sed -i 's/registration_mode: "file"/registration_mode: "redis"/' paper-global.yml
|
||
sed -i 's|# redis_url:|redis_url: "redis://:НОВЫЙ_ПАРОЛЬ@10.0.0.1:6379/0"|' paper-global.yml
|
||
|
||
# 5. Обновить Velocity плагин
|
||
# Добавить redis_url в velocity.toml
|
||
|
||
# 6. Рестарт по очереди (no downtime)
|
||
systemctl restart rampart-edge # по одной edge ноде
|
||
systemctl restart velocity # по одной velocity
|
||
# Paper плагины - reload через /reload команду
|
||
```
|
||
|
||
### Откат
|
||
|
||
```bash
|
||
# Если что-то пошло не так:
|
||
# 1. Вернуть registration_mode: "file" в paper-global.yml
|
||
# 2. Убрать redis_url из всех конфигов
|
||
# 3. Рестартнуть всё в обратном порядке
|
||
```
|
||
|
||
---
|
||
|
||
## v0.2 → v0.3 (Observability)
|
||
|
||
### Изменения
|
||
- Добавляются Prometheus метрики на всех компонентах
|
||
- ClickHouse для хранения attack log
|
||
- Grafana дашборды
|
||
|
||
### Шаги
|
||
|
||
```bash
|
||
# 1. Поднять стек мониторинга
|
||
docker compose up -d clickhouse prometheus grafana
|
||
|
||
# 2. Создать таблицы ClickHouse
|
||
clickhouse-client --query "
|
||
CREATE DATABASE IF NOT EXISTS rampart;
|
||
|
||
CREATE TABLE IF NOT EXISTS rampart.blocked (
|
||
ts DateTime CODEC(Delta, ZSTD),
|
||
edge LowCardinality(String),
|
||
src_ip IPv4,
|
||
src_asn UInt32,
|
||
src_country LowCardinality(FixedString(2)),
|
||
reason LowCardinality(String),
|
||
proto_ver Int32,
|
||
hostname String CODEC(ZSTD)
|
||
) ENGINE = MergeTree()
|
||
PARTITION BY toYYYYMM(ts)
|
||
ORDER BY (ts, edge, src_ip)
|
||
TTL ts + INTERVAL 90 DAY;
|
||
"
|
||
|
||
# 3. Настроить scrape targets в prometheus.yml
|
||
# 4. Импортировать Grafana dashboard
|
||
# 5. Ничего рестартить не нужно - метрики уже встроены
|
||
```
|
||
|
||
### Проверка
|
||
|
||
```bash
|
||
curl -s http://EDGE_IP:9090/metrics | grep rampart
|
||
```
|
||
|
||
---
|
||
|
||
## v0.3 → v0.4 (XDP)
|
||
|
||
### Изменения
|
||
- XDP программа на C
|
||
- libbpf-rs для загрузки в ядро
|
||
- Feature flag: `xdp`
|
||
|
||
### Шаги
|
||
|
||
```bash
|
||
# 1. Проверить совместимость
|
||
systemd-detect-virt # нужно kvm или none
|
||
uname -r # нужно 5.10+
|
||
ethtool -i eth0 # драйвер
|
||
|
||
# 2. Установить зависимости
|
||
sudo apt-get install -y libbpf-dev clang llvm linux-headers-$(uname -r)
|
||
|
||
# 3. Собрать с XDP
|
||
cargo build --release --features xdp
|
||
|
||
# 4. Обновить бинарник
|
||
cp /usr/local/bin/rampart-core /usr/local/bin/rampart-core.backup
|
||
cp target/release/rampart-core /usr/local/bin/
|
||
|
||
# 5. Включить XDP в конфиге
|
||
cat >> /etc/rampart/config.toml << 'EOF'
|
||
[xdp]
|
||
enabled = true
|
||
interface = "eth0"
|
||
EOF
|
||
|
||
# 6. Рестарт
|
||
systemctl restart rampart-edge
|
||
|
||
# 7. Проверить
|
||
journalctl -u rampart-edge | grep XDP
|
||
ip link show | grep xdp
|
||
```
|
||
|
||
### Откат
|
||
|
||
```bash
|
||
# Отключить XDP
|
||
rampart config set xdp_enabled false
|
||
systemctl restart rampart-edge
|
||
# Вернуть старый бинарник
|
||
cp /usr/local/bin/rampart-core.backup /usr/local/bin/rampart-core
|
||
```
|
||
|
||
---
|
||
|
||
## v0.4 → v0.5 (Anti-Bot)
|
||
|
||
### Изменения
|
||
- GeoIP (MaxMind GeoLite2)
|
||
- Sonar 3.0 интеграция
|
||
- Challenge API
|
||
|
||
### Шаги
|
||
|
||
```bash
|
||
# 1. Зарегистрироваться на maxmind.com, скачать GeoLite2-ASN
|
||
# 2. Разместить базу на Manager
|
||
mkdir -p /var/lib/rampart/geoip
|
||
cp GeoLite2-ASN.mmdb /var/lib/rampart/geoip/
|
||
|
||
# 3. Обновить конфиг edge
|
||
cat >> /etc/rampart/config.toml << 'EOF'
|
||
[geoip]
|
||
db_path = "/var/lib/rampart/geoip/GeoLite2-ASN.mmdb"
|
||
# ASN с повышенным скорингом
|
||
vpn_asns = [16276, 24940, 20473]
|
||
datacenter_asns = [16509, 14618, 8075]
|
||
EOF
|
||
|
||
# 4. Обновить Velocity плагин (с поддержкой Sonar)
|
||
cp plugins/velocity/target/rampart-velocity-*.jar /opt/velocity/plugins/
|
||
systemctl restart velocity
|
||
|
||
# 5. Проверить
|
||
rampart geoip lookup 1.2.3.4
|
||
```
|
||
|
||
---
|
||
|
||
## v0.5 → v0.6 (Scale + HA)
|
||
|
||
### Изменения
|
||
- Rust LB вместо HAProxy
|
||
- mTLS между всеми компонентами
|
||
- QUIC канал Edge ↔ Manager
|
||
- NATS JetStream
|
||
|
||
### Шаги
|
||
|
||
```bash
|
||
# 1. Развернуть NATS
|
||
docker compose up -d nats
|
||
|
||
# 2. Обновить конфиг Manager
|
||
cat >> /etc/rampart/manager.toml << 'EOF'
|
||
[nats]
|
||
urls = ["nats://127.0.0.1:4222"]
|
||
|
||
[quic]
|
||
bind = "0.0.0.0:7777"
|
||
EOF
|
||
|
||
# 3. Сгенерировать PKI
|
||
rampart pki init --root-ca rampart-ca
|
||
rampart pki issue --ca edge-ca --name edge-eu-1 --ip 10.0.100.1
|
||
rampart pki issue --ca infra-ca --name manager --ip 10.0.0.1
|
||
|
||
# 4. Развернуть сертификаты на все ноды
|
||
# 5. Включить mTLS в конфигах
|
||
# 6. Постепенно перевести трафик с HAProxy на Rust LB
|
||
```
|
||
|
||
### Миграция с HAProxy
|
||
|
||
```bash
|
||
# Фаза 1: Запустить Rust LB рядом с HAProxy
|
||
# (разные порты: HAProxy :25565, Rust LB :25566)
|
||
|
||
# Фаза 2: Переключить edge ноды на Rust LB
|
||
# (изменить backend.address в config.toml)
|
||
|
||
# Фаза 3: Остановить HAProxy
|
||
# (когда все edge переключены)
|
||
```
|
||
|
||
---
|
||
|
||
## v0.6 → v0.7 (Polish)
|
||
|
||
### Изменения
|
||
- io_uring runtime (feature flag)
|
||
- Zero-copy splice
|
||
- SLSA Level 3
|
||
|
||
### Шаги
|
||
|
||
```bash
|
||
# 1. Проверить io_uring доступность
|
||
cat /proc/sys/kernel/io_uring_disabled # 0 = OK
|
||
|
||
# 2. Собрать с io_uring
|
||
cargo build --release --features io-uring
|
||
|
||
# 3. Заменить бинарник
|
||
cp /usr/local/bin/rampart-core /usr/local/bin/rampart-core.epoll.backup
|
||
cp target/release/rampart-core /usr/local/bin/
|
||
systemctl restart rampart-edge
|
||
|
||
# 4. Проверить
|
||
journalctl -u rampart-edge | grep "io_uring"
|
||
|
||
# 5. Бенчмарк: сравнить производительность
|
||
tcpkali --connections 1000 --connect-rate 5000 --duration 30s EDGE_IP:25565
|
||
```
|
||
|
||
---
|
||
|
||
## Чеклист перед любой миграцией
|
||
|
||
```
|
||
☐ Прочитал CHANGELOG
|
||
☐ Сделал бэкап Redis: redis-cli SAVE
|
||
☐ Сделал бэкап конфигов: tar czf /backup/rampart-configs-$(date +%Y%m%d).tar.gz /etc/rampart/
|
||
☐ Сохранил старые бинарники
|
||
☐ Есть доступ к серверу через OOB/IPMI (на случай если сеть отвалится)
|
||
☐ Есть откат-план
|
||
☐ Предупредил команду в Discord
|
||
```
|
||
|
||
---
|
||
|
||
*Версия: 1.0 | Июль 2026*
|