Как уже сказал автор, mod_evasive [1] поддерживает опцию DOSSystemCommand, которая:
используется для выполнения какой-нибудь вашей команды когда IP блокируется. Вы можете использовать это для добавления IP-адреса в таблицу фаервола. (пример:
"/sbin/ipfw table 111 add %s"
. В переменную"%s"
передается от модуля IP-адресатакуемогоатакующего хоста).
Как показала практика, эта полезнейшая возможность позволяет заметно разгрузить атакуемый Веб-сервер и избавить его от генерации ответов с кодом 403
за счет блокировки атакующих хостов с помощью брандмауэра. Эта заметка посвящена описанию используемого мной рецепта добавления соответствующих правил ipfw(8) [2] с помощью mod_evasive.
В связи с тем, что по умолчанию изменение правил ipfw разрешено только суперпользователю root
, а Веб-сервер работает от имени www
, для выполнения соответствующих команд ipfw add ...
придется воспользоваться утилитой security/sudo [3]. Для разрешения выполнения команды /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
Вот, собственно, и весь рецепт