ADR-001: Стратегия защиты от DDoS-атак¶
| Статус | Принято — Фаза 1 активна, Фаза 2 не активирована |
| Дата | 2026-08-07 |
| Обновлено | 2026-08-14 |
| Пересматривать | При достижении 10 000 активных туннелей или первой реальной volumetric-атаке |
Текущее состояние (2026-08-14)¶
Активно:
- Фаза 1 — встроенная защита dixu_proxy (rate-limit, diversity-ban, anti-enumeration)
- Cloudflare Free — DNS-резолвер для dix.su (NS переехали с Reg.ru на CF)
- Cloudflare API используется для: wildcard-сертификата *.dix.su (DNS-01 via certbot) и E2E-сертификатов пользователей приватного режима (CloudflareDnsService)
Не активировано:
- Cloudflare proxy-режим (*.dix.su, dix.su) — требует тарифа Pro ($20/мес); реальный IP VPS публично виден
- DDoS-защита L3/L4 через Cloudflare
Причина перехода с Reg.ru на Cloudflare (2026-08): необходимость Cloudflare API для wildcard DNS-01 challenge; Reg.ru NS больше не используются.
Контекст¶
Платформа dix.su работает на одном VPS. Трафик входит через nginx (*.dix.su, dix.su),
прокси-сервис написан на Elixir (dixu_proxy), бэкенд — на Java (modulauth).
Возможные типы атак:
- Volumetric (L3/L4) — флуд пакетами, цель — забить входной канал VPS (10+ Gbps). Против этого прикладной код бессилен: канал кончается до nginx.
- Protocol/Application (L7) — перебор slug'ов, HTTP-флуд, сканирование аккаунтов. Это прикладной уровень, защита реализуема в коде прокси.
- Абьюз-атаки — использование платформы как плацдарма для атак на третьи стороны (C2-серверы, DDoS через туннель, фишинг).
На текущем этапе (ранняя аудитория, один VPS) серьёзный volumetric DDoS маловероятен экономически — стоимость атаки несопоставима с масштабом цели.
Решение¶
Фаза 1 — Встроенная защита (текущее состояние, уже реализовано)¶
Реализована в dixu_proxy без внешних зависимостей:
| Механизм | Параметры | Цель |
|---|---|---|
| Rate limit по IP (HTTP) | 20 req/min → тихий отказ; 100 req/min → бан 30 мин | Анти-флуд на уровне приложения |
| Rate limit по IP (TCP) | Soft + hard лимит хендшейков | Защита TCP-туннелей |
| Diversity-ban | 8+ разных slug'ов с одного IP за 5 мин → бан 2 часа | Анти-сканирование/энумерация slug'ов |
| Лимит соединений | 100 одновременных TCP на IP по всем портам | Защита от истощения FD/процессов |
| Anti-enumeration | Одинаковое сообщение «no tunnel connected» для офлайн и несуществующих slug'ов | Скрытие информации о существующих аккаунтах |
| nginx | Входная точка, базовый HTTP rate limit | Первый барьер для L7 |
Ограничения Фазы 1: не защищает от volumetric L3/L4 атак — при флуде от ~1 Gbps канал VPS исчерпывается раньше, чем прикладной код успевает среагировать.
Фаза 2 — Внешняя защита (при росте или первой реальной атаке)¶
Выбранный вариант: Cloudflare Pro ($20/мес)
Обоснование:
- Wildcard-проксирование *.dix.su требует тарифа Pro — на бесплатном недоступно
- Cloudflare закрывает L3/L4/L7 без архитектурных изменений на стороне VPS
- Смена: NS-записи домена → Cloudflare, включить proxy-режим для *.dix.su и dix.su
- Magic Transit или аналог не нужен на этом этапе
Резервный вариант: Яндекс Cloud SmartWeb Security
Используется если: - Появятся корпоративные клиенты с требованием «трафик не выходит из РФ» (152-ФЗ / ФСТЭК) - Cloudflare станет недоступен для РФ-аудитории инфраструктурно
Минус: требует перестройки входной точки (либо NS на YC, либо upstream через YC Load Balancer), цена при росте трафика выше чем у Cloudflare.
Не выбрано: собственный scrubbing (fail2ban + iptables + BGP Blackhole)
- Эффективен только до ~1 Gbps
- Операционная нагрузка несоразмерна пользе на текущем масштабе
- VPS-провайдер сам заблокирует IP при серьёзном флуде (нулевой routing)
Последствия¶
Принятые риски (Фаза 1): - Volumetric атака объёмом > 1 Gbps приведёт к недоступности сервиса. Приемлемо: вероятность низкая, экономика атаки нецелесообразна для текущего масштаба.
Триггеры перехода на Фазу 2: - Первая реальная volumetric атака (даже одна) - ≥ 10 000 активных туннелей - Появление корпоративных клиентов с SLA-требованиями
Архитектурное ограничение Фазы 2:
- Cloudflare в proxy-режиме меняет IP посетителя в заголовках; dixu_proxy должен
читать CF-Connecting-IP вместо remote_ip. Потребуется небольшое изменение в коде прокси.
- При включении Cloudflare TCP-туннели (порты 2222, 4432, 4306, 4379, 4017) останутся
вне Cloudflare-проксирования — они работают напрямую на IP VPS. Это ожидаемое поведение,
Cloudflare не проксирует произвольные TCP-порты.
Смотрите также¶
- Безопасность и защита от абуза — детали реализации rate-limiting
- Масштабирование — план роста инфраструктуры