Прикручивание mod_evasive к Apache2 в Debian Etch

Что такое DoS атака - знают практически все. Пусть и не все испытали на себе, но по словам очевидцев - не очень приятное зрелище, когда ваш сайт просто отказывается подавать хоть какие-то признаки жизни. Причём написать скрипт для DoS атаки не составляет труда (пример будет ниже). Чтобы защитить свой сайт от HTTP DoS-а можно воспользоваться модулем mod_evasive, который позволяет "регулировать" нагрузку. В стандартной поставке, к сожалению, данного модуля нет. Собирать его придётся из исходников.

Скачаем модуль с сайта разработчика

wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar xfz mod_evasive_1.10.1.tar.gz
cd mod_evasive
apt-get install apache2-prefork-dev

Если хотите получать уведомления о DoS атаке, поднастройте строку  #define MAILER to “/usr/bin/mail %s”, указав вместо /usr/bin/mail свой локальный почтовик. После того, как всё поднастроите, соберите модуль (для apache2 это будет следующая команда)

/usr/bin/apxs2 -i -c mod_evasive20.c

После сборки модуля необходимо прописать его в "автозагрузку" апача. Создайте в папке /etc/apache2/mods-available файл evasive.load со следующим содержанием

LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so

Создайте в папке /etc/apache2/conf.d файл “evasive” - в нём будут лежать настройки модуля:

<ifmodule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 300
DOSEmailNotify admin@server.ru
DOSLogDir /var/log/mod_evasive
</ifmodule>

Также можно прописать команду на выполнение, если модуль посчитает, что идёт DoS атака

DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"

Чтобы подгрузить модуль, выполните

a2enmod evasive

Запустите апач на релоад конфигов

/etc/init.d/apache2 force-reload

В архиве с mod_evasive идёт скрипт для проверки эффективности модуля

-----------

#!/usr/bin/perl

# test.pl: small script to test mod_dosevasive's effectiveness

use IO::Socket;
use strict;

for(0..100) {
  my($response);
  my($SOCKET) = new IO::Socket::INET( Proto   => "tcp",
                                      PeerAddr=> "127.0.0.1:80");
  if (! defined $SOCKET) { die $!; }
  print $SOCKET "GET /?$_ HTTP/1.0\n\n";
  $response = <$SOCKET>;
  print $response;
  close($SOCKET);
}
---------

Установите на скрипт атрибут 755 и запустите его.  "Выхлоп" должен быть примерно следующим:

HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden

Если видите примерно такое - значит модуль работает исправно.  Для примера можете попробовать отключить его и посмотреть на выхлоп.

Естественно, этот модуль ни в коем случае не панацея, но от "пионеров" начитавшихся статей "как завалить сайт за 5 минут" вполне может помочь.