Как уже сказал автор, mod_evasive поддерживает опцию DOSSystemCommand, которая:
используется для выполнения какой-нибудь вашей команды когда IP блокируется. Вы можете использовать это для добавления IP-адреса в таблицу фаервола. (пример:
"/sbin/ipfw table 111 add %s"
. В переменную"%s"
передается от модуля IP-адресатакуемогоатакующего хоста).
Как показала практика, эта полезнейшая возможность позволяет заметно разгрузить атакуемый Веб-сервер и избавить его от генерации ответов с кодом 403
за счет блокировки атакующих хостов с помощью брандмауэра. Эта заметка посвящена описанию используемого мной рецепта добавления соответствующих правил ipfw(8) с помощью mod_evasive.
В связи с тем, что по умолчанию изменение правил ipfw разрешено только суперпользователю root
, а Веб-сервер работает от имени www
, для выполнения соответствующих команд ipfw add ...
придется воспользоваться утилитой security/sudo. Для разрешения выполнения команды /sbin/ipfw
пользователю www
с IP-адреса X.X.X.X
, на котором "висит" Apache, без ввода пароля необходимо добавить в файл конфигурации sudo следующую строку (напоминаю, что для открытия файла конфигурации sudo в редакторе по умолчанию нужно выполнить команду visudo
):
www X.X.X.X=NOPASSWD:/sbin/ipfw
После сохранения файла конфигурации sudo можно добавить в раздел <IfModule mod_evasive20.c>...</IfModule>
файла конфигурации Веб-сервера примерно такую строку:
DOSSystemCommand '/usr/local/bin/sudo /sbin/ipfw add 4399 deny tcp from %s to X.X.X.X 80 in via bge0'
Естественно, X.X.X.X
и bge0
нужно заменить на уже упомянутый IP-адрес и имя сетевого интерфейса, которому он соответствует. Обязательно обратите внимание на номер правила, позволяющий вставить добавляемое правило в нужное место набора правил ipfw. В моем случае правила блокировки атакующих хостов добавляются непосредственно перед правилом, разрешающим все установленные TCP-соединения:
/sbin/ipfw add pass tcp from any to any established
Вот, собственно, и весь рецепт
Как на меня, то более
Как на меня, то более правильно было бы "заганять" IP-адреса атакующих хостов в таблицу файрвола, запретив, соответственно, для этой таблицы доступ к серверу. Это предотвратило бы стремительное разрастание количество правил файрвола (что тоже влияет на производительность).
Пример.
Допустим, что IP-адреса атакующих хостов будем добавлять в таблицу 25 файрвола ipfw. Предположим, что атака проводится не только по протоколу http, поэтому доступ для атакующих IP-адресов будем блокировать полностью, а не только на 80 порт:
Все остальное - согласно статьи. Только, соответственно, необходимо изменить параметр DOSSystemCommand на следующий:
Спасибо! Таблички как-то
Спасибо! Таблички как-то вылетели из головы. Безусловно, их применение логичнее, удобнее и эффективнее во всех отношениях, даже с номерами правил уже не нужно заморачиваться, т.к. можно сразу прописать запрещающее правило в нужное место
/etc/rc.firewall
. А вот насчет блокировки всего трафика я категорически не согласен. Как минимум нужно оставлять доступ к 22 порту TCP, если не хочется ни куда ехать после нескольких неловких движений (например, нескольких последовательных нажатий<F5>
в браузере)Я обычно над этим не
Я обычно над этим не заморачиваюсь, поскольку всегда есть возможность подключиться с других серверов и вручную "вынести" IP-адрес из таблицы.
Re: Как на меня, то более
При удачной настройке iptables nginx попросту блокирует атакующие адреса и они не нагружают системные ресурсы сервера, ну а для решения серьезных проблем нужная хорошая аппаратная защита. Могу порекомендовать ребят из Simplyway. отлично справляются с ддос атаками
Ровнее использовать для этих
Ровнее использовать для этих целей а) pf pfctl -t bruteforce -T expire 86400 will remove
table entries which have not been referenced for 86400 seconds. b) bruteblock В противном случае кто будет чистить таблички от устаревания, мы ж не хотим там всю жизнь держать адреса?
Спасибо, что поделились
Спасибо, что поделились решением. Возьмем на заметку.
Re: Спасибо, что поделились
IMHO, в таком случае полезно использование универсального механизма fail2ban с настройкой специфического фильтра для mod_evasive для блокировки/удаления правил через ipfw.