Гид по технологиям

Как защититься от Slowloris DDoS с помощью mod_qos (Apache2 на Debian Lenny)

7 min read Security Обновлено 28 Nov 2025
Защита Slowloris DDoS с mod_qos
Защита Slowloris DDoS с mod_qos

Краткое описание атаки Slowloris

Slowloris спроектирован так, чтобы одна машина (обычно Linux/UNIX) могла связать типичный веб‑сервер или прокси, блокируя все его потоки — они терпеливо ожидают дополнительных данных. Некоторые серверы имеют разные таймауты, но Slowloris может компенсировать это, настраивая задержки. Атака потребляет мало ресурсов у атакующего, поэтому ОС редко завершает сокеты автоматически, что делает Slowloris эффективнее традиционных флудеров в определённых случаях. По сути, Slowloris — это HTTP‑эквивалент SYN‑флуда.

Определение термина: Slowloris — инструмент для удержания множества частично открытых HTTP‑соединений, не отправляя завершённого запроса.

Important: Slowloris действует на уровне HTTP (L7) и не увеличивает сетевой трафик существенно — поэтому сетевые фильтры по объёму часто бессильны.

Что потребовалось в моём случае

На живом сервере поступила атака slowloris‑dos от ботнета. Нагрузка с точки зрения пропускной способности была низкой, но Apache быстро прекращал обслуживать запросы: все воркеры уходили в состояние ожидания (keepalive/read). Изменение системных таймаутов помогает против одиночного атакующего, но создаёт проблемы при большом числе клиентов за NAT. mod_qos позволил гибко ограничивать количество подключений и отдавать приоритет «быстрым» запросам.

Ниже — пошаговая инструкция, которая сработала у меня, плюс рекомендации и тесты.

1. Получение исходников, сборка и установка

mod_qos доступен на SourceForge: http://sourceforge.net/projects/mod-qos/ . Документация: http://mod-qos.sourceforge.net/ .

Пример загрузки и распаковки (сохраните точные URL из SourceForge при необходимости):

cd /tmp/  
 wget http://downloads.sourceforge.net/sourceforge/mod-qos/mod_qos-8.13-src.tar.gz?use_mirror=freefr  
 tar xvfz mod_qos-8.13-src.tar.gz

Чтобы компилировать модуль с помощью apxs, установите dev‑пакет Apache и gcc:

apt-get install apache2-threaded-dev gcc

Собрать и установить модуль:

cd mod_qos-8.13/apache2/  
 apxs2 -i -c mod_qos.c

Если всё прошло успешно, вы увидите сообщение о том, что модуль установлен в /usr/lib/apache2/modules, и файл mod_qos.so появится с правами 644.

2. Конфигурация и активация

Перейдите в /etc/apache2/mods-available и создайте qos.load и qos.conf:

cd /etc/apache2/mods-available/  
 vi qos.load

В qos.load вставьте:

LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so

Создайте qos.conf:

vi qos.conf

Пример содержимого qos.conf (значения из моего рабочего примера):

## QoS Settings

    # обрабатывает подключения от до 100000 разных IP
    QS_ClientEntries 100000
    # разрешает только 50 подключений на IP
    QS_SrvMaxConnPerIP 50
    # максимальное число активных TCP‑подключений ограничено 256
    MaxClients              256 
    # отключает keep‑alive, когда занято 70% TCP‑подключений:
    QS_SrvMaxConnClose      180
    # минимальная скорость запроса/ответа (байт/сек) (защита от "медленных" клиентов типа slowloris):
    QS_SrvMinDataRate       150 1200
    # и ограничение заголовков/тела запроса (внимание: это ограничивает загрузки и POST):
    # LimitRequestFields      30
    # QS_LimitRequestBody     102400

После этого включите модуль и перезапустите Apache:

a2enmod qos  
 /etc/init.d/apache2 restart

Проверка: откройте https://__yourserver__/server-status — модуль должен отображать статистику и таблицы состояния (см. раздел «Вывод server‑status» ниже).

Вывод server-status с модулем mod_qos

На странице server‑status mod_qos показывает суммарные метрики и список IP с количеством подключений. Пример адаптированного вывода:

mod_qos 8.13

ЭлементЗначение
клиентские IP (записей)
yourserver:0 (основной)
свободные IP‑записи255
текущие соединения1
клиентские IP‑соединениятекущее
aaa.bbb.ccc.ddd1
настройки соединений
макс. соединений-
макс. соединений с keep‑alive180
макс. соединений на IP50
мин. скорость данных (байт/с) (min/max/текущее)150/1200/154

(В выводе также присутствуют виртуальные хосты с пометкой “uses base server settings” — т.е. используют базовые настройки.)

Примечание: реальные страницы server‑status содержат много служебной информации; выше — ключевые поля, которые помогут отследить поведение во время атаки.

3. Поведение до и после включения мод_qos (локальный тест)

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

Обычное состояние сервера:

1 requests currently being processed, 5 idle workers  
_.._W._...._...................................................  
................................................................

Во время атаки одним машиной все воркеры заняты:

102 requests currently being processed, 0 idle workers  
RRRRRRRRRRRRRWRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR  
RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR..........................

Здесь “R” соответствует состоянию Keepalive (read) — соединение открыто, но реального HTTP‑запроса нет.

С модулем mod_qos включённым сервер может обслуживать реальные запросы даже при попытке заполнить воркеры:

1 requests currently being processed, 97 idle workers  
________W_______________________________________________________  
__________________________________..............................

Мы настроили модуль так, чтобы ограничить подключения на IP и отдавать приоритет “быстрым” соединениям. Если воркеры заняты “медленными” соединениями, мод_qos закрывает устаревшие и обслуживает новые реальные запросы.

Реальные примеры в пиковых состояниях (усечённый вывод):

166 requests currently being processed, 0 idle workers  
RRRRRCCCCRRRCRCRWRRRCRRCRCCRRCRRCCCRRRKCRRRRRRRRCRRRRRCRCCRC.RRC  
... (усечено)
97 requests currently being processed, 59 idle workers  
___R_C_RR.CC_R_R_RRC_RCR._.R_RR.RRW___RR__RC______R_R_R__.K_._R.  
... (усечено)
51 requests currently being processed, 92 idle workers  
___KR_R_K.._._.K__R__._..K.__._.R.W__R___R____.____K_____.__._R.  
... (усечено)
126 requests currently being processed, 0 idle workers  
RRKRRRRCRCCRRKRKCRRRKCRRRRRRCKCKRKRRRRRRKCRCCCRRKKKRRRRRC.....R.  
... (усечено)

Эти примеры показывают, как модуль снижает влияние “медленных” соединений на способность сервера отдавать реальные страницы.

Фактические параметры (fact box)

  • QS_ClientEntries: 100000 — количество клиентских записей, для хранения состояния по IP
  • QS_SrvMaxConnPerIP: 50 — максимумы подключений на один IP
  • MaxClients: 256 — общее число активных TCP‑воркеров Apache
  • QS_SrvMaxConnClose: 180 — при достижении этого значения модуль начнёт закрывать keep‑alive
  • QS_SrvMinDataRate: 150 1200 — минимальная скорость обмена (min/max)

Эти числа — отправная точка; их следует подогнать под вашу архитектуру и трафик.

4. Когда это не сработает (ограничения и контрпримеры)

  • Большие распределённые ботнеты: если атака идёт с тысяч реальных IP, ограничение на «подключения на IP» может не помочь.
  • NAT‑кластеры провайдеров: когда многие реальные пользователи находятся за общим NAT, жёсткие лимиты на IP могут блокировать легитимных.
  • TLS с терминатором вне Apache: если TLS завершается на балансировщике и Apache видит одно IP, нужно учитывать X‑Forwarded‑For и настраивать QS_ClientEntries и механизм определения клиента.
  • HTTP/2 и long‑polling: долгоживущие легитимные соединения (SSE/WebSocket/HTTP/2) потребуют тонкой настройки или исключений.

Note: всегда тестируйте изменения на стейджинге и собирайте метрики, прежде чем выкатывать в продакшен.

5. Альтернативные подходы (быстрый обзор)

  • Reverse proxy / load balancer (nginx, HAProxy) с лимитами соединений и rate‑limit.
  • WAF / CDN (Cloudflare, Akamai) — нивелирует часть L7‑атак на глобальном уровне.
  • TCP‑level limits (conntrack, iptables‑recent) — полезно при атаках с ограниченным числом источников.
  • Использование специализированных решений DDoS mitigation — уместно для частых/мощных атак.

Каждый подход имеет свои преимущества и стоимость. mod_qos хорош для быстрого локального решения без дополнительного железа.

6. Мини‑методология внедрения (шаги)

  1. Собрать и установить mod_qos в тестовой среде.
  2. Включить базовую конфигурацию с консервативными ограничениями (например, QS_SrvMaxConnPerIP 50, MaxClients 256).
  3. Мониторить server‑status и лог уровня приложения в пиковые часы.
  4. Постепенно ужесточать пороги, проверяя влияние на легитимных пользователей и API‑клиентов.
  5. Добавить исключения для доверенных подсетей и балансировщиков (если требуется).
  6. Зафиксировать конфигурацию и развернуть в продакшене при минимальном окне обслуживания.

7. Ролевые чеклисты

Администратор сервера:

  • Проверить установку apxs2 и gcc.
  • Скомпилировать и установить mod_qos.
  • Настроить qos.load и qos.conf.
  • Перезагрузить Apache и проверить server‑status.

Инженер безопасности:

  • Оценить распределение IP в логах перед настройкой лимитов.
  • Настроить исключения для мониторинга и внутренних сервисов.
  • Синхронизировать с командой сети про NAT/балансировщики.

DevOps/инженер по релизам:

  • Развернуть сначала в staging.
  • Подготовить план отката (удалить модуль, вернуть прежние таймауты).
  • Автоматизировать сбор сервер‑статусов и алертинг.

8. Критерии приёмки

  • После включения мод_qos количество обслуживаемых реальных запросов не должно снижаться более чем на разумный порог (например, <5% в пиковое время).
  • Логи не должны показывать значительного числа легитимных клиентов, отклонённых из‑за новых лимитов.
  • Метрики latency и error rate должны оставаться в ожидаемых пределах.

9. Тестовые сценарии (acceptance)

  • Симулировать slowloris‑подобные соединения и проверить, что модуль закрывает «медленные» соединения и даёт воркеры под реальные запросы.
  • Выполнить нагрузочное тестирование с тысячами «легитимных» параллельных пользователей за NAT и проверить, не блокируются ли они.
  • Тестировать сценарий с TLS‑терминацией на балансировщике (использовать X‑Forwarded‑For).

10. Шаблон быстрой конфигурации (cheat sheet)

qos.load:

LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so

qos.conf (стартовая точка):


  QS_ClientEntries 100000
  QS_SrvMaxConnPerIP 50
  MaxClients 256
  QS_SrvMaxConnClose 180
  QS_SrvMinDataRate 150 1200

Не забудьте: a2enmod qos && /etc/init.d/apache2 restart

11. Советы по доработке и безопасность

  • Логируйте отклонённые соединения и регулярно анализируйте логи для поиска ложноположительных срабатываний.
  • Для сайтов с большим числом легитимных клиентов за NAT поднимайте QS_ClientEntries и добавляйте белые списки подсетей.
  • Для HTTP/2 и WebSocket рассмотрите исключение таких виртуальных хостов от агрессивных лимитов.
  • Обновляйте mod_qos и Apache; Debian Lenny устарел — рассмотрите миграцию на поддерживаемую версию ОС.

12. Совместимость и миграция

Debian Lenny — древняя версия. При планировании миграции учтите:

  • apxs/apxs2 и layout директорий могут отличаться в более новых релизах.
  • Некоторые опции Apache (например, MaxClients) были заменены на RLimit/параметры MPM в новых ветках.
  • Тестируйте конфигурации на аналогичной версии Apache перед продакшен‑развёртыванием.

13. Ссылки для чтения

Итог

mod_qos — практичный инструмент для быстрой защиты Apache от атак, которые удерживают множество открытых соединений (Slowloris‑тип). Он не решит масштабную распределённую атаку сам по себе, но даёт время для внедрения дополнительных мер (балансировка, WAF, провайдерская защита). Тестируйте, измеряйте и корректируйте пороги под вашу нагрузку.

Summary:

  • mod_qos ограничивает подключения и приоритетизирует “быстрые” запросы.
  • Начинайте с консервативных настроек и постепенно ужесточайте.
  • Учитывайте NAT, TLS‑терминацию и долгоживущие легитимные соединения при настройке.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Включение и настройка Compiz в Ubuntu
Ubuntu

Включение и настройка Compiz в Ubuntu

Aero в Windows 7: включение, настройка, устранение проблем
Windows

Aero в Windows 7: включение, настройка, устранение проблем

Stacks на Mac: упорядочьте рабочий стол быстро
macOS

Stacks на Mac: упорядочьте рабочий стол быстро

Добавить Take Ownership в контекстное меню
Windows

Добавить Take Ownership в контекстное меню

Голосовой ввод в Windows 11 — включение и советы
Windows

Голосовой ввод в Windows 11 — включение и советы

Уведомления Google Форм на email — настройка
Google Forms

Уведомления Google Форм на email — настройка