l2bz - База Знаний Lineage II
Главная сайта | Защита Обвязки, скрипты. - Форум | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: EragonUa  
Защита Обвязки, скрипты.
EragonUaДата: Среда, 10.12.2008, 15:48 | Сообщение # 1
Рядовой
Группа: Модераторы
Сообщений: 5
Репутация: 0
Бог форума
Статус: :-(
истема обнаружения и погашения DDOS-атаки http флудом

Идея написания подобной системы возникла у меня, после того как в очередной раз один из моих сайтов подвергся DDOS атаке, в то время я висел на обычном хостинге, где за каждый мегабайт трафика приходилось платить, и сумма в итоге итак выходила не маленькая, а тут еще эта DDOS атака, хорошо еще, что я в тот момент был рядом и вовремя успел отключить доступ к сайту. Тут конечно же в аську стукнул тот самый ддосер с требованиями заплатить, его я само собой послал подальше. Как понимаете, отключение сайта и пережидание атаки это не выход, она может возобновиться когда угодно, и вас рядом может не оказаться, поэтому с этим нужно бороться.

Сразу предупреждаю, система написана на php и предназначена только для ослабления атаки http flood, от другого типа ddos атаки, к примеру: icmp и udp на уровне обычного владельца веб сайта защититься невозможно.

Вкратце о системе: система включает модуль обнаружения DDOS атаки, который производит постоянный мониторинг загруженности сайта, путем отслеживания количества приходящих запросов в секунду, в случае если количество запросов в секунду превысит 10 (это по умолчанию, можно выставить больше), то подключается модуль погашения атаки, который начинает вычислять IP адреса атакующих машин-зомби и заносить их в блэклист, мониторинг при этом отключается по умолчанию на 1 час.

Принцип действия я думаю, понятен, вот сам код:

К примеру, создадим каталог anti_ddos и кидаем все скрипты туда:

index.php (модуль обнаружения DDOS атаки):
PHP код:

Code


<?php    

$ad_ddos_query=10; // количество запросов в секунду для обнаружения DDOS атаки    
$ad_check_file='check.txt'; // файл для записи текущего состояния во время мониторинга    
$ad_temp_file='all_ip.txt'; // временный файл    
$ad_black_file='black_ip.txt'; // будут заносится ip машин зомби    
$ad_white_file='white_ip.txt'; // заносятся ip посетителей    
$ad_dir='anti_ddos'; // каталог со скриптами    
$ad_num_query=0; // текущее количество запросов в секунду из файла $check_file    
$ad_sec_query=0; // секунда из файла $check_file    
$ad_end_defense=0; // время окончание защиты из файла $check_file    
$ad_sec=date("s"); // текущая секунда    
$ad_date=date("mdHis"); // текущее время    
$ad_defense_time=10000; // при обнаружении ddos атаки время в секундах на которое прекращается мониторинг    

if(!file_exists("{$ad_dir}/{$ad_check_file}") or !file_exists("{$ad_dir}/{$ad_temp_file}") or !file_exists("{$ad_dir}/{$ad_black_file}") or !file_exists("{$ad_dir}/{$ad_white_file}") or !file_exists("{$ad_dir}/anti_ddos.php")){    
die("Не хватает файлов.");    
}    

require("{$ad_dir}/{$ad_check_file}");    

if ($ad_end_defense and $ad_end_defense>$ad_date){    
require("{$ad_dir}/anti_ddos.php");    
} else {    
if($ad_sec==$ad_sec_query){    
$ad_num_query++;    
} else {    
$ad_num_query='1';    
}    

if ($ad_num_query>=$ad_ddos_query){    
$ad_file=fopen("{$ad_dir}/{$ad_check_file}","w");    
$ad_end_defense=$ad_date+$ad_defense_time;    
$ad_string='<?php $ad_end_defense='.$ad_end_defense.'; ?>';    
fputs($ad_file,$ad_string);    
fclose($ad_fp);    
} else {    
$ad_file=fopen("{$ad_dir}/{$ad_check_file}","w");    
$ad_string='<?php $ad_num_query='.$ad_num_query.'; $ad_sec_query='.$ad_sec.'; ?>';    
fputs($ad_file,$ad_string);    
fclose($ad_fp);    
}    
}    
?>  

Code

anti_ddos.php (модуль погашения DDOS атаки):    
PHP код:    
<?php    
function getIP() {    
if(getenv("HTTP_CLIENT_IP") and preg_match("/^[0-9\.]*?[0-9\.]+$/is",getenv("HTTP_CLIENT_IP")) and getenv("HTTP_CLIENT_IP")!='127.0.0.1') {    
$ip = getenv("HTTP_CLIENT_IP");    
} elseif(getenv("HTTP_X_FORWARDED_FOR") and preg_match("/^[0-9\.]*?[0-9\.]+$/is",getenv("HTTP_X_FORWARDED_FOR")) and getenv("HTTP_X_FORWARDED_FOR")!='127.0.0.1') {    
$ip = getenv("HTTP_X_FORWARDED_FOR");    
} else {    
$ip = getenv("REMOTE_ADDR");    
}    
return $ip;    
}    
$ad_ip=getIP();    

$ad_source=file("{$ad_dir}/{$ad_black_file}");    
$ad_source=explode(' ',$ad_source[0]);    
if (in_array($ad_ip,$ad_source)){die();}    

$ad_source=file("{$ad_dir}/{$ad_white_file}");    
$ad_source=explode(' ',$ad_source[0]);    
if (!in_array($ad_ip,$ad_source)){    

$ad_source=file("{$ad_dir}/{$ad_temp_file}");    
$ad_source=explode(' ',$ad_source[0]);    
if (!in_array($ad_ip,$ad_source)){    
$ad_file=fopen("{$ad_dir}/{$ad_temp_file}","a+");    
$ad_string=$ad_ip.' ';    
fputs($ad_file,"$ad_string");    
fclose($ad_fp);    
?>    

Сайт в данный момент подвергается DDOS атаке, если Вы не машина-зомби атакующая сайт нажмите на кнопку, иначе Ваш IP (<?=$ad_ip?>) будет заблокирован!!!    
<form method="post">    
<input type="submit" name="ad_white_ip" value="Кнопка">    
</form>    

<?php    
die();    
}    
elseif ($_POST['ad_white_ip']){    
$ad_file=fopen("{$ad_dir}/{$ad_white_file}","a+");    
$ad_string=$ad_ip.' ';    
fputs($ad_file,"$ad_string");    
fclose($ad_fp);    
}    
else {    
$ad_file=fopen("{$ad_dir}/{$ad_black_file}","a+");    
$ad_string=$ad_ip.' ';    
fputs($ad_file,"$ad_string");    
fclose($ad_fp);    
die();    
}    
}    
?>

Также для работы скрипта понадобятся 4 файла check.txt, white_ip.txt, black_ip.txt и all_ip.txt создаем их в этом же каталоге и на все ставим права 666 (чтение и запись).

Желательно также во время атаки списки IP адресов атакующих машин формирующихся в файле black_ip.txt переносить постепенно в файл .htaccess и блокировать их оттуда, тогда нагрузка еще значительно снизится.

Пример файла .htaccess
Код:
Deny from 11.11.11.11 22.22.22.22 и т.д. через пробел

Да чуть не забыл, для подключения скрипта, в начале каждого файла, который может быть подвергнут атаке добавляем строчку:
Код:
require("anti_ddos/index.php");

 
  • Страница 1 из 1
  • 1
Поиск:


Бесплатный конструктор сайтовuCoz