Что делать, когда идёт атака
Базовая очистка L3/L4 работает всегда и включается автоматически при 3 Гбит/с или 400 000 пакетов в секунду на адрес — большую часть объёмных атак вы просто не заметите. Проблемы начинаются, когда атака идёт на уровне приложения: трафика мало, а сервер лежит.
1. Сначала убедитесь, что это атака
Половина обращений «нас ддосят» заканчивается находкой в собственном коде: неудачная миграция, забытый цикл, поисковый робот на тяжёлой странице без кеша, собственный крон, запущенный в двадцать потоков.
uptime # средняя нагрузка
ss -s # сводка по соединениям
ss -tn state established | wc -l # сколько установленных
ss -tn state syn-recv | wc -l # полуоткрытые — признак SYN-флуда
vnstat -tr 10 # реальная скорость на интерфейсе
Много syn-recv при небольшом числе established — похоже на SYN-флуд. Много established с одного диапазона адресов — прикладная атака. Нагрузка высокая, а соединений мало — ищите проблему у себя.
2. Посмотрите, кто именно приходит
# топ адресов по числу соединений
ss -tn state established | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
# топ адресов в логе nginx за последние 10 000 запросов
tail -10000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
# какие страницы запрашивают
tail -10000 /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20
Если 90 % запросов идёт на одну и ту же страницу поиска или на /wp-login.php — картина ясна.
3. Быстрые меры на своей стороне
Ограничение частоты в nginx
limit_req_zone $binary_remote_addr zone=perip:16m rate=8r/s;
limit_conn_zone $binary_remote_addr zone=conn:16m;
server {
limit_req zone=perip burst=24 nodelay;
limit_conn conn 24;
...
}
Восемь запросов в секунду с адреса достаточно для живого человека и мало для скрипта. burst сглаживает всплески при загрузке страницы со множеством файлов.
Отсечение по признакам
if ($http_user_agent ~* "(curl|python-requests|scrapy)") { return 444; }
444 — закрыть соединение без ответа. Не тратим ресурсы на генерацию страницы ошибки.
Блокировка подсети в nftables
nft add rule inet filter input ip saddr 203.0.113.0/24 drop
Кеш перед приложением
Самая эффективная мера при прикладной атаке. Если страница отдаётся из кеша, ей всё равно, сколько запросов пришло:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=st:64m inactive=10m max_size=2g;
proxy_cache st;
proxy_cache_valid 200 60s;
proxy_cache_use_stale error timeout updating;
4. Что делаем мы
При превышении порогов трафик на ваш адрес автоматически уводится через скрубберы. Вы этого не увидите: задержка растёт на доли миллисекунды, легитимные соединения не рвутся. Ёмкость очистки — 1,5 Тбит/с.
Отражённые атаки видны в панели в разделе метрик: количество событий за 30 дней, пиковая полоса, тип. Если атака идёт волнами и профиль по умолчанию срабатывает поздно — напишите, мы понизим порог именно для вашего адреса.
5. Когда включать L7-фильтр
Опция за 612 ₽ в месяц имеет смысл, если:
- трафика немного (сотни мегабит), но сервер задыхается — значит, атака прикладная, и L3/L4 тут бессилен;
- запросы выглядят как обычные HTTP-запросы браузера и приходят с тысяч разных адресов;
- ограничения в nginx уже настроены, но отсекают и живых пользователей.
Фильтр включается на уровне сети: проверка JavaScript-челленджем, разбор поведения, WAF-правила. Включение занимает 10–15 минут после обращения в тикет, отключение — мгновенно.
6. Что писать в тикет
Чем конкретнее обращение, тем быстрее разбор. Приложите:
- IP-адрес сервера и точное время начала проблемы с часовым поясом;
- вывод
ss -sиuptime; - двадцать строк топа адресов из раздела 2;
- что уже сделали сами;
- приоритет: если сервер недоступен — «Критический», медиана ответа по нему шесть минут.
7. Чего делать не стоит
- Перезагружать сервер по кругу. Атака не прекратится, а вы потеряете возможность посмотреть, что происходит.
- Блокировать целые страны наугад. Отсечёте живых пользователей, а ботнет распределён и по вашей стране тоже.
- Отключать ICMP полностью. Сломаете определение MTU и получите вторую проблему поверх первой.
- Менять IP при первых признаках. Смена адреса помогает только при точечной атаке на конкретный IP; при атаке на домен новый адрес найдут через минуту.
Профилактика
- Кеширование перед приложением — включите заранее, а не в момент атаки.
- Ограничения частоты в nginx настроены до того, как понадобились.
- Тяжёлые эндпоинты (поиск, экспорт, генерация PDF) закрыты авторизацией или ограничены отдельно.
- Реальный IP сервера не светится в DNS-истории домена, если перед ним стоит прокси.
- Мониторинг с оповещением: вы должны узнавать о проблеме от системы, а не от пользователей.