Тема
Режим
Язык
Тема
Режим
Язык
Регистрация
FREE Бесплатный аудит сайта за 15 мин Заказать →

Как понять, что это DDoS, а не падение сервера

15-минутный алгоритм диагностики: отличаем DDoS от релизной аварии, проблем базы, диска или backend. С командами, матрицей признаков и чек-листом.

Executive Summary для руководителя
💰

Финансовый риск

От 50 000 до 300 000 рублей в час из-за недоступности сайта для клиентов при атаке на прикладном уровне (L7), перерасхода ресурсов CPU/RAM хостинга.

📈

Влияние на KPI

Снижение конверсии заказов. Медленный отклик сайта (TTFB) ухудшает поведенческие факторы и пессимизирует поисковый трафик из Google и Яндекса.

⚠️

Уровень критичности

Высокий

👤

Кому поручить

DevOps-инженер / Бэкенд-разработчик

TL;DR: DDoS похож на обычный сбой: сайт лежит, клиенты пишут, метрики красные. Отличие — в форме нагрузки. Если растут входящий трафик, количество соединений, RPS, однотипные URL и география/IP-разброс, это атака. Если упирается база, диск, релиз или один backend — это чаще внутренний инцидент.

Ниже — быстрый 15-минутный алгоритм диагностики, который помогает не блокировать живых пользователей и не чинить не тот слой.

Главная ошибка
Не включайте все защиты подряд до диагностики. Так можно случайно закрыть оплату, API, поисковых ботов или нормальных клиентов.

Главная мысль

Когда сайт недоступен, первая ошибка — сразу считать это атакой. На практике нужно ответить на один вопрос: сайт лежит из-за внешнего трафика или из-за внутренней поломки?

Сайт лежит из-за внешнего трафика или из-за внутренней поломки?

Это решается не «на глаз», а по нескольким признакам: трафик, соединения, URL, статусы, backend, база и недавние изменения.

Быстрая матрица: DDoS или обычный сбой

Смотрите на форму нагрузки, а не только на факт недоступности сайта.

Признак Внешняя нагрузка Скорее DDoS Внутренняя причина Скорее сбой
Диагностика
Входящий трафик резко вырос обычный или ниже обычного
Соединения тысячи / много SYN-RECV обычное число соединений
IP-адреса много ASN и стран привычные клиенты или одна подсеть
URL один-два endpoint или всё подряд конкретная бизнес-операция
nginx / edge CPU/RPS высокий ждёт backend или почти не нагружен
База данных может быть нормальной locks/slow queries/CPU
Rollback не помогает часто помогает

* Бесплатный план — базовая поддержка. Полная 24/7 поддержка на Pro+ тарифах.

01

Проверьте: сервер жив или канал забит

Отделяем недоступность сервера от проблем публичного входа

Начните с самого грубого уровня: доступен ли сервер вообще и отвечает ли приложение локально.

ping -c 4 your-server-ip
ssh user@your-server "uptime"
ssh user@your-server "curl -I --max-time 3 http://127.0.0.1/"

Как читать результат:

  • ping и SSH не отвечают — возможно, забит канал или провайдер уже фильтрует трафик.
  • SSH работает, но сайт снаружи не открывается — вероятнее проблема на HTTP, reverse proxy, DNS или L7-уровне.
  • локальный curl быстрый, публичный домен лежит — смотрите edge, DNS, CDN/WAF и публичный вход.
  • локальный curl тоже медленный — ищите backend, базу, диск, CPU.
02

Посмотрите соединения: есть ли всплеск

Established и SYN-RECV быстро показывают форму нагрузки

Количество соединений и SYN-RECV быстро показывает, похоже ли это на сетевую атаку или на обычную backend-проблему.

ss -s
ss -tan state established | wc -l
ss -tan state syn-recv | wc -l

# Топ IP по соединениям
ss -tan | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
⚠️
Важно
Один IP с большим числом соединений — не всегда атака. Это может быть NAT корпоративного клиента, балансировщик, мониторинг или поисковый бот. Смотрите не только IP, но и URL, ASN и поведение.
03

Проверьте nginx/access logs

URL, User-Agent и статусы показывают L7-паттерн

L7 DDoS часто видно не по одному IP, а по форме запросов: повторяющиеся URL, дорогие POST, странные User-Agent, всплеск 499/502/503/504.

tail -50000 /var/log/nginx/access.log \
  | awk '{print $7}' \
  | sort | uniq -c | sort -rn | head -20

# Топ User-Agent
tail -50000 /var/log/nginx/access.log \
  | awk -F'"' '{print $6}' \
  | sort | uniq -c | sort -rn | head -20

# Топ HTTP-статусы
tail -50000 /var/log/nginx/access.log \
  | awk '{print $9}' \
  | sort | uniq -c | sort -rn

Признаки L7 DDoS:

  • много запросов на /login, /search, /api/*, /wp-login.php, /xmlrpc.php;
  • много 499, 502, 503, 504;
  • одинаковые User-Agent или наоборот полностью случайные;
  • всплеск POST на дорогие endpoint'ы;
  • RPS растёт, но реальные бизнес-события не растут.
04

Отличите DDoS от проблем базы данных

Locks, slow queries и пулы соединений часто имитируют атаку

Если HTTP-трафик не выглядит аномально, проверьте базу. Очень часто сайт «лежит как при атаке», но причина — lock, slow query или исчерпанный пул соединений.

-- PostgreSQL
SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state;

SELECT now() - query_start AS duration, state, query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration DESC
LIMIT 10;
MySQL
SHOW FULL PROCESSLIST;
SHOW ENGINE INNODB STATUS\G

Скорее внутренний сбой, если есть lock/wait, один медленный запрос держит очередь, rollback помогает или после отключения конкретной функции сайт оживает.

Скорее DDoS, если база не перегружена, но edge/nginx забит однотипными запросами и соединениями.

05

Проверьте недавние изменения

Релиз, DNS или CDN могут выглядеть как внешняя атака

Иногда «атака» совпадает с релизом, миграцией или изменением DNS. Это особенно часто происходит после рекламной рассылки, переезда CDN/WAF или обновления backend.

git log --oneline -5
systemctl list-timers --all | head
journalctl -u nginx --since "30 minutes ago" --no-pager | tail -100
journalctl -u your-app --since "30 minutes ago" --no-pager | tail -100

df -h
free -m
dmesg | tail -50
systemctl status nginx --no-pager
06

Мини-алгоритм на 15 минут

Что проверить по минутам и как принять решение

Минута 0–3: доступность

  • Проверить ping/SSH.
  • Проверить локальный curl 127.0.0.1.
  • Проверить публичный curl -I https://domain.ru.

Минута 3–6: нагрузка

  • uptime, top, ss -s.
  • Количество established/syn-recv соединений.
  • Входящий трафик на интерфейсе.

Минута 6–10: HTTP-форма атаки

  • Топ URL.
  • Топ IP.
  • Топ User-Agent.
  • Топ HTTP status.

Минута 10–15: решение

  • Если атака на L7 — включить challenge/WAF/rate-limit на конкретные пути.
  • Если SYN/UDP flood — эскалировать на провайдера или anti-DDoS, потому что серверный firewall может не помочь при забитом канале.
  • Если backend/DB — rollback, отключение тяжёлой функции, восстановление внутреннего инцидента.

Чек-лист диагностики

0 / 8

Пройдите пункты сверху вниз, прежде чем включать жёсткую фильтрацию.

Если SSH не открывается, возможно забит канал или включена фильтрация у провайдера.
Так отделяем проблему приложения от проблемы публичного входа.
Нужна не абсолютная цифра, а отклонение от обычного профиля.
Отдельно смотрите established и syn-recv.
Это показывает форму L7-атаки или обычной пользовательской нагрузки.
499/502/503/504 помогают понять, где рвётся цепочка.
Если база держит очередь, это может быть не DDoS.
Не лечите релизную аварию anti-DDoS правилами.
07

Что делать, если это DDoS

Действуем слоями и не ломаем нормальных пользователей

Не блокируйте всё подряд. Лучше действовать слоями.

  1. Зафиксируйте симптомы: время начала, RPS, трафик, топ URL, топ IP, статусы.
  2. Включите защиту на edge/CDN/WAF, если она есть.
  3. Ограничьте самые дорогие endpoint'ы: /login, /search, /api, корзина, checkout.
  4. Оставьте публичные статические страницы доступными, если бизнесу важны SEO и доверие.
  5. Не закрывайте бездумно Googlebot/Bingbot — проверяйте верификацию поисковых ботов.
  6. Если канал забит — переносите трафик за anti-DDoS/POP/scrubbing, локальные правила уже поздно применять.
08

Что делать, если это не DDoS

Rollback, отключение тяжёлой функции и сохранение фактов

Если признаки указывают на внутренний сбой: откатите последний релиз, отключите проблемную задачу или cron, временно упростите дорогой endpoint, включите maintenance/статическую страницу и сохраните логи для postmortem.

Важно: даже внутренний сбой может стать внешней проблемой. Когда сайт начинает отвечать медленно, клиенты и боты ретраят запросы, нагрузка растёт, и обычный инцидент превращается в self-DDoS.

09

Частые ошибки

Что чаще всего ухудшает инцидент

Блокировать по User-Agent

Фальшивый Googlebot легко подделать, а настоящий поисковый бот можно случайно закрыть. Проверяйте IP/rDNS или используйте провайдера, который умеет верифицировать crawler'ов.

Ставить challenge на весь сайт

Challenge на /login может быть нормальным. Challenge на публичные SEO-страницы, оплату или API мобильного приложения может сломать бизнес.

Лечить L3/L4 атаку nginx-правилами

Если забит канал, nginx уже не увидит трафик. Нужна фильтрация до вашего сервера: провайдер, scrubbing, anycast/POP.

Считать любой всплеск DDoS-ом

Реклама, рассылка, новость в СМИ, индексация поисковиком — тоже дают всплески. Отличайте плохой трафик от хорошего.

Нет. User-Agent легко подделать. Смотрите IP, ASN, частоту запросов, URL, cookie/session behavior и верификацию поисковых ботов.

Не обязательно. 502/504 могут быть следствием перегруженного backend, ошибки деплоя, базы данных или настоящей L7-атаки. Поэтому сначала проверяем upstream и логи приложения.

Обычно нет. Challenge на публичные SEO-страницы, оплату или API может сломать бизнес. Лучше включать защиту слоями и на конкретные дорогие endpoint'ы.

Не уверены, атака это или сбой?

Пришлите домен и симптомы: время начала, коды ошибок, RPS, топ URL. Мы быстро подскажем, какой слой горит и какой шаг безопаснее сделать первым.

Чек-лист проверки для владельца бизнеса

Скопируйте эти вопросы и отправьте вашему техническому директору (CTO) или руководителю разработки:

  • Настроена ли WAF-фильтрация для отсечения ботов с помощью JS-челленджей без показа капчи реальным пользователям?
  • Защищен ли веб-сервер от атак типа Slowloris путем оптимизации HTTP Keep-Alive таймаутов?
  • Проверено ли наше приложение на защиту от атак типа HTTP Request Smuggling и отравления кэша?

Словарь по теме

Reverse Proxy

Сервер-посредник между клиентами и backend-серверами. Скрывает реальные серверы, кэширует контент, фильтрует трафик.

Rate Limiting

Ограничение количества запросов с одного IP-адреса за определённый период времени. Первая линия защиты от ботов, брутфорса и простых DDoS-атак.

User-Agent

HTTP-заголовок, идентифицирующий браузер или программу. Боты часто имеют пустой или подозрительный User-Agent.

UDP Flood

Атака, при которой на сервер отправляется огромное количество UDP-пакетов на случайные порты, перегружая сетевой канал.

SYN Flood

Атака на сетевом уровне (L4), при которой атакующий отправляет множество SYN-пакетов, не завершая TCP-рукопожатие. Исчерпывает таблицу соединений сервера.

L7 атака

Атака на прикладном уровне (HTTP). Атакующий отправляет валидные HTTP-запросы, которые выглядят как обычные пользователи, но нагружают тяжёлые endpoint'ы.

Endpoint

URL-адрес, по которому доступен определённый ресурс или функция API. Например: /api/users, /login.

Anycast

Метод маршрутизации, при котором один IP-адрес ведёт к ближайшему из множества серверов. Используется CDN для распределения нагрузки.

Получите план защиты под ваш сайт

Оставьте контакт и адрес сайта — пришлём план защиты и список приоритетных шагов.

  • Приоритетные шаги на 7 дней
  • Быстрая обратная связь
  • План в удобном формате
Без спама. Можно указать Telegram (@username) или email.
Написать в Telegram