|
|
|
| В последнее время, при просмотре счетчика посещения, я обнаружил, что резко стала возрастать посещаемость отдельных страниц сайта. Например, в течении часа до 500 и более посещений с одного ip-адреса.
Подскажите, каким образом можно блокировать эти ip-дреса и можно ли это предусмотреть в Powercounter, который используется на сайте. | |
|
|
|
|
|
|
|
для: sevidi
(29.03.2011 в 14:22)
| | Через PHP такие вещи лучше не делать, так как он сам по себе потребляет достаточно много ресурсов. Лучше воспользоваться .htaccess, который можно формировать автоматически в том числе и PHP (а вот защита будет уже на уровне Apache). | |
|
|
|
|
|
|
|
для: cheops
(29.03.2011 в 14:33)
| | На одном из сайтов нашел вот такой скрипт
<?php
// $link -- соединение с БД, $ip_text -- IP-адрес
define('ALERT_TIME',300);
define('ALERT_COUNT',150);
function check_dos($ip_text, $link) {
$ip=ip2long($ip_text);
$res=mysql_query($link,'SELECT lasttime, count, status FROM ip_check WHERE ip="'.$ip.'"');
if (mysql_num_rows($res)==0) { // нет такого IP
$count=1;
mysql_query($link,'INSERT INTO ip_check (lasttime,count,ip,status) VALUES ('.time().',1,"'.$ip.'",0)');
}
else {
$data=mysql_fetch_row($res);
$status=$data[2];
if ($status!=2 && ($data[0]<time()-ALERT_TIME || $data[1]<ALERT_COUNT))) $count=1;
elseif ($status!=2) { $count=$data[1]+1; if ($count>=ALERT_COUNT) $status=1; }
if ($status!=2) {
mysql_query($link,'UPDATE ip_check SET count='.$count,', status='.$status.', lasttime='.time().' WHERE ip="'.$ip.'"';
}
if ($status) {
header($_SERVER['HTTP_PROTOCOL'].' 503 Temporary Unavailable');
trigger_error('Превышено число допустимых запросов!',E_USER_ERROR);
}
}
?>
|
Создается таблица в БД. Сразу после подключения к базе данных выполняется проверка, есть ли для данного IP-адреса запись в таблице. Если записи нет, она создается, при этом в count пишется 1, в lasttime — текущее время. Если запись уже есть, то проверяется, когда она была сделана (поле lasttime), и если прошло менее определенного количества секунд, то поле count увеличивается на 1, в противном случае приравнивается единице, и производится обновление записи в таблице (записывается новый count и lasttime). Далее происходит проверка величины count, и если она превысила некоторое пороговое значение, выдается статус 500 (или 403 или 503), сообщение об ошибке, и выполнение скрипта завершается.
Таким образом, для выполнения проверки требуется всего одной таблица с предельно простой структурой и 2 запроса SQL. Также можно добавить еще одно поле status, в которое ставить 1, если IP-адрес забанен навсегда по каким-то причинам, и совместить проверку на DoS-атаки с проверкой на забаненные IP-адреса без добавления дополнительных запросов. При необходимости можно еще одним запросом добавить учет суммарной нагрузки за все время или нагрузки по подсетям.
Попробовал использовать этот скрипт, создал БД, но скрипт не работает. Как вы считаете есть ли смысл отрабатывать скрипт дальше или все таки блокировать ip-адреса в .htaccess. | |
|
|
|
|
|
|
|
для: sevidi
(29.03.2011 в 14:56)
| | Да ну... с MySQL защищаться от DDOS вообще не серьезно. Хорошей DDOS-атаке будет достаточно этой защиты с SELECT-ами и UPDATE-ами, чтобы положить сервер на лопатки. От нормальной DDOS-атаки даже защита на уровне Apache не поможет, а тут и PHP и MySQL. | |
|
|
|
|
|
|
|
для: sevidi
(29.03.2011 в 14:22)
| | Защититься от ddos атаки на уровне php, mysql и apache практически невозможно. Для защиты от средней ddos атаки ботнетом нужен хостинг, в прайсе которого числится "защита от ddos атак", в идеале имеющего cisco guard или более продвинутые технологий. Но ценники на такой хостинг заоблачные. | |
|
|
|
|
|
|
|
для: sevidi
(29.03.2011 в 14:22)
| | Защита от ддос? когда покупаете хостинг там предлогают такую опцию, но в большинстве случаев под этим подразумеваеться расширение канала связи, что делает затруднительным(хотя относительно) забивание всякой хренью ваших "связей"
А так ддос это посути выполнение бесполезных, но емких запросов с разных машин(ну как тут защитишься?), то есть в итоге с разных машин(айпи разные, параметры системы и прочее разные) посылаються бесполезные, но емкие запросы серверу и в итоге забиваеться канал связи, а если неоптимизирован движок, то и вообще весь сервер ложиться. Соответственно чем шире "канал связи" тем сложнее его засорить, хотя все относительно | |
|
|
|
|
|
|
|
для: sevidi
(29.03.2011 в 14:22)
| | Насколько я понимаю, в данном случае речь идет о не защите от DDoS, а о защите от частых обращенияй к сайту.
Первое, что желательно решить - а надо ли? Если сервер грузится, то проблема не в 500 обращениях в час с айпи. Надо исправлять код, видимо там много ошибок есть. Как временное решение без разбирательств - кэширование. Помните и о поисковиках, которые вот как раз так себя и проявляют.
Второе - это, все-таки, если вы решили "защищаться" - имеет смысл аналогичный скрипт, но используя файлы. cheops говорит правильно, от DDoS такими методами защищаться бесполезно. Но, как я выше сказал, у вас частые обращения, а не DDoS. В самое начало скрипта:
<?
$ip_file=isset($_SERVER['REMOTE_ADDR'])?'defend/'.ip2long($_SERVER['REMOTE_ADDR']:'defend/0';
$ip_count=(file_exists($ip_file))?file_get_contents($ip_file):0;
$ip_count++;
if($ip_count>100)exit;
file_put_contents($ip_file,$ip_count);
?>
|
Ну и по крону чистите каталог defend раз в десять минут, ориентируясь на filemtime.
Что-то в этом роде.
1) это не защита от ddos, это защита от частых обращений к сайту (напомню, весь интернет наоборот старается заиметь побольше и почаще обращений к себе). Даже один и тот же айпи можно использовать... по-разному :)
2) подобная штука экономичнее вашего примера.
3) ну и повторюсь: а стоит ли? лечите основное приложение. | |
|
|
|
|
|
|
|
для: sevidi
(29.03.2011 в 14:22)
| | Если у вас VDS на *nix то отлично поможет iptables | |
|
|
|