Если атака вменяемых масштабов (основана на запросе динамических страниц), то
всё решается довольно просто.
Вот, например, так. Проверено в деле (отлов ботнета на 100 машин). Прощу
прощения за php, так было
нужно, переписать на перл не составит сложности.
$timeLimit - временной предел между двумя запросами к html-документам для
получения штрафного очка
$countLimit - предельное количество штрафных очков для одного адреса,
приводящее к его блокировке
<?
$fname = 'access.log';
# Можно обрабатывать готовый файл, можно читать из stdin редирект от tail -f
access.log
$fh = fopen($fname, 'r');
#$fh = fopen('php://stdin', 'r');
$timeLimit = 2;
$countLimit = 50;
$status = array();
while ($string = fgets($fh))
{
$ip = substr($string, 0, strpos($string, ' '));
if($status[$ip]['blocked']) continue;
$st = strpos($string, '[') + 1;
$time = strtotime(substr($string, $st, strpos($string, ']', $st + 1) -
$st));
$st = strpos($string, '"') + 1;
$req = substr($string, $st, strpos($string, '"', $st + 1) - $st);
$st = strpos($req, " ") + 1;
$doc = substr($req, $st, strpos($req, " ", $st) - $st);
$dot = strlen($doc) - strrpos($doc, ".");
if(!$dot || $dot > 5) {
if(!is_array($status[$ip])) $status[$ip] = array('count'=>0);
if($time - $status[$ip]['time'] <= $timeLimit) {
$status[$ip]['count'] ++;
if($status[$ip]['count'] >= $countLimit) {
# Здесь можно блокировать адрес файрволлом
echo "$ip : $doc\n";
$status[$ip]['blocked'] = 1;
}
}
$status[$ip]['time'] = $time;
$status[$ip]['doc'] = $doc;
}
}
?>
> Hello Дмитрий,
> 1. Настроить систему так как было прекрасно описано
> "Настройка FreeBSD для обслуживания 100-200 тысяч соединений." (C) Игорь
> Сысоев
>
> 2. Методика редиректов.
> CLIENT --- [URI] ---> SERVER
> SERVER --- [URI]+[SECURITY CODE] (HTTP 307 CODE) --> CLIENT
> CLIENT --- [URI]+[SECURITY CODE] ---> SERVER
> SERVER --- [URI] (HTTP 307 CODE) ---> CLIENT
> Пример работы:
> 1. [ЗАПРОС]
> GET / HTTP/1.1
> Host: www.xxx.com
> 2. [ОТВЕТ]
> HTTP/1.1 307
> Location: http://www.xxx.com/?code=ABCDEFGHIJKLMNOPQ
> 3. [ЗАПРОС]
> GET /?code=ABCDEFGHIJKLMNOPQ HTTP/1.1
> Host: www.xxx.com
> 4. [ОТВЕТ]
> HTTP/1.1 307
> Location: http://www.xxx.com/
> 5. [ЗАПРОС]
> GET / HTTP/1.1
> Host: www.xxx.com
> 6. [ОТВЕТ]
> HTTP/1.1 200
> DATA
> Соответственно, мы должны иметь таблицу соответствия кодов и ип
> адресов авторизированных клиентов.
> Если клиенты проходят авторизацию, стоит добавлять их в разрешающий
> список и не применять к ним защиту на протяжении некоторого
> времени.
> Процесс редиректа, шаги 2-3, можно повторять случайно количество
> раз, но не стоит делать больше 5-6 раз.
> Реализация этого метода на PHP не поможет, как и других скриптовых
> языках. Лучше всего создавать модуль к nginx.
> P.S. Последние встреченные мною ботнеты, обходят подобную защиту, и
> легко поддерживают все виды HTTP 3xx редиректов.
--
С уважением,
Igor mailto:juks@xxxxxxx