Pterohost docs

Защита от 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, scrubbingWAF, 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 =

Архитектурные принципы

  1. Origin IP должен быть скрыт. Если злоумышленник знает реальный адрес сервера, любой Cloudflare обходится через прямое подключение. Закройте порты 80/443 файрволом для всех, кроме IP-диапазонов CDN.
  2. Кешируйте статику - картинки, CSS, JS отдавайте через CDN или nginx с expires 30d. Это снимает 70-90% нагрузки даже без атак.
  3. Разделяйте критичные эндпоинты - логин, поиск, экспорт должны быть на отдельных upstream с собственными лимитами.
  4. Логируйте JA3 и User-Agent - без логов невозможно настроить точечные правила.
  5. Используйте 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.