DoS-атака (от англ. Denial of Service — и DDoS-атака (Distributed Denial of Service — — это разновидности атак злоумышленника на компьютерные системы. Цель этих атак — довести систему до отказа, то есть, создание таких условий, при которых легитимные (правомерные) пользователи системы не могут получить доступ к предоставляемым системой ресурсам, либо этот доступ затруднён. DoS-атака может быть как самоцелью (например, сделать недоступным популярный сайт), так и одним из шагов к овладению системой (если во внештатной ситуации ПО выдаёт какую-либо критическую информацию — например, версию, части программного кода и т. д.). © Википедия Анти DDOS with Firewall [::.Intro.::] Много писать не буду, все понятно! Надоело видеть ошибку 504 при заходе на свой сайт? Я помогу Вам избавиться от этого с помощью Firewall. Естественно защитить от огромного кол-ва ботов вы не сможете, однако [::.Script.::] Code: <?php error_reporting(0); $array = array('66.249.64.', '81.19.64.', '89.208.19.', '213.180.206.', '72.30.0.', '87.250.230.', '213.180.216.', '222.0.0.'); $position = explode('.', $_SERVER['REMOTE_ADDR']); $pos = $position[0].'.'.$position[1].'.'.$position[2].'.'; if(!in_array($pos, $array)) { $dir = 'bots/'; $cook = strrev(sha1('Fuck you' . md5(getenv('HTTP_USER_AGENT')))); function ban() { system("/bin/sudo pfctl -t dl -T add " . escapeshellarg($_SERVER["REMOTE_ADDR"])); die('Firewall has been you!!!<br/>Cookie must be on'); } if (empty($_COOKIE['ddos'])) { $counter = @file($dir . $_SERVER["REMOTE_ADDR"]); if(count($counter) > 5) ban(); setcookie('ddos', $cook, time() + 9800); $f = @fopen($dir . $_SERVER["REMOTE_ADDR"], "a"); fwrite($f, "Antiddos by xeka.ru\r\n"); fclose($f); header('Location: ' . $_SERVER['PHP_SELF']); die(); } if ($_COOKIE['ddos'] !== $cook) { ban(); die(); } if ($_COOKIE['ddos'] == $cook) { system("/bin/sudo pfctl -t dl -T del " . $_SERVER["REMOTE_ADDR"]); @unlink($dir . $_SERVER["REMOTE_ADDR"]); } } ?> [::.Description.::] $array - массив с IP адресами поисковых ботов, которых мы НЕ баним! $dir - папка, куда будем записывать файлы с IP адресами плохих отрубей. CHMOD права на папку 0777 $cook - пишите что хотите, записываем шифр в куки function ban() - Создаем функцию бана с помощью команды к файрволу. Далее проверки и отделение хороших от отрубей (c)Isis -------------------------------------------------------------------------------------------------- Методы защиты от DDoS нападений Попасть под воздействие DDoS атаки – кошмарный сценарий для любого системного администратора, специалиста по безопасности или поставщика доступа. Обычно атака начинается мгновенно и без предупреждения и не прекращается со временем – система не отвечает, канал заблокирован, маршрутизаторы перегружены. Эффективный и быстрый ответ на нападение затруднителен и часто зависит от третих лиц, типа ISP провайдеров. В этой статье исследуется методы, которые должны использовать системные администраторы, если они когда-либо оказались в этой, довольно нежелательной, ситуации. Обнаружение DDoS нападения DDoS нападение распознать просто – замедление работы сети и серверов, заметное как администратору системы, так и обычному пользователю. Первым шагом в нашей защите мы должны идентифицировать тип трафика, который загружает нашу сеть. Большинство нападений DDoS посылает очень определенный тип трафика - ICMP, UDP, TCP, часто с поддельными IP адресами. Нападение обычно характеризует необычно большое количество пакетов некоторого типа. Исключением к этому правилу являются DDoS нападения, направленные против определенных служб, типа HTTP, используя допустимый трафик и запросы. Чтобы идентифицировать и изучить пакеты, мы должны анализировать сетевой трафик. Это можно сделать двумя различными методами в зависимости от того, где исследуется трафик. Первый метод может использоваться на машине, которая расположена в атакуемой сети. Tcpdump - популярный сниффер, который хорошо подойдет для наших целей. Анализ трафика в реальном масштабе времени невозможен на перегруженной сети, так что мы будем использовать опцию "-w", чтобы записать данные в файл. Затем, используя инструмент типа tcpdstat или tcptrace, мы проанализируем результаты.Результаты работы tcpdstat, на нашем tcpdump файле: Code: DumpFile: test FileSize: 0.01MB Id: 200212270001 StartTime: Fri Dec 27 00:01:51 2002 EndTime: Fri Dec 27 00:02:15 2002 TotalTime: 23.52 seconds TotalCapSize: 0.01MB CapLen: 96 bytes # of packets: 147 (12.47KB) AvgRate: 5.56Kbps stddev:5.40K PeakRate: 25.67Kbps IP flow (unique src/dst pair) Information # of flows: 9 (avg. 16.33 pkts/flow) Top 10 big flow size (bytes/total in %): 26.6% 16.5% 14.7% 11.6% 9.8% 7.6% 5.4% 5.4% 2.5% IP address Information # of IPv4 addresses: 7 Top 10 bandwidth usage (bytes/total in %): 97.5% 34.1% 31.2% 21.4% 10.7% 2.5% 2.5% Packet Size Distribution (including MAC headers) <<<< [ 32- 63]: 79 [ 64- 127]: 53 [ 128- 255]: 8 [ 256- 511]: 6 [ 512- 1023]: 1 >>>> Protocol Breakdown <<<< protocol packets bytes bytes/pkt ------------------------------------------------------------------------ [0] total 147 (100.00%) 12769 (100.00%) 86.86 [1] ip 147 (100.00%) 12769 (100.00%) 86.86 [2] tcp 107 ( 72.79%) 6724 ( 52.66%) 62.84 [3] telnet 66 ( 44.90%) 3988 ( 31.23%) 60.42 [3] pop3 41 ( 27.89%) 2736 ( 21.43%) 66.73 [2] udp 26 ( 17.69%) 4673 ( 36.60%) 179.73 [3] dns 24 ( 16.33%) 4360 ( 34.15%) 181.67 [3] other 2 ( 1.36%) 313 ( 2.45%) 156.50 [2] icmp 14 ( 9.52%) 1372 ( 10.74%) 98.00 Как видно, эти простые утилиты могут быстро помочь определить тип преобладающего трафика в сети. Они позволяют сэкономить много времени, анализируя и обрабатывая зафиксированные пакеты. Для контроля входящего трафика может использоваться маршрутизатор. С помощью списков ограничения доступа, маршрутизатор может служить основным пакетным фильтром. Скорее всего он также служит шлюзом между вашей сетью и интернетом. Следующий пример от Cisco иллюстрирует очень простой способ использовать списки доступа, чтобы контролировать входящий трафик: Code: access-list 169 permit icmp any any echo access-list 169 permit icmp any any echo-reply access-list 169 permit udp any any eq echo access-list 169 permit udp any eq echo any access-list 169 permit tcp any any established access-list 169 permit tcp any any access-list 169 permit ip any any interface serial 0 ip access-group 169 in Используя команду "show access-list", система покажет количество совпавших пакетов для каждого типа трафика: Code: Extended IP access list 169 permit icmp any any echo (2 matches) permit icmp any any echo-reply (21374 matches) permit udp any any eq echo permit udp any eq echo any permit tcp any any established (150 matches) permit tcp any any (15 matches) permit ip any any (45 matches) Результаты просты, но эффективны – обратите внимание на высокое число ICMP echo-reply пакетов. Подробная информация может быть собрана о подозреваемых пакетах, добавляя в конец команду "log-input" к специфическому правилу. Это правило будет регистрировать информацию о любом ICMP трафике: access-list 169 permit icmp any any echo-reply log-input Маршрутизатор теперь более подробно регистрирует собранные данные (которые можно посмотреть используя "show log") о соответствующих пакетах. В пример ниже, файл регистрации показывает несколько пакетов, соответствующих правилу DENY ICMP: Code: %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.142 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.113 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.72 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.154 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.15 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.142 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.47 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.35 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.113 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.59 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.82 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.56 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.84 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.47 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.45.35 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 192.168.212.15 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet %SEC-6-IPACCESSLOGDP: list 169 denied icmp 172.16.132.33 (Serial0 *HDLC*) -> 10.2.3.7 (0/0), 1 packet Обратите внимание на информацию, содержавшуюся в каждой строке: источник и адрес назначения, интерфейс и правило, которому оно соответствует. Этот тип детальной информации поможет определить нашу защиту. Реакция После того, как мы идентифицировали подозреваемый трафик, пришло время исследовать, как нам ответить на нападение. К сожалению, варианты несколько ограничены, потому что большинство DDoS нападений использует поддельные исходные IP адреса, которые вероятно сгенерированы случайным образом. Так что же нам делать? Отслеживаем источник атаки Первое, что приходит в голову, это попытаться "проследить" источник атаки. Однако DDoS, в отличие от традиционного DoS, исходит из множественных источников. Поэтому неплохо было бы определить транзитный маршрутизатор, через который проходят большинство пакетов. К сожалению, для этого потребуется сотрудничать с несколькими источниками, так как вы не способны исследовать пакеты на вышестоящих маршрутизаторах. Каждый участник процесса (главным образом ISP провайдеры) будут использовать очень похожие методы. Идентифицировав злонамеренный тип трафика, используя вышеописанные методы, будет создан новый список ограничения доступа. Добавив его к правилам, которые применены к интерфейсу, который посылает трафик атакуемому адресату, мы снова используем команду "log-input". Регистрация подробно запишет информацию об исходном интерфейсе и MAC адресе источника атаки. Эти данные могут использоваться, чтобы определить IP адрес маршрутизатора, отправляющего злонамеренный трафик. Процесс будет повторен на следующем маршрутизаторе в цепочке. После нескольких итераций, источник (или один из них) будет обнаружен. Тогда можно создать соответствующий фильтр, который заблокирует атакующего. Недостаток в этом методе защиты от DDoS нападения – время и сложность. Получение таких данных требует работы с несколькими сторонами, и иногда использование правового принуждения. Ограничение допустимого предела (“rate limit”) Лучший способ немедленной помощи, доступный большинству ISP провайдеров, должно быть “ограничение допустимого предела” злонамеренного типа трафика. Ограничение допустимого предела ограничивает пропускную способность, которую определенный тип трафика может потреблять в данный момент времени. Это может быть достигнуто, удаляя полученные пакеты, когда превышен некоторый порог. Полезно, когда определенный пакет используется в нападении. Cisco предлагает способ, который позволяет ограничить ICMP пакеты, используемые в нападении: Code: interface xy rate-limit output access-group 2020 3000000 512000 786000 conform-action transmit exceed-action drop access-list 2020 permit icmp any any echo-reply Этот пример поднимает интересную проблему, которая была отмечена ранее. Что, если злонамеренный трафик полностью законный? Например, ограничение SYN flood, направленное на Web сервер, отклонит и хороший и плохой трафик, так как все законные подключения требуют начального установления связи. Это трудная проблема, не имеющая простого ответа. Нельзя просто защитится от таких типов хитрых DDoS нападений, не принося в жертву часть законного трафика. Фильтрация черной дыры ISP провайдеры могут использовать другие способы защиты, которые зависят от изменения маршрутизации, типа фильтрации “черных дыр”. “Black hole” фильтрация отправляет злонамеренный трафик к воображаемому интерфейсу, известному как Null0 – подобный /dev/null на Unix машинах. Так как Null0 - не существующий интерфейс, трафик, направленный к Null0, по существу удаляется. Кроме того, эта методика минимизирует воздействие производительности, так как остальная часть сети остается устойчивой при тяжелых загрузках. Важно отметить, что адресная фильтрация - не лучший способ защиты против DDoS нападений. Даже если вы заблокировали нападение на своем маршрутизаторе или межсетевой защите – все еще большие порции входящего трафика могут затруднить прохождение законного трафика. Чтобы действительно облегчить эффект от DDoS нападения, трафик должен быть блокирован в вышестоящей цепочке – вероятно на устройстве, управляемом большим провайдером. Это означает, что многие из программ, которые утверждают, что предотвращают DDoS нападения, в конечном счете, бесполезны для маленьких сетей и их конечных пользователей. Кроме того, это означает, что предотвращение DDoS нападения, в некоторый момент, не зависит от нас.Это печальная правда, понятная любому, кто когда-либо имел дело с проблемой. Предотвращение Если вы удачно защитились от DDoS нападения, удостоверьтесь, что вы используете следующие предосторожности, которые будут препятствовать вашей собственной сети участвовать в DDoS нападениях. Нужно включить команду "ip verify unicast reverse-path" (или не Cisco эквивалент) на входном интерфейсе подключения восходящего потока данных. Эта особенность удаляет поддельные пакеты, главную трудность в защите от DDoS нападений, прежде, чем они будут отправлены. Дополнительно, удостоверьтесь, что блокирован входящий трафик с исходными адресами из зарезервированных диапазонов (то есть, 192.168.0.0). Этот фильтр удалит пакеты, источники которых очевидно неправильны. Входящие и исходящие методы фильтрации, также критичны для предотвращения DDoS нападений. Эти простые списки ограничения доступа, если внедрены всеми ISP провайдерами и большими сетями, могли бы устранить пересылку поддельных пакетов в общедоступный интернет, сокращая тем самым время, требуемое для розыска атакующего. Фильтры, помещенные в граничные маршрутизаторы, гарантируют, что входящий трафик не имеет исходного адреса, происходящего из частной сети и что еще более важно, что трафик на пересекающихся курсах действительно имеет адрес, происходящий из внутренней сети. RFC2267 - большой основа для таких методов фильтрации. Наконец важно составить точный план мероприятий ПРЕЖДЕ чем, произошло нападение. (c)seclab
-------------------------------------------------------------------------------------------------- Организовать простую защиту от DoS-атак для сайтов, использующих PHP + MySQL, можно следующим образом. В MySQL создается таблица (будем называть ее ip_check) с полями lasttime, count, ip (все поля — типа INTEGER, причем ip — первичный ключ). Сразу после подключения к базе данных выполняется проверка, есть ли для данного IP-адреса запись в таблице. Если записи нет, она создается, при этом в count пишется 1, в lasttime — текущее время. Если запись уже есть, то проверяется, когда она была сделана (поле lasttime), и если прошло менее определенного количества секунд, то поле count увеличивается на 1, в противном случае приравнивается единице, и производится обновление записи в таблице (записывается новый count и lasttime). Далее происходит проверка величины count, и если она превысила некоторое пороговое значение, выдается статус 500 (или 403 или 503), сообщение об ошибке, и выполнение скрипта завершается. Таким образом, для выполнения проверки требуется всего одной таблица с предельно простой структурой и 2 запроса SQL. Также можно добавить еще одно поле status, в которое ставить 1, если IP-адрес забанен навсегда по каким-то причинам, и совместить проверку на DoS-атаки с проверкой на забаненные IP-адреса без добавления дополнительных запросов. При необходимости можно еще одним запросом добавить учет суммарной нагрузки за все время или нагрузки по подсетям. Кроме того, перед завершением скрипта можно добавить проверку, сколько времени заняло его выполнение, и если оно превышает какую-то пороговую величину (например, 10 секунд), начислять этому IP-адресу “штрафные очки” (т.е. дополнительно увеличивать поле count). В виде кода это можно представить следующим образом: Code: <?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); } } ?> Кроме того, периодически следует очищать базу от старых записей (например, по cron). Кроме того, если ожидается большая интенсивность атак, возможно, имеет смысл заменить UPDATE-запрос на последовательность DELETE/INSERT, но в этом случае необходимо будет регулярно проводить оптимизацию таблицы. -------------------------------------------------------------------------------------------------- [FAQ] AntiDDOS/DOS Онтеддос скрипт: Code: #!/bin/bash /sbin/modprobe ip_tables /sbin/modprobe ip_conntrack /sbin/modprobe ip_conntrack_ftp rm /root/.dyn* echo "Setting kernel tcp parameters to reduct DoS effects" #Reduce DoS'ing ability by reducing timeouts echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout echo 18 > /proc/sys/net/ipv4/tcp_keepalive_time echo 1 > /proc/sys/net/ipv4/tcp_window_scaling echo 0 > /proc/sys/net/ipv4/tcp_sack echo 128 > /proc/sys/net/ipv4/tcp_max_syn_backlog #ANTISPOOFING for a in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $a done ## #NO SOURCE ROUTE for z in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $z done #SYN COOKIES echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts #echo $ICMP_ECHOREPLY_RATE > /proc/sys/net/ipv4/icmp_echoreply_rate echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses echo "1" > /proc/sys/net/ipv4/conf/all/accept_redirects echo "1" > /proc/sys/net/ipv4/conf/all/log_martians # NUMBER OF CONNECTIONS TO TRACK echo "65535" > /proc/sys/net/ipv4/ip_conntrack_max # Set default policies /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -P FORWARD DROP /sbin/iptables -F /sbin/iptables -F INPUT /sbin/iptables -F OUTPUT /sbin/iptables -F FORWARD /sbin/iptables -F -t mangle /sbin/iptables -X /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A INPUT -d 127.0.0.0/8 -j REJECT /sbin/iptables -A INPUT -i eth0 -j ACCEPT /sbin/iptables -A INPUT -m state --state INVALID -j DROP ### chains to DROP too many SYN-s ###### /sbin/iptables -N syn-flood /sbin/iptables -A syn-flood -m limit --limit 1/second --limit-burst 2 -j RETURN /sbin/iptables -A syn-flood -j LOG --log-prefix "SYN flood: " /sbin/iptables -A syn-flood -j DROP -------------------------------------------------------------------------------------------------- Простенький скрипт от nod'a, для защиты от ddos'a (только http flood) Code: $ip = $REMOTE_ADDR; if (!in_array($ip,array('66.249.64.', '81.19.64.', '89.208.19.', '213.180.206.', '72.30.0.', '87.250.230.', '213.180.216.', '222.0.0.'))) //Ипы поисковиков, которым открыт доступ к сайту. { if (!isset($_COOKIE["Тут пиши имя кукиса"]) || ($_COOKIE["Тут пиши имя кукиса"]!="А тут содержание кукиса")) { $location="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $e = substr($location,0,strlen($r)-1); if ($location==$e."s") { die("Сработала анти ДДос защита. Обратитесь к администрации. ICQ 570855 (core32.org[/url])"); } setcookie("Тут пиши имя кукиса","А тут содержание кукиса", time()+8640000); Header("Location: ".$location."?ddos=ddos"); exit; } } -------------------------------------------------------------------------------------------------- Code: <?php /* //////////////////////////////////////////////////////////// Antiddos php module \= РАБОТАЕТ НА IPTABLES!!! Вставлять в начало скрипта через include Для работы антиддоса надо иметь право доступа к исполенению функции system и команды iptables(в данном случае) если же такого нет то, то *** знает чето сделал йа. лучше ставить антиддос на впс или выделенный сервер. От средненькогл ддосика поможет. \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ */ $debug = false; // дебуг мод, отключает бан, показывает просто сообщения, забанило али нет. if($debug){ error_reporting(E_ALL); }else{ error_reporting(0); } /* Возможные значения $ddos 1-5: | 1. Простая проверка по кукам, по умолчанию(рекомендую) | 2. Двойная проверка через гет antiddos и meta refresh | 3. Запрос на авторизацию WWW-Authenticate | 4. полное отключение сайта, боты не блокируются!!! | 5. выключать сайт если нагрузка слишком большая на сервере, боты не блокируются!!! */ $ddos = 1; $log = false; $dir = dirname(__FILE__).'/cyki_bots/'; //дира с логами ддоса, создавать и ставить права 777 $ddos_redirect_host = 'http://google.com/'; // хост на который редиректить ддос. $icq = '123456'; //ася админа $off_message = 'Извините, тех неполадки.'; //сообщение при выключенном сайте $anticyka = md5(sha1('botik' . strrev(getenv('HTTP_USER_AGENT')))); $ban_message = 'Вы были заблокированы. Если это ошибка обратитесь к администратору, icq of admin:'.$icq.'<hr>(c)****** antiddos module';// сообщение при бане $exec_ban = "iptables -A INPUT -s ".$_SERVER["REMOTE_ADDR"]." -j DROP"; // для iptables, если у вас другая система измените, не лезьте если не знаете, лучше проконсультироваться!!! $load = sys_getloadavg(); // функция для получения лоад авереге \=\ $ddosuser = 'lol_ddos'; $ddospass = substr(ip2long($_SERVER['REMOTE_ADDR']), 0, 4); //не тестил //смотрит не поисковики ли это: $google = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "googlebot.com") !== false; $yandex = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "yandex.ru") !== false; $rambler = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "ramtel.ru") !== false; $rambler2 = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "rambler.ru") !== false; $aport = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "aport.ru") !== false; $sape = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "sape.ru") !== false; $msn = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "msn.com") !== false; $yahoo = strpos(gethostbyaddr($_SERVER['REMOTE_ADDR']), "yahoo.net") !== false; // $f1 = fopen($dir . 'banned_ips', "a"); fclose($f1); if(strstr (file_get_contents($dir . 'banned_ips'), $_SERVER['REMOTE_ADDR'])){ die($ban_message); } if(!$google || !$yandex || !$rambler || !$rambler2 || !$aport || !$sape || !$msn || !$yahoo) { $f = fopen($dir . $_SERVER["REMOTE_ADDR"], "a"); fwrite($f, "zapros cyka\n"); fclose($f); function ban() { if(!system($exec_ban)){ $f = fopen($dir . 'banned_ips', "a"); fwrite($f, $_SERVER['REMOTE_ADDR'].'|'); fclose($f); } echo $ban_message; header('Location: '.$ddos_redirect_host.''); die(); } switch($ddos){ /////////////////////////// case 1: if (empty($_COOKIE['ddos']) or !$_COOKIE['ddos']) { $counter = @file($dir . $_SERVER["REMOTE_ADDR"]); setcookie('ddos', $anticyka, time() + 3600*24*7*356); // на год нах. if(count($counter) > 10) { if(!$debug){ ban(); }else{ die ("Блокированы."); } } if(!$_COOKIE['ddos_log']=='bil'){ if(!$_GET['antiddos'] == 1){ setcookie('ddos_log', 'bil', time()+3600*24*7*356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем. header("Location: ./?antiddos=1"); } } }elseif ($_COOKIE['ddos'] !== $anticyka) { if(!$debug){ ban(); }else{ die ("Блокированы."); } } break; ///////////////////////// case 2: if(empty($_COOKIE['ddos'])){ if(empty($_GET['antiddos'])){ if(!$_COOKIE['ddos_log']=='bil'){ //проверям есть ли запись в куках что был запрос die('<meta http-equiv="refresh" content="0;URL=?antiddos='.$anticyka.'" />'); } }elseif($_GET['antiddos'] == $anticyka){ setcookie('ddos', $anticyka, time()+3600*24*7*356); setcookie('ddos_log', 'bil', time()+3600*24*7*356); //типо запрос уже был чтоб не перекидывало постоянно рефрешем. }else{ if(!$debug){ ban(); die("May be shall not transform address line?"); }else{ echo "May be shall not transform address line?"; die ("Блокированы."); } } } break; case 3: if(!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!== $ddosuser || $_SERVER['PHP_AUTH_PW'] !== $ddospass){ header('WWW-Authenticate: Basic realm="Vvedite parol\': '.$ddospass.' | Login: '.$ddosuser.'"'); header('HTTP/1.0 401 Unauthorized'); if(!$debug){ ban(); }else{ die ("Блокированы."); } die("<h1>401 Unauthorized</h1>"); } break; case 4: die($off_message); //сайт отключен break; case 5: if ($load[0] > 80) { 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.**********/">ddos protect</a></i></small>'); } break; default: break; ////////////////////////// } if ($_COOKIE['ddos'] == $anticyka) { @unlink($dir . $_SERVER["REMOTE_ADDR"]); } } ////////////////////////////// //превед всем кто меня знает о_0 ?> Добавлено: теперь поисковые боты определяются другим алгоритмом. Текущая версия: 1.1
Защита на интерпретируемом языке? Либо не все понимают весь абсурд ситуации, либо у нас какие-то мазохисты.
----------------------------------------------------------------------- Кто бы сомневался, что ботоводы - люди ленивые, иногда даже очень, очень. Вы думаете, что если у них много ботов, превосходный софт и предостаточно классных модулей к ботам то они будут это все сразу таки использовать, отнюдь - нет. Обычно, все начинается с простых GET запросов, даже не рандомных, на главную страницу и еще на несколько других тяжелых страниц, например - форум, фотогалерея и т.д. И только при неудаче, могут быть задействованы другие методы, рандомизация всего чего только можно, SYN flood, атака POST запросами, ICMP flood . . . Предположим, что у нас есть сайт http://www.example.gov, его атакуют, по логам видно, что громадное количество GET запросов идет на: http://www.example.gov/ http://www.example.gov/foto/ http://www.example.gov/forum/ В большинстве таких случаев можно обмануть ботов используя js-редирект. Старые и не профессионально написанные боты не содержат в себе js интерпретатора. Поэтому такой метод срабатывает лучше, чем можно было ожидать. Мы добьемся того, что боты не смогут нагружать базу данных, трафика будет в разы меньше. Создаем index.html в корне сайта и в корне foto, forum каталогов. прописываем туда наш простой js-редирект И так с каждым разделом который атакуют GET запросом прямо в корень.Размер файла получится всего 90 байт, что гораздо лучше чем когда бот соприкасается к ~20кб странице и подтягивает ~10 SQL запросов. Легитимные пользователи у которых не отключен javascript в браузере будут перенаправлены на index.php. Единственное, что плохо, так это то, что поисковые-боты тоже не оборудованы js-интерпретаторами и точно так же как атакующие боты будут утопать в js редиректе. Если рассмотреть конкретно этот случай защиты, то сразу просматривается уязвимость, защиту можно легко обойти если добавить боту функцию парсинга window.location. И не нужен никакой js-интерпретатор. Что бы избежать таких умных ботов с функцией парсера зашифруйте js-код, благо онлайн сервисов в интернете достаточно.
сталкнулся недавно с такой проблемой на шаред хостинге, негодующая школота решила по досить.хостинг как-то сразу отрубился.Пришлось резко переезжать на абузоустойчивый.Думаю далее взять с vps и поставить на него филтр простенький.По для сервера не подскажете?
Садо-мазо, защита (якобы), написанная на пхп, в лучшем случае спасет от зажатого ф5, ну ни как не от ддоса, сиегом спокойно ложится.