Как защититься от Slowloris DDoS с помощью mod_qos (Apache2 на Debian Lenny)
Краткое описание атаки 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.ddd | 1 |
| настройки соединений | |
| макс. соединений | - |
| макс. соединений с keep‑alive | 180 |
| макс. соединений на IP | 50 |
| мин. скорость данных (байт/с) (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. Мини‑методология внедрения (шаги)
- Собрать и установить mod_qos в тестовой среде.
- Включить базовую конфигурацию с консервативными ограничениями (например, QS_SrvMaxConnPerIP 50, MaxClients 256).
- Мониторить server‑status и лог уровня приложения в пиковые часы.
- Постепенно ужесточать пороги, проверяя влияние на легитимных пользователей и API‑клиентов.
- Добавить исключения для доверенных подсетей и балансировщиков (если требуется).
- Зафиксировать конфигурацию и развернуть в продакшене при минимальном окне обслуживания.
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.soqos.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. Ссылки для чтения
- http://www.golem.de/0906/67854.html
- http://ha.ckers.org/slowloris/
- http://www.zdnet.de/news/wirtschaft_sicherheit_security_perl_skript__slowloris__legt_apache_websites_lahm-story-39001024-41005602-1.htm
- http://isc.sans.org/diary.html?storyid=6613
- http://mod-qos.sourceforge.net/
- http://ha.ckers.org/blog/20090617/slowloris-http-dos/
Итог
mod_qos — практичный инструмент для быстрой защиты Apache от атак, которые удерживают множество открытых соединений (Slowloris‑тип). Он не решит масштабную распределённую атаку сам по себе, но даёт время для внедрения дополнительных мер (балансировка, WAF, провайдерская защита). Тестируйте, измеряйте и корректируйте пороги под вашу нагрузку.
Summary:
- mod_qos ограничивает подключения и приоритетизирует “быстрые” запросы.
- Начинайте с консервативных настроек и постепенно ужесточайте.
- Учитывайте NAT, TLS‑терминацию и долгоживущие легитимные соединения при настройке.
Похожие материалы
Включение и настройка Compiz в Ubuntu
Aero в Windows 7: включение, настройка, устранение проблем
Stacks на Mac: упорядочьте рабочий стол быстро
Добавить Take Ownership в контекстное меню
Голосовой ввод в Windows 11 — включение и советы