И так ,скрипты "спасающие" от ддоса прошу выкладывать только здесь! 1.Каждый второй скажет что скриты, темболее на php неспасут от настоящего ддоса. -Это естественно, но от среднего HTTP Флуда они спасти смогут. 1.Vbulletin antidd0s(1.2) Обязательно создайте каталог tmp с правами 777 -VB_antiddos Ставить на ветки 3.7.х \3.8.х ___________________________________ 2.IPB antidd0s(1) Обязательно создайте каталог tmp с правами 777 -IPB_antiddos Ставить на IPB 2.1.7 И аналоги ___________________________________ -IPB_antiddos Ставить на IPB 2.3.5 И аналоги Ну вообем это опять для тех кто сам собрать несможет..... Тех кто умеет гуглить и умеет некривые руки прошу некоментировать типа: и че ты сделал? типа любой так неможет...... Если кому надо на другие системы то либо стучим ко мне в аську, либо собираем сами..... 1.В самое начало index.php ставим это: <? include $_SERVER['DOCUMENT_ROOT'].'/antiddos.php'; ?> 2.Файлы из архива в корень и права на tmp -777 Ну вот и все.... сильно непинать...сделано для новичков.....Скачать Последнее обновление ссылок: 04.11.09
Команды ANTI-DDOS: Сколько апачей: Code: ps aux | grep httpd |wc -l Cколько коннектов на 80 порт: Code: netstat -na | grep ":80\ " | wc -l SYN Code: netstat -na | grep ":80\ " | grep syn Пример SYN-флуда: Code: netstat -na | grep ":80\ " | grep SYN | wc -l 767 Посмотреть много ли разных ай-пи: Code: netstat -na | grep ":80\ " | grep SYN | sort -u | more На какой домен чаще всего идут запросы: Code: tcpdump -npi eth0 port domain Статус апача: Code: apachectl status Посмотреть откуда IP: Code: whois xxx.xxx.xxx.xxx или Code: jwhois xxx.xxx.xxx.xxx где xxx.xxx.xxx.xxx IP атакующего Просниферить траф идущий на domain.ru (атакуемый домен) с записью в файл output.txt: Code: tcpdump -n -i eth0 -s 0 -w output.txt dst port 80 and host domain.ru dst также можно поменять на src: Code: tcpdump -n -i eth0 -s 0 -w output.txt src port 80 and host domain.ru Допустим нашли IP (xxx.xxx.xxx.xxx) с которого много запросов: tcpdump и там где был атакуемый домен вводим этот IP: Code: tcpdump -n -i eth0 -s 0 -w output.txt src port 80 and host xxx.xxx.xxx.xxx С какого IP сколько запросов: Code: netstat -ntu | awk '{print $5}'| cut -d: -f1 | sort | uniq -c | sort -nr | more или просто Code: netstat -na | grep :80 | sort | uniq -c | sort -nr | more Посмотреть на какие порты: Code: netstat -na | grep xxx.xxx.xxx.xxx где xxx.xxx.xxx.xxx IP атакующего и блочить начиная с тех, где больше коннектов. Закрыть доступ для целой подсети IP (xxx.xxx.xxx.xxx), на конкретный протокол(-p) порт(–destination-port) в конкретном направлении(-d или -s: В одном направлении (-d): Code: iptables -A INPUT -d xxx.xxx.0.0/16 -p tcp --destination-port http -j DROP В другом направлении (-s): Code: iptables -A INPUT -s xxx.xxx.0.0/16 -p tcp --destination-port http -j DROP Тоже самое, но для конкретного IP (xxx.xxx.xxx.xxx) Code: iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --destination-port http -j DROP iptables -A INPUT -d xxx.xxx.xxx.xxx -p tcp --destination-port http -j DROP Блокировка по всем протоколам и портам, в направления -s и -d: Code: iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP iptables -A INPUT -d xxx.xxx.xxx.xxx -j DROP Если установлен файрвол APF, можно блочить с его помощью: Code: apf -d xxx.xxx.xxx.xxx Где xxx.xxx.xxx.xxx IP атакующего.
AntiOverload *FIX* PHP: <?php /* *-------------------------------------------------------- * Модуль antioverload *-------------------------------------------------------- * Модуль предназначен для ограничения доступа к сайту или * к страницам, где он включён. * Принцип работы в том, что запоминается ip-адрес и время * обращения с этого адреса. И если в течение заданного * времени происходит обращение с того же адреса, то ему * выдаётся ошибка 503. * Модуль необходимо подключать к скрипту самым первым. * Этим обеспечивается быстрота его работы. *-------------------------------------------------------- */ /* Время задержки в секундах */ $ad_delay=2; /* Путь к папке с временными файлами. Должен существовать */ $ad_DirName=$_SERVER['DOCUMENT_ROOT'].'/tmp'; /* *--------------------------------------------------------- * Список поисковых роботов. * Очень не хорошо, если поисковый робот будет натыкаться * на ошибки на сайте. Ему это может сильно не понравиться. * Поэтому пишем список юзер-агентов роботов; добавляем или * удаляем, что нужно. *--------------------------------------------------------- */ $ad_Robots_UserAgent=array( 'aipbot', 'Aport', 'eStyleSearch', 'Gigabot', 'Gokubot', 'Google', 'MJ12bot', 'msnbot', 'PlantyNet_WebRobot', 'StackRambler', 'TurtleScanner', 'Yahoo', 'Yandex', 'YaDirectBot', ); /* *--------------------------------------------------------- * Список доверенных IP. *--------------------------------------------------------- */ $ad_good_ip = array( '217.107.36.73', ); /* *---------------------------------------------------------- * Функция создаёт в указанной директории файл, начинающийся * с буквы a (для отличия от других возможных файлов) и * содержащий в имени ip-адрес клиента. *---------------------------------------------------------- */ function ad_WiteIP($dir){ $f=fopen($dir.'/a'.$_SERVER['REMOTE_ADDR'], 'w'); fclose($f); } /* *---------------------------------------------------------- * Проверка на наличие в поле HTTP_USER_AGENT чего-нибудь из * вышенаписанного списка. *---------------------------------------------------------- */ $ad_IsRobot=false; foreach ($ad_Robots_UserAgent as $match){ if (strstr($_SERVER['HTTP_USER_AGENT'], $match)){ $ad_IsRobot=true; break; } } if( in_array($_SERVER['REMOTE_ADDR'], $ad_good_ip) ) { $good_ip = true; } else { $good_ip = false; } /* *--------------------------------------------------------- * Поисковые роботы не любят, когда к адресу страницы * добавляется переменная сессии. Поэтому, если на сайте * используются сессии, то их лучше включать, если агент - * не робот. * Если сессии не используются, то этот кусок можно убрать. *--------------------------------------------------------- */ if (!$ad_IsRobot AND !$good_ip){ session_start(); } if (!$ad_IsRobot AND !$good_ip){ /*** Чтение каталога и удаление старых файлов ***/ $ad_dir =opendir($ad_DirName) or die('Отсутствует директория для временных файлов'); $ad_now =time(); $ad_forbid =$ad_now-$ad_delay; /* IP-адрес в имени файла, начинающегося на букву a, а время обращения - время изменения файла */ while (false!==($ad_FName=readdir($ad_dir))){ if (ereg('^a[1-9]',$ad_FName) && (@ filemtime($ad_DirName.'/'.$ad_FName)<$ad_forbid)){ @ unlink($ad_DirName.'/'.$ad_FName); } } closedir($ad_dir); /*** Проверка на существование пометки о недавнем обращении с данного ip-адреса ***/ if (file_exists($ad_DirName.'/a'.$_SERVER['REMOTE_ADDR'])){ /* Если обращение было недавно, то выводим сообщение об ошибке */ header('HTTP/1.0 503 Service Unavailable'); header('Status: 503 Service Unavailable'); header('Retry-After: '.$ad_delay*3); ?> <!doctype html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>Ошибка 503</title> <meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" /> </head> <body> <h1>Ошибка 503 (Service Unavailable)</h1> <p>Сервер не может в данный момент выдать запрашиваемую Вами страницу. Попробуйте вызвать эту страницу позже (клавиша F5).</p> </body> </html> <?php ad_WiteIP($ad_DirName); // Перед выходом записываем ip exit; }else{ ad_WiteIP($ad_DirName); } } ?>
Вот хороший антиддос-скрипт от S(ript'а, админа xaknet.ru: PHP: <?php /* .##.....##....###....##....##.##....##.########.######## ..##...##....##.##...##...##..###...##.##..........##... ...##.##....##...##..##..##...####..##.##..........##... ....###....##.....##.#####....##.##.##.######......##... ...##.##...#########.##..##...##..####.##..........##... ..##...##..##.....##.##...##..##...###.##..........##... .##.....##.##.....##.##....##.##....##.########....##... ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @comment - При использовании кусков или полного исходного кода, авторство указывать обязательно @author - S(r1pt @version - 1.2 @date - 27.11.2009 */ class antiDdos { // дебаг public $debug = false; // директория для хранения файлов индефикации запросов public $dir = '_bots/'; // номер icq администратора public $icq = '123456'; // сообщение при выключенном сайте public $off_message = 'Временные неполадки, пожалуйста, подождите.'; // индивидуальный индефикатор private $indeficator = null; // сообщение при бане, работают шаблоны, можно использовать - {ICQ}, {IP}, {UA}, {DATE} public $ban_message = 'Вы были заблокированы antiddos системой. Если это ошибка обратитесь к администратору, icq of admin: {ICQ} <hr>(c)XakNet antiddos module, ваш IP - {IP}(<i>{UA}</i>), date - {DATE}'; // команда выполнения бана в файрволле public $exec_ban = 'iptables -A INPUT -s {IP} -j DROP'; // тип защиты от ддоса: /* Возможные значения $ddos 1-5: | 1. Простая проверка по кукам, по умолчанию(рекомендую) | 2. Двойная проверка через $_GET antiddos и meta refresh | 3. Запрос на авторизацию WWW-Authenticate | 4. полное отключение сайта, боты не блокируются!!! | 5. выключать сайт если нагрузка слишком большая на сервере, боты не блокируются!!! */ var $ddos = 1; // часть домена поисковых ботов, см strpos() private $searchbots = array('googlebot.com', 'yandex.ru', 'ramtel.ru', 'rambler.ru', 'aport.ru', 'sape.ru', 'msn.com', 'yahoo.net'); // временная переменные нужные для работы скрипта private $attack = false; private $is_bot = false; private $ddosuser; private $ddospass; private $load; public $maxload = 80; function __construct($debug) { @session_start() or die('session_start() filed!'); $this->indeficator = md5(sha1('botik' . strrev(getenv('HTTP_USER_AGENT')))); $this->ban_message = str_replace(array('{ICQ}', '{IP}', '{UA}', '{DATE}'), array($this->icq, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT'], date('d.m.y H:i')), $this->ban_message ); if (eregi(ip2long($_SERVER['REMOTE_ADDR']), file_get_contents($this->dir . 'banned_ips'))) die($this->ban_message); $this->exec_ban = str_replace('{IP}', $_SERVER['REMOTE_ADDR'], $this->exec_ban); $this->debug = $debug; if(!function_exists('sys_getloadavg')) { function sys_getloadavg() { return array(0,0,0); } } $this->load = sys_getloadavg(); if(!$this->sbots()) { $this->attack = true; $f = fopen($this->dir . ip2long($_SERVER["REMOTE_ADDR"]), "a"); fwrite($f, "query\n"); fclose($f); } } /** * Старт работы антиддоса **/ function start() { if($this->attack == false) return; switch($this->ddos) { case 1: $this->addos1(); break; case 2: $this->addos2(); break; case 3: $this->ddosuser = substr(ip2long($_SERVER['REMOTE_ADDR']), 0, 4); $this->ddospass = substr(ip2long($_SERVER['REMOTE_ADDR']), 4, strlen(ip2long($_SERVER['REMOTE_ADDR']))); $this->addos3(); break; case 4: die($this->off_message); break; case 5: if ($this->load[0] > $this->maxload) { header('HTTP/1.1 503 Too busy, try again later'); die('<center><h1>503 Server too busy.</h1></center><hr><small><i>Server too busy. Please try again later. Apache server on ' . $_SERVER['HTTP_HOST'] . ' at port 80 with <a href="http://forum.xaknet.ru/">ddos protect</a></i></small>'); } break; default: break; } if ($_COOKIE['ddos'] == $this->indeficator) @unlink($this->dir . ip2long($_SERVER["REMOTE_ADDR"])); } /** * Функция проверяет не является ли клиент поисковым ботом **/ function sbots() { $tmp = array(); foreach($this->searchbots as $bot) { $tmp[] = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), $bot) !== false; if($tmp[count($tmp) - 1] == true) { $this->is_bot = true; break; } } return $this->is_bot; } /** * Функция бана **/ private function ban() { if (! system($this->exec_ban)) { $f = fopen($this->dir . 'banned_ips', "a"); fwrite($f, ip2long($_SERVER['REMOTE_ADDR']) . '|'); fclose($f); } die($this->ban_message); } /** * Первый тип защиты **/ function addos1() { if (empty($_COOKIE['ddos']) or !isset($_COOKIE['ddos'])) { $counter = @file($this->dir . ip2long($_SERVER["REMOTE_ADDR"])); setcookie('ddos', $this->indeficator, time() + 3600 * 24 * 7 * 356); // ставим куки на год. if (count($counter) > 10) { if (! $this->debug) $this->ban(); else die("Блокированы."); } if (! $_COOKIE['ddos_log'] == '1') { if (! $_GET['antiddos'] == 1) { setcookie('ddos_log', '1', time() + 3600 * 24 * 7 * 356); //чтоб не перекидывало постоянно рефрешем. if(headers_sent()) die('Header already sended, check it, line '.__LINE__); header("Location: ./?antiddos=1"); } } } elseif ($_COOKIE['ddos'] !== $this->indeficator) { if (! $this->debug) $this->ban(); else die("Блокированы."); } } /** * Второй тип защиты **/ function addos2() { if (empty($_COOKIE['ddos']) or $_COOKIE['ddos'] !== $this->indeficator) { if (empty($_GET['antiddos'])) { if (! $_COOKIE['ddos_log'] == '1') //проверям есть ли запись в куках что был запрос die('<meta http-equiv="refresh" content="0;URL=?antiddos=' . $this->indeficator . '" />'); } elseif ($_GET['antiddos'] == $this->indeficator) { setcookie('ddos', $this->indeficator, time() + 3600 * 24 * 7 * 356); setcookie('ddos_log', '1', time() + 3600 * 24 * 7 * 356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем. } else { if (!$this->debug) $this->ban(); else { echo "May be shall not transform address line?"; die("Блокированы."); } } } } /** * Третий тип защиты **/ function addos3() { if (! isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER'] !== $this->ddosuser || $_SERVER['PHP_AUTH_PW'] !== $this->ddospass) { header('WWW-Authenticate: Basic realm="Vvedite parol\': ' . $this->ddospass . ' | Login: ' . $this->ddosuser . '"'); header('HTTP/1.0 401 Unauthorized'); if (! $this->debug) $this->ban(); else die("Блокированы."); die("<h1>401 Unauthorized</h1>"); } } } /* // Exmaple $ad = new antiDdos(false); $ad->dir = 'bots/'; $ad->ddos = 2; $ad->start(); */ ?>
НЕкие скрипты для защиты ! В этом топике постараюсь вам показать несколько скриптов, которые способны защитить от среднего HTTP флуда. Начнём. Первый, самый лёгкий скрипт, но даёт результат: Code: ### security protection ::: ANTIDDOS ### $google=false; if(eregi("googlebot",$_SERVER['HTTP_USER_AGENT']))$google=true; if(eregi("yandexbot",$_SERVER['HTTP_USER_AGENT']))$google=true; $nn = md5("837sgsa".$_SERVER['REMOTE_ADDR']); if (!isset($_COOKIE[$nn]) && FILE!=="/announce.php" && $google==false) { if (isset($_POST[$nn])){ setcookie($nn, "yes"); header("Location: http://google.com".$_SERVER['REQUEST_URI']);exit; } echo "<html><body><form id=\"f\" action=\"http://google.com".$_SERVER['REQUEST_URI']."\" method=\"post\"><input type=\"hidden\" name='".$nn."' value='a'><script>document.getElementById('f').submit();</script><input type=\"submit\" value='Continue'></form></body></html>"; die(); } ### security protection ::: ANTIDDOS ### Скрипты будут ещё выкладываться. Этот скрипт защищает немного сайт.. Пробовал ддосить сайт с обычной проги ламерской, не прошло
Смотря, что ты понимаешь под пользой.Если систему,которая будет блокировать сильно активные IP адреса и недопускать их до всего сайта, то очень даже хорошо помогают. А если ты ожидал,что одним скриптиком упасаешься от 100м\бит'ной Ddos атаки, то видимо тебе они и вправду некчему.
ВОт проблема нада увеличить интервал при обновлении страницы , стоит 2 раза обновляеш AntiOverload *FIX* Цитата: Модуль предназначен для ограничения доступа к сайту или к страницам, где он включён. Принцип работы в том, что запоминается ip-адрес и время обращения с этого адреса. И если в течение заданного времени происходит обращение с того же адреса, то ему выдаётся ошибка 503.Т.е Если вы нажмёте кнопку обновить 3 раза подарят,вам выдаст это сообщение Установка: *Качаем antiOverload.txt *В корне сайта создаем папку tmp и выдаём права 777(Если папка есть,то не чего создовать не надо.) *Открываем index.php и перед: <?php Вот использую этот скрипт и есть проблема нада увеличить интервал при обновлении страницы , стоит 2 раза обновляеш и уходишь в бан , а мне нада хотяб 5 раз...
Первый, самый лёгкий скрипт, но даёт результат: Код: ### security protection ::: ANTIDDOS ### $google=false; if(eregi("googlebot",$_SERVER['HTTP_USER_AGENT']))$google=true; if(eregi("yandexbot",$_SERVER['HTTP_USER_AGENT']))$google=true; $nn = md5("837sgsa".$_SERVER['REMOTE_ADDR']); if (!isset($_COOKIE[$nn]) && FILE!=="/announce.php" && $google==false) { if (isset($_POST[$nn])){ setcookie($nn, "yes"); header("Location: http://google.com".$_SERVER['REQUEST_URI']);exit; } echo "<html><body><form id=\"f\" action=\"http://google.com".$_SERVER['REQUEST_URI']."\" method=\"post\"><input type=\"hidden\" name='".$nn."' value='a'><script>document.getElementById('f').submit();</script><input type=\"submit\" value='Continue'></form></body></html>"; die(); } ### security protection ::: ANTIDDOS ###
По поводу PHP иногда полезно включать буферизацию, но это не всем подходит. http://forum.antichat.ru/showthread.php?t=128554 вот тут описаны тонкости настройки апача. иногда ставлю: Timeout 10 KeepAliveTimeout 15 LimitRequestBody 0 LimitRequestFields 100 LimitRequestFieldSize 8190 LimitRequestLine 8190 Хотя конечно же лучше иметь nginx в качестве гейта (у которого очень высокая отказоустойчивость) и способный машрутизатор который сможет "разгрузить" сервера от SYN флуда сам (в автоматическом режиме). Практически все основные хостеры имеют такой "пионерский" арсенал
Скрипт DDoS-Deflate продемонстрировал себя неплохо при ддосе в 500-1000 ботов, при большем количестве атакующих нетстат начинает тупить, и оказываются запущенными 2-3 его копии, что еще больше гурзит сервак, так что советую допилить блокировку. Перед строками: TMP_PREFIX='/tmp/ddos' TMP_FILE="mktemp $TMP_PREFIX.XXXXXXXX" BANNED_IP_MAIL=`$TMP_FILE` Добавьте RUNCOPY="/tmp/ddos.run" if [ -f "$RUNCOPY" ] && [ ! "$RUNCOPY" == "" ]; then source $RUNCOPY head echo "Уже запущен." exit 1 else source $RUNCOPY touch $RUNCOPY fi и в самом конце скрипта rm -f $RUNCOPY Немного поможет. Плюс парсинг логов нджинигса, и блок до*бывающихся по одинаковым запросам за определенный промежуток времени. UPD: Сами скрипты проигрывают из-за отсутствия реалтайма, раз в минуту это не "по-пацану" рекомендую юзать connlimit и прибить udp на 80.
503 ошибка полный бред, можно подумать апач от 503 не грузится, хотелось бы что то вроде этого 3 раза обновил одну и ту же страницу = каптча с вопросом= еще 3 обновления = iptables хотелось бы еще от парсинга защититься, но тут практически нереально, хз под чем ходят клоак боты