Система обнаружения и погашения DDOS-атаки http флудом Идея написания подобной системы возникла у меня, после того как в очередной раз один из моих сайтов подвергся DDOS атаке, в то время я висел на обычном хостинге, где за каждый мегабайт трафика приходилось платить, и сумма в итоге итак выходила не маленькая, а тут еще эта DDOS атака, хорошо еще, что я в тот момент был рядом и вовремя успел отключить доступ к сайту. Тут конечно же в аську стукнул тот самый ддосер с требованиями заплатить, его я само собой послал подальше. Как понимаете, отключение сайта и пережидание атаки это не выход, она может возобновиться когда угодно, и вас рядом может не оказаться, поэтому с этим нужно бороться. Сразу предупреждаю, система написана на php и предназначена только для ослабления атаки http flood, от другого типа ddos атаки, к примеру: icmp и udp на уровне обычного владельца веб сайта защититься невозможно. Вкратце о системе: система включает модуль обнаружения DDOS атаки, который производит постоянный мониторинг загруженности сайта, путем отслеживания количества приходящих запросов в секунду, в случае если количество запросов в секунду превысит 10 (это по умолчанию, можно выставить больше), то подключается модуль погашения атаки, который начинает вычислять IP адреса атакующих машин-зомби и заносить их в блэклист, мониторинг при этом отключается по умолчанию на 1 час. Принцип действия я думаю, понятен, вот сам код: К примеру, создадим каталог anti_ddos и кидаем все скрипты туда: index.php (модуль обнаружения DDOS атаки): PHP: <?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); } } ?> anti_ddos.php (модуль погашения DDOS атаки): PHP: <?php function getIP() { if(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 Code: Deny from 11.11.11.11 22.22.22.22 и т.д. через пробел Да чуть не забыл, для подключения скрипта, в начале каждого файла, который может быть подвергнут атаке добавляем строчку: Code: require("anti_ddos/index.php"); Вот в общем и все, буду рад если будут дополнения =) © ant0ha
Не слишком ли громкое название? Без обид - эта поделка не имеет никакого отношения к системам обнаружения и погашения DDOS-атак. Это нонсенс защищаться от DDOS атак на атакуемом узле, да и ещё и внутри самого ресурса... Т.е. в данном случае, ты выбрал самое неподходящее место для реализации защиты. Меры защиты тем эффективнее, чем ближе они к атакующим узлам. Так что, именно в данном случае эффективнее будет уклонение от атаки... И я тысячу раз повторял, ни одна поделка вроде этой никогда не будет эффективнее чем статистический или сигнатурный анализ трафика, причём аппаратными средствами. Ты не препятствуешь атаке никак, твой апач как порождал соединения, так он их и будет порождать, ещё и будет файловую систему месить добавляя и удаляя что-то из файлов... Единственное - ты немного снизишь трафик, т.к. вместо полноценных страниц боты будут получать мат от твоей поделки. Хотя с другой стороны - чем меньше они в одном потоке будут получать, тем чаще они такие потоки будут порождать... В общем, курам насмех такие "защищалки"...
Ты так хорошо рассуждаешь... знаешь, когда на твой сайт начинаеться ДДОС атака ты уже не думешь, что Ибо если подумать головным мозгом, то при ботнете в 10к ботов ты таких "мер" принять не сможешь никогда. Я тебе даже больше скажу: лично ты таких мер не сможешь принять и при ботнете в 10 ботов. Так что не забывай - критикуя, предлагай. Просто обосрать чужой способ может каждый.
Впринципе groundhog прав, плюс еще небольшой нюанс, я не весь скрипт просматривал, а только поверхностно, но если я не ошибся, то процедура определения IP, которую ты любезно одолжил у существующего скрипта, явно не преднозаченого для ДДОС блокировки, позволяет подделать IP, вследствии чего его можно генерировать рандомно хоть с одного хоста и хер ты кого забаниш! Да и еще, максимум, что можно сделать определив такой ДДОС это отключить автоматически в панеле пользователя доступ к сайту, тем самым сэкоомив денюшку, но все это конечно косается детского ддоса ибо от серъезного ты таким способом не закроешся, а еще можно в ответ на каждый из IP ддосеров посылать свой БОТНЕТ и убивать их поодному =) (шутка).
Alexsize, умерь свой пыл, брат. Я написал какая мера защиты - интеграция на уровне провайдера комбинированных статистических и сигнатурных анализаторов трафика, которые при каждой новой волне будут банить ботов, причём банить будут на близлежащих маршрутизаторах, а не на сервере с атакуемым ресурсом. И чем глобальнее будет такая схема, тем эффективнее будет мера борьбы - только одна волна будет проходить в одну подсеть с одного бот-нета. Моском подумать не могу - ибо зохавали. Тот способ, что я предложил как раз и расчитан на глобальные атаки, фишка в том, что такая атака будет проходить только одной волной, при том, что такая волна по мере достижения атакуемого ресурса будет растворяться... Поэтому ты мне "...даже больше не говори...", а иди учи мат. часть. Я тебя тоже люблю. И прислушайся к совету madnet... Как он верно подметил - переменные берутся из среды окружения... Такие переменные элементарно подделываются программными методами... Так что эта пукалка защитит только от ботнета в 10 ботов, а реального ботовода с гигантским ботнетом она только повеселит...
Это единственное место, где можно развернуть защиту в данном случае, и уклонение от атаки это не выход, если есть возможность с ней бороться. Если сайт крупный, иначе смысл его ддосить, то потребление трафика будет в сотни-тысячи раз меньше, и потом уже после двух запросов ддос машина будет добавлена в блеклист и от нее не будит никакого толку. Этот момент не совсем понял, насчет подделки IP, можно поподробнее? Лучше стенка на стенку, боты против ботов вот это будет зрелище =) При чем тут на уровне провайдера, им вообще до твоего сайта дела никакого нет, им проще твой аккаунт на пару дней вырубить.
Ога, и платить деньги за левый трафик... Ты хоть понимаешь абсурдность этого утверждения? Соединения будут проходить чаще, ресурсы ВЕБ-СЕРВЕРА будут истощяться. Веб-сервер будет продолажать принимать запросы от ботов, и будет продолжать дёргать твою страницу! По умолчанию, одному запускаемому скрипту в PHP5 отводится 128 Мб памяти, прикинь во что это выльется при большом количестве запросов? Понту от твоего блек-листа? Кто его обрабатывает? Веб сервер? Или твой скрипт? Так твой скрипт по прошествии некоторого времени просто не будет выполняться из-за того что веб-сервер сдохнет! Ты берёшь переменные, которые посылаются в хидерах запроса, то, что там посылается - фигня подделать. Пральна мыслишь, чувак. Так оно и будет, и провайдерский одмин будет долго ржать, узнав как ты от доса защищался... Всё это я говорю к тому, что не надо громких названий, и надо быть серьёзнее, а если вы не представляете о чём идёт речь - так лучше вообще про это не писать! Предлагаю переименовать тему в "DDOS-пукалка или как рассмешить провайдерского одмина".
Некоторые файерволлы поддерживают функцию блокировки IP через командную чтроку, ну тоесть на компе стоит фаер, выполняем команду filewall -banip 11.222.33.444 и он банит его, токо я непомню какие фаерволлы поддерживают такие функции... Так вот... Вместо того, чтобы заносить в .htaccess можно банить сразу доступ к компу, и тогда уже реально защититься от самого настояещего DDoS (если атакуют 2-3 компа )
Трафа практически не будет, уклон какраз и был на это. Повторюсь И что ты предлагаешь брать просто REMOTE_ADDR, а как же тогда прокси? Я и не писал что она от всех DDOS атак спасет, вот http флуд она погасит.
Лучше сразу добавлять злые адреса в .httaccess , а то так ещё php-cgi будет вызываться. Обычно на хостингах есть лимит на память, и тп. Когда меня ДДОСили, то ДДОС включили всего на несколько минут, а сервер запросы обрабатывал до утра, пока я deny from all не сделал и переждал. Так-что если ДДОС серьёзный, то тут никакая подобная защита не спасёт. Надо писать в суппорт и пусть они на рутере отрубают досеров. Но все-равно от малолеток с программой "взлом интернета" и такой способ сгодиться. ++ А это уже не твоя проблема будет, а всего сервера. Чтобы вывести твой сайт из строя им придётся весь сервер задосить, что куда сложнее, чем превысить лимиты памяти для конкретного пользователя
Не вижу решения... Таким "решением" моя бабушка от Митника в своё время защищалась, и то безуспешно... В то время как тебя досят - писать в файл? Это по вашему решение? Уж хоть бы, как правильно заметил, фукерок - .htaccess на эту директорию создавали при привышении нагрузки...
Безусловно подобный скрипт не погасит атаку никак. Но это не значит, что на самом сервере ничего сделать нельзя. Просто надо немного по другому подойти к этому делу.
Иначе бы я его тут не выложил, от 100-200 машин реально спасет, больше испытывать не приходилось, да и зачастую, если ддосят не на заказ в атаке одновременно больше машин и не участвует, а чтобы припугнуть этого количества вполне достаточно.
index.php remote file include. PHP: Line 33: $ad_file=fopen("{$ad_dir}/{$ad_check_file}","w"); Line 39: $ad_file=fopen("{$ad_dir}/{$ad_check_file}","w"); SQL inj
Смотри внимательней, эти параметры заданы в начале, их не подделать: PHP: $ad_dir='anti_ddos'; // каталог со скриптами $ad_check_file='check.txt'; // файл для записи текущего состояния во время мониторинга Издеваешься =), там sql не используется.
Во-первых: Где-то этот принцип я видел уже... Во-вторых: по-моему, тоже самое, что и PHP: <?php$ip=$_SERVER['REMOTE_ADDR'];if($ip=='127.0.0.1'){echo("На*** надо...");} else { echo(Дорогая!); }?>