mod_limit — это мой старый и малоизвестный проект, который писался для себя. mod_limit — это модуль для Apache 2.2.x позволяющий защититься от слабого HTTP флуда или connection флуда средствами одного лишь апача, или от более интенсивных атак в связке mod_limit + iptables/ipfw/pf. Модуль прост в установке и настройке, почти не снижает производительности сервера и будет полезен всем владельцам VDS/dedicated серверов.
Модуль поставляется в исходниках, которые компилируются в VS2008 под Windows и в GCC под Linux. Под BSD тоже должно работать, но автор это не проверял. Для Windows имеются бинарные сборки, под Linux компилируйте сами (Apache должен быть собран с тредами). Я буду описывать установку и конфигурирование модуля для Apache 2.2.14 под Windows 2003.
Скачайте mod_limit (PGP подпись) и распакуйте архив. Если вы используете официальный Apache с http://httpd.apache.org/, то вам нужно использовать mod_limit собранный с CRT библиотекой VC6 из bin_vc6, если вы используете оптимизированный Apache с http://www.apachelounge.com/, то используйте mod_limit под 9ю версию CRT из bin_vc9. Скопируйте mod_limit.so в Apache2.2/modules и пропишите в httpd.conf строку:
LoadModule limit_module modules/mod_limit.so
Ниже добавьте блок конфигурации mod_limit:
<IfModule limit_module>
LimitMaxSyn 128
LimitMaxReq 256
LimitMaxIdnReq 32
LimitSynAct SOFTBAN
LimitReqAct SOFTBAN
LimitSecondAct "HARDBAN | EXPORT"
LimitBanTmo 240
LimitBanMsg "Your IP is temporary blocked. Please wait %d minutes."
LimitHtSize 65537
LimitWriteLog On
LimitBanDB logs/limit.db
LimitBanExport logs/bans.txt
LimitExportFmt "add 101 deny tcp from %s to me 80 in"
</IfModule>
Теперь вам нужно сконфигурировать mod_limit под желаемый режим работы вашего сервера. Описание параметров конфигурации:
LimitMaxSyn — предельно допустимое количество соединений без отправки HTTP запроса. Если клиент генерирует много соединений, но не шлет запросы, то это SYN flood атака. Действие при обнаружении этой атаки задаётся параметром LimitSynAct.
LimitMaxReq — максимальное количество HTTP запросов в минуту с одного IP адреса. Превышение лимита будет означать флуд HTTP запросами. Действие определяется параметром LimitReqAct. Рекомендуется ставить > 500 при нормальном функционировании сайта и < 200 когда сайт находится под атакой.
LimitMaxIdnReq — максимальное количество идущих подряд одинаковых HTTP запросов в минуту с одного IP адреса. Обычно браузер генерирует много разнообразных запросов, таких как загрузка картинок, favicon.ico, и.т.д., и никогда не запрашивает одинаковый URL многократно. Этот лимит можно безопасно ставить в низкие значения, и он хорошо справляется с обнаружением простого HTTP флуда. Действие определяется параметром LimitReqAct.
LimitSecondAct — действие, выполняемое при продолжении атаки со стороны заблокированного клиента. Продолжение атаки определяется по повторному превышению лимитов. Рекомендуется прописать более жесткие правила для более эффективной блокировки атак.
LimitBanTmo — время в минутах, на которое применяется заданное действие. Если заблокированный ip прекращает атаку, то блокировка снимается через это время.
LimitBanMsg — сообщение о блокировке, которое выдается заблокированным по типу «SOFTBAN» клиентам. Через %d можно вставить время оставшееся до разблокирования.
LimitHtSize — размер хэш-таблицы в которой хранится состояние всех лимитов. При очень больших нагрузках имеет смысл увеличить, но в большинстве случаев оптимально значение из этого примера конфигурации.
LimitWriteLog — включает запись в error.log сервера сообщений о блокировке атак.
LimitBanDB — файл базы блокировок. Если этот параметр не задан, то блокировки хранятся только в памяти до перезапуска сервера. Настоятельно рекомендую сохранять блокировки в файл, поскольку apache при сильных атаках имеет свойство падать.
LimitBanExport — файл экспорта блокировок, для который указано действие «EXPORT». По умолчанию просто записываются заблокированные ip, но можно задать формат строк в параметре LimitExportFmt.
LimitExportFmt — формат экспорта блокировок. В данном примере используется формат правил фаерволла ipfw.
Типы блокировок: HARDBAN — Apache разрывает соединение сразу, без выдачи сообщения. SOFTBAN — Apache выдает сообщение о блокировке, формат которого задан LimitBanMsg EXPORT — данная блокировка может экспортироваться в файл LimitBanExport
Можно комбинировать несколько типов блокировок, например «HARDBAN | EXPORT» или «SOFTBAN | EXPORT».
Вышеуказанная конфигурация настроена на первоначальную «мягкую» блокировку с выдачей предупреждения Your IP is temporary blocked. Please wait %d minutes. заблокированному пользователю. Если атака с заблокированного IP не прекращается, то при повторном превышении лимитов мягкая блокировка становится жесткой, и IP нарушителя экспортируется в файл bans.txt в папке с логами сервера, откуда его подхватывает фаерволл ipfw запускаемый по таймеру внешним скриптом. Такая конфигурация позволит эффективно блокировать атаки и минимизирует последствия от ложных срабатываний. Если атака на вас слишком интенсивна, то вы можете задать более строгие правила.
Проект mod_limit распространяется по лицензии GPL v3, и автор будет рад, если кто-нибудь поможет с дальнейшим развитием и поддержкой проекта.