Защита от DDoS L7 (Application Layer): методы и инструменты
Разбираем атаки на прикладной уровень - HTTP flood, Slowloris, RUDY, scraping. WAF, rate limiting, JS-challenge, JA3-fingerprinting, конфиги nginx.
DDoS-атаки на седьмой уровень модели OSI (Application Layer) - самый коварный класс угроз для веб-проектов. В отличие от объёмных L3/L4-флудов, L7-атаки не забивают канал гигабитами мусорного трафика. Они имитируют поведение реальных пользователей и истощают ресурсы приложения: CPU воркеров nginx/Apache, пул соединений с MySQL, лимиты PHP-FPM, очереди в Redis. Сайт перестаёт отвечать при нагрузке в десятки мегабит - формально DDoS-защита датацентра “не видит” атаки, потому что трафик легитимен на сетевом уровне.
В этой статье разберём типы L7-атак, отличия от L4, методы фильтрации и приведём рабочие конфиги для nginx, HAProxy и ModSecurity.
Что такое DDoS L7 и почему он опасен
Седьмой уровень OSI - это прикладные протоколы: HTTP/HTTPS, WebSocket, gRPC, DNS-over-HTTPS, SMTP. Атака L7 - это любой паттерн запросов на этих протоколах, который выводит из строя приложение, не нарушая при этом сетевые лимиты.
Ключевое отличие от L4:
| Параметр | L4 (SYN flood, UDP flood) | L7 (HTTP flood, Slowloris) |
|---|---|---|
| Объём | 100 Гбит/с - терабиты | Часто менее 100 Мбит/с |
| Кол-во пакетов | Миллионы PPS | Тысячи RPS |
| Что страдает | Сетевой стек, conntrack, канал | CPU, RAM, БД, пулы соединений |
| Видимость | Аномальный трафик легко заметен | Запросы выглядят легитимно |
| Метод фильтрации | iptables, BGP blackhole, scrubbing | WAF, rate limiting, challenge |
L7-атака может стоить злоумышленнику копейки: 50-100 заражённых устройств в ботнете способны положить непадготовленный сайт. При этом наблюдаемая полоса остаётся низкой - типичный анти-DDoS датацентра пропустит трафик как обычный.
Типы L7-атак
HTTP Flood (GET/POST)
Самый простой и распространённый вариант. Ботнет шлёт миллионы запросов на тяжёлые эндпоинты: поиск, фильтры каталога, генерация PDF, экспорт CSV. POST-флуд особенно опасен: каждое тело запроса нужно прочитать, распарсить, валидировать.
Slowloris
Атакующий открывает множество TCP-соединений и отправляет HTTP-заголовки максимально медленно - по одному байту в несколько секунд. Apache с MPM prefork и Nginx с дефолтным client_header_timeout 60s держат соединения открытыми, пока пул воркеров не закончится.
Slow POST (RUDY - R-U-Dead-Yet)
Аналог Slowloris для тела запроса. Бот указывает большой Content-Length и шлёт данные по байту в минуту. Воркер ждёт окончания, не имея возможности обработать другие запросы.
Apache Range Header DoS
Запрос с заголовком Range: bytes=0-,5-,10-,... (тысячи диапазонов) заставляет сервер аллоцировать память под каждый диапазон. Старая CVE-2011-3192, но до сих пор встречается на legacy-стеках.
Низкочастотные logic-атаки
Бот находит самый тяжёлый эндпоинт (например, /api/search?q=... с full-text поиском без индекса) и шлёт 5-10 запросов в секунду. На графиках ничего не видно, но БД ложится.
Scraping и credential stuffing
Формально не DDoS, но эффект тот же: парсеры конкурентов или брутфорс логинов с тысяч прокси создают паразитную нагрузку. Credential stuffing - перебор баз “email:password” по форме входа.
Методы защиты L7
WAF (Web Application Firewall)
WAF анализирует HTTP-запросы и блокирует по сигнатурам и правилам. Популярные решения:
- ModSecurity + OWASP CRS - open-source, ставится модулем к nginx/Apache. Дефолтный набор правил (Core Rule Set) ловит SQLi, XSS, RCE, а также аномальные паттерны типа сотен запросов с одного User-Agent.
- Cloudflare WAF - облачный фильтр перед origin. Managed Rules от Cloudflare + кастомные expressions на языке Wirefilter.
- BitNinja - server-side агент, ставится на VPS. Анализирует поведение и автоматически банит IP.
- NAXSI - легковесная альтернатива ModSecurity для nginx с whitelist-подходом.
Rate Limiting
Ограничение числа запросов на IP/cookie/токен. В nginx:
http {
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login_zone:10m rate=5r/m;
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;
server {
listen 443 ssl http2;
location / {
limit_req zone=req_per_ip burst=20 nodelay;
limit_conn conn_per_ip 10;
proxy_pass http://backend;
}
location /login {
limit_req zone=login_zone burst=3 nodelay;
proxy_pass http://backend;
}
location /api/search {
limit_req zone=req_per_ip burst=5;
proxy_pass http://backend;
}
}
}
Зона req_per_ip хранит счётчики на 10 МБ (примерно 160 000 IP), лимит 10 запросов в секунду с burst 20. Для эндпоинта логина - жёсткие 5 запросов в минуту.
В HAProxy эквивалент - stick-tables:
frontend web
bind *:443 ssl crt /etc/haproxy/cert.pem
stick-table type ip size 100k expire 30s store http_req_rate(10s),conn_cur
http-request track-sc0 src
http-request deny if { sc_http_req_rate(0) gt 100 }
http-request deny if { sc_conn_cur(0) gt 50 }
default_backend app
JS-challenge и CAPTCHA
При подозрении на бота возвращается страница с JavaScript-задачей: вычислить хеш, выполнить redirect, поставить cookie. Headless-боты без полноценного JS-движка отсеиваются. Cloudflare Turnstile и hCaptcha - современные альтернативы Google reCAPTCHA с меньшим UX-уроном.
TLS- и HTTP/2-fingerprinting
JA3 (TLS) и Akamai HTTP/2 fingerprint - хеши параметров рукопожатия. Реальный браузер генерирует один профиль, curl/Go/Python - другой. Сопоставление с базой ботнетов (например, ja3er.com) даёт точный отсев без challenge для пользователя. В nginx добавляется через модуль ngx_http_ssl_module с переменными $ssl_client_fingerprint.
Behavioral analysis
Системы вроде Cloudflare Bot Management и DataDome строят профиль поведения: скорость кликов, движение мыши, паттерн запросов, переходы между страницами. Реальный пользователь не открывает 50 товаров за секунду без перерыва.
Sysctl для устойчивости к Slowloris
# /etc/sysctl.d/99-l7-hardening.conf
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 4096
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
И в nginx уменьшить таймауты:
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
keepalive_timeout 15s;
reset_timedout_connection on;
Особенности игровых хостингов
У игровых проектов L7-поверхность шире, чем кажется. Помимо самого сервера на TCP/UDP-порту, есть:
- Веб-панель управления (Pterodactyl, Pufferpanel) - HTTPS на 443.
- API биллинга и магазин донатов - REST/GraphQL.
- Auth-сервер Minecraft (AuthMe REST API, Mojang prefetch).
- WebSocket для консоли и live-чата.
Auth-эндпоинты Minecraft - частая мишень. Бот заваливает /auth/register или /api/auth/login тысячами попыток в минуту, что нагружает БД сильнее, чем основной игровой трафик. Rate limit на 5-10 запросов в минуту с IP решает задачу.
Подробнее о защите игровых нод от объёмных атак - в статье Защита от DDoS L4 и общий обзор DDoS-защиты.
Pterohost - хостинг с многоуровневой DDoS-защитой L4+L7, NVMe SSD и круглосуточной поддержкой. Промокод 4START даёт -20% на первый заказ. Заказать защищённый хостинг
Пример детектирования L7-атаки
В access-логе nginx заметны характерные паттерны:
grep -E "POST /api/login" /var/log/nginx/access.log | \
awk '{print $1}' | sort | uniq -c | sort -rn | head -20
Если один IP делает 500+ запросов на /login за минуту - это credential stuffing. Бан через fail2ban:
# /etc/fail2ban/jail.d/nginx-login.conf
[nginx-login]
enabled = true
filter = nginx-login
logpath = /var/log/nginx/access.log
maxretry = 20
findtime = 60
bantime = 3600
action = iptables-multiport[name=login, port="80,443"]
Фильтр /etc/fail2ban/filter.d/nginx-login.conf:
[Definition]
failregex = ^<HOST> .* "POST /(api/)?login.*" (401|403|429)
ignoreregex =
Архитектурные принципы
- Origin IP должен быть скрыт. Если злоумышленник знает реальный адрес сервера, любой Cloudflare обходится через прямое подключение. Закройте порты 80/443 файрволом для всех, кроме IP-диапазонов CDN.
- Кешируйте статику - картинки, CSS, JS отдавайте через CDN или nginx с
expires 30d. Это снимает 70-90% нагрузки даже без атак. - Разделяйте критичные эндпоинты - логин, поиск, экспорт должны быть на отдельных upstream с собственными лимитами.
- Логируйте JA3 и User-Agent - без логов невозможно настроить точечные правила.
- Используйте multi-layer защиту: CDN/WAF на edge + rate limit на nginx + fail2ban + WAF-правила на приложении.
Для веб-сайтов на VPS с панелью Plesk - смотрите настройку защиты Plesk. Для общего понимания производительности сервера под нагрузкой - как работает CPU и сколько RAM нужно серверу.
Pterohost защищает игровые серверы и веб-проекты от атак L4+L7 на уровне дата-центра и приложения. Промокод 4START - скидка 20% на первый месяц. Подобрать тариф
Частые вопросы
Чем DDoS L7 отличается от L4?
L4-атаки забивают канал и conntrack пакетами на транспортном уровне (SYN, UDP, ACK). L7-атаки имитируют легитимные HTTP-запросы и истощают ресурсы приложения - CPU, потоки воркеров, пул соединений с БД. L7 сложнее детектировать: запросы валидны с точки зрения TCP/TLS.
Достаточно ли Cloudflare для защиты от L7?
Для типовых веб-проектов - да, но при условии корректной настройки правил WAF, Bot Fight Mode и сокрытия origin IP. Cloudflare не панацея: умные ботнеты обходят базовые challenge через headless-браузеры. Под высокую нагрузку нужны платные тарифы с Advanced Rate Limiting и Bot Management.
Как защитить веб-панель игрового хостинга от DDoS L7?
Закрыть админку по IP-allowlist или basic auth на уровне nginx, включить fail2ban на /login, поставить rate limit 5-10 req/min на эндпоинты авторизации, использовать TLS-fingerprinting (JA3) для отсева ботов. Auth-сервер Minecraft (например, AuthMe API) защищается аналогично - rate limit на /register и /login.
Что такое JA3-фингерпринт и зачем он нужен?
JA3 - это MD5-хеш параметров TLS ClientHello (версия, cipher suites, расширения). У реального Chrome один JA3, у Go-бота - другой. Сравнение JA3 со списком известных ботнетов отсеивает атакующих ещё до уровня HTTP, не требуя JS-challenge.