Apachemod_limit, защищаем Apache от DDoS атак

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, и автор будет рад, если кто-нибудь поможет с дальнейшим развитием и поддержкой проекта.
  • +9
  • ntldr
  • 01 ноября 2009, 19:21

Комментарии (1)

имхо, правильнее перед апачем поставить фронтендом что-нибудь по легче (нгинкс, лайти и т.д.), и решать описанную проблема на их уровне.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.