Apache-модуль mod_qos (http://mod-qos.sourceforge.net/) позволяет организовать разделение запросов по приоритетам и обеспечить выполнение только приоритетных запросов при таких нештатных ситуациях, как перегрузка сервера. В качестве реакции при нехватке серверных ресурсов mod_qos может блокировать неприоритетные запросы, динамически изменять значения таймаутов, добавлять искусственную задержку перед выполнением запроса и принудительно завершать TCP-соединения.++ Примеры ситуация, когда можно использовать mod_qos:
* Управление интенсивностью выполнения длительных по времени и ресурсоемких запросов, предотвращение одновременного выполнения большого числа таких запросов;
* Защита от исчерпания пропускной способности канала связи из-за слишком большого числа одновременных обращений к определенным данным (например, когда пользователь сделал доступным для загрузки файл большого размера и широко его разрекламировал)
* Защита от простейших DDoS-атак.
++ Некоторые примеры ограничений, реализуемых через mod_qos ограничений:
* Ограничение максимального числа одновременных соединений для заданной части сайта, URL или виртуального хоста.
* Ограничение пропускной способности, числа запросов в секунду или объема трафика в секунду для любой части сайта;
* Ограничение числа выполнения определенных типов запросов в секунду;
* Не применение ограничений для определенных адресов или пользователей;
* Фильтрация по совпадению маски в HTTP-заголовке или теле запроса;
* Ограничение размера передаваемых в рамках запроса данных;
* Ограничение на уровне параметров TCP-соединений, например, ограничение максимального числа запросов с одного IP, динамическое изменение keep-alive и т.п.
* Обеспечение доступа с заданных IP в случае исчерпания свободных сокетов.
++ Пример установки и настройки типовой конфигурации в Debian/GNU Linux
На сайте http://mod-qos.sourceforge.net/ приведен большой набор практических примеров конфигурации mod_qos. Рассмотрим типовой вариант.
Так как mod_qos нет в стандартных репозиториях, установим данный модуль из исходных текстов.
Устанавливаем пакеты, необходимые для сборки модулей Apache:
apt-get install apache2-threaded-dev gcc
Загружаем архив с исходными текстами mod_qos с сайта ttp://sourceforge.net/projects/mod-qos/
wget http://downloads.sourceforge.net/project/mod-qos/9.9/mod_qos...
tar xvfz mod_qos-9.9.tar.gz
Собираем и устанавливаем:
cd mod_qos-9.9/apache2/
apxs2 -i -c mod_qos.c
После этого модуль будет установлен как /usr/lib/apache2/modules/mod_qos.so
Активируем модуль в Apache. В директории /etc/apache2/mods-available создаем два файла qos.load и qos.conf
В qos.load добавляем строку для загрузки модуля:
LoadModule qos_module /usr/lib/apache2/modules/mod_qos.so
В qos.conf определяем конфигурацию модуля (подобные блоки конфигурации можно привязывать к отдельным блокам Location и VirtualHost):
## Настройка QoS
<IfModule mod_qos.c>
# Размер буфера обрабатываемых IP-адресов клиентов.
# По умолчанию 50 тыс. На каждый IP тратится 63 байта
QS_ClientEntries 100000
# Максимальное число одновременных соединений с одного IP
QS_SrvMaxConnPerIP 50
# Общее максимальное число одновременных обращений к серверу
MaxClients 256
# Понижаем лимит для отдельных URL
QS_LocRequestLimit /aaa 100
QS_LocRequestLimit /bbb 10
QS_LocRequestLimit /ccc 5
QS_LocRequestLimitMatch "^(/dd1/|/dd2/).*$" 100
# Недопускаем более 50 запросов в секунду для заданного URL
QS_LocRequestPerSecLimit /download/file.iso 50
# Не распространять правила блокировки на запросы, пришедшие с заголовком mod-qos-login
QS_VipIPHeaderName mod-qos-login
# Отключаем keep-alive когда достигнуто значение в 70% от максимального лимита соединений
QS_SrvMaxConnClose 180
# Минимальная скорость поступления запросов и генерации ответов,
# позволяет защитить сервер от наводнения медленными запросами, которые длительное время висят без передачи данных
QS_SrvMinDataRate 150 1200
# Ограничение размера заголовков и тела запроса (следует изменить в соответствии со спецификой сайта)
# LimitRequestFields 30
# QS_LimitRequestBody 102400
# Отключаем лимит для заданных подсетей
QS_SrvMaxConnExcludeIP 172.18.3.32
QS_SrvMaxConnExcludeIP 192.168.10.
# События, связанные с блокировками сохраняем в отдельном логе
CustomLog logs/qsaudit_log "%{qos-path}n%{qos-query}n"
# Ограничиваем размер тела запроса в зависимости от mime-типа (для работы требуется модуль mod_parp):
SetEnvIfNoCase Content-Type application/x-www-form-urlencoded QS_LimitRequestBody=131072
SetEnvIfNoCase Content-Type multipart/form-data QS_LimitRequestBody=131072
SetEnvIfNoCase Content-Type multipart/mixed QS_LimitRequestBody=131072
# Для заданного Location блокируем запросы по масками, для защиты от подстановки SQL запросов
<Location /app>
QS_DenyQueryBody on
QS_DenyQuery +s01 deny "(EXEC|SELECT|INSERT|UPDATE|DELETE)"
</Location>
# Пример установки разных лимитов в зависимости от типа браузера, для ботов ставим более жесткие лимиты
BrowserMatch "slurp" QS_Cond=spider
BrowserMatch "googlebot" QS_Cond=spider
QS_LocRequestLimitMatch "^(/app/b/|/app/c/).*$" 300
QS_CondLocRequestLimitMatch "^(/app/b/|/app/c/).*$" 10 spider
</IfModule>
Активируем модуль и перезапускаем apache:
a2enmod qos
/etc/init.d/apache2 restart
При просмотре статистики через открытие http://ваш_сайт/server-status можно посмотреть дополнительную информацию о работе и настройках mod_qos.
URL: http://www.howtoforge.com/how-to-defend-slowloris-ddos-with-...
Обсуждается: http://www.opennet.me/tips/info/2308.shtml