Авторские статьи Погашение DDOS-атаки http флудом

Discussion in 'Статьи' started by ant0ha, 13 Sep 2007.

  1. ant0ha

    ant0ha Elder - Старейшина

    Joined:
    22 May 2007
    Messages:
    130
    Likes Received:
    50
    Reputations:
    13
    Система обнаружения и погашения 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
     
    #1 ant0ha, 13 Sep 2007
    Last edited: 17 Sep 2007
    13 people like this.
  2. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Не слишком ли громкое название? Без обид - эта поделка не имеет никакого отношения к системам обнаружения и погашения DDOS-атак. Это нонсенс защищаться от DDOS атак на атакуемом узле, да и ещё и внутри самого ресурса... Т.е. в данном случае, ты выбрал самое неподходящее место для реализации защиты. Меры защиты тем эффективнее, чем ближе они к атакующим узлам. Так что, именно в данном случае эффективнее будет уклонение от атаки... И я тысячу раз повторял, ни одна поделка вроде этой никогда не будет эффективнее чем статистический или сигнатурный анализ трафика, причём аппаратными средствами. Ты не препятствуешь атаке никак, твой апач как порождал соединения, так он их и будет порождать, ещё и будет файловую систему месить добавляя и удаляя что-то из файлов... Единственное - ты немного снизишь трафик, т.к. вместо полноценных страниц боты будут получать мат от твоей поделки. Хотя с другой стороны - чем меньше они в одном потоке будут получать, тем чаще они такие потоки будут порождать... В общем, курам насмех такие "защищалки"...
     
    5 people like this.
  3. Alexsize

    Alexsize Fail

    Joined:
    17 Sep 2005
    Messages:
    1,771
    Likes Received:
    1,221
    Reputations:
    704
    Ты так хорошо рассуждаешь... знаешь, когда на твой сайт начинаеться ДДОС атака ты уже не думешь, что
    Ибо если подумать головным мозгом, то при ботнете в 10к ботов ты таких "мер" принять не сможешь никогда. Я тебе даже больше скажу: лично ты таких мер не сможешь принять и при ботнете в 10 ботов. Так что не забывай - критикуя, предлагай. Просто обосрать чужой способ может каждый.
     
    1 person likes this.
  4. madnet

    madnet Умиротворенный

    Joined:
    9 Dec 2004
    Messages:
    868
    Likes Received:
    343
    Reputations:
    423
    Впринципе groundhog прав, плюс еще небольшой нюанс, я не весь скрипт просматривал, а только поверхностно, но если я не ошибся, то процедура определения IP, которую ты любезно одолжил у существующего скрипта, явно не преднозаченого для ДДОС блокировки, позволяет подделать IP, вследствии чего его можно генерировать рандомно хоть с одного хоста и хер ты кого забаниш!

    Да и еще, максимум, что можно сделать определив такой ДДОС это отключить автоматически в панеле пользователя доступ к сайту, тем самым сэкоомив денюшку, но все это конечно косается детского ддоса ибо от серъезного ты таким способом не закроешся, а еще можно в ответ на каждый из IP ддосеров посылать свой БОТНЕТ и убивать их поодному =) (шутка).
     
    _________________________
    #4 madnet, 14 Sep 2007
    Last edited: 14 Sep 2007
    2 people like this.
  5. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Alexsize, умерь свой пыл, брат. Я написал какая мера защиты - интеграция на уровне провайдера комбинированных статистических и сигнатурных анализаторов трафика, которые при каждой новой волне будут банить ботов, причём банить будут на близлежащих маршрутизаторах, а не на сервере с атакуемым ресурсом. И чем глобальнее будет такая схема, тем эффективнее будет мера борьбы - только одна волна будет проходить в одну подсеть с одного бот-нета.

    Моском подумать не могу - ибо зохавали. Тот способ, что я предложил как раз и расчитан на глобальные атаки, фишка в том, что такая атака будет проходить только одной волной, при том, что такая волна по мере достижения атакуемого ресурса будет растворяться... Поэтому ты мне "...даже больше не говори...", а иди учи мат. часть.

    Я тебя тоже люблю.

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

    ant0ha Elder - Старейшина

    Joined:
    22 May 2007
    Messages:
    130
    Likes Received:
    50
    Reputations:
    13
    Это единственное место, где можно развернуть защиту в данном случае, и уклонение от атаки это не выход, если есть возможность с ней бороться.
    Если сайт крупный, иначе смысл его ддосить, то потребление трафика будет в сотни-тысячи раз меньше, и потом уже после двух запросов ддос машина будет добавлена в блеклист и от нее не будит никакого толку.
    Этот момент не совсем понял, насчет подделки IP, можно поподробнее?
    Лучше стенка на стенку, боты против ботов вот это будет зрелище =)
    При чем тут на уровне провайдера, им вообще до твоего сайта дела никакого нет, им проще твой аккаунт на пару дней вырубить.
     
  7. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ога, и платить деньги за левый трафик...

    Ты хоть понимаешь абсурдность этого утверждения? Соединения будут проходить чаще, ресурсы ВЕБ-СЕРВЕРА будут истощяться. Веб-сервер будет продолажать принимать запросы от ботов, и будет продолжать дёргать твою страницу! По умолчанию, одному запускаемому скрипту в PHP5 отводится 128 Мб памяти, прикинь во что это выльется при большом количестве запросов? Понту от твоего блек-листа? Кто его обрабатывает? Веб сервер? Или твой скрипт? Так твой скрипт по прошествии некоторого времени просто не будет выполняться из-за того что веб-сервер сдохнет!

    Ты берёшь переменные, которые посылаются в хидерах запроса, то, что там посылается - фигня подделать.

    Пральна мыслишь, чувак. Так оно и будет, и провайдерский одмин будет долго ржать, узнав как ты от доса защищался...

    Всё это я говорю к тому, что не надо громких названий, и надо быть серьёзнее, а если вы не представляете о чём идёт речь - так лучше вообще про это не писать! Предлагаю переименовать тему в "DDOS-пукалка или как рассмешить провайдерского одмина".
     
    1 person likes this.
  8. Ponchik

    Ponchik Хлебо-булочное изделие

    Joined:
    30 Aug 2005
    Messages:
    687
    Likes Received:
    807
    Reputations:
    311
    Некоторые файерволлы поддерживают функцию блокировки IP через командную чтроку, ну тоесть на компе стоит фаер, выполняем команду filewall -banip 11.222.33.444 и он банит его, токо я непомню какие фаерволлы поддерживают такие функции...
    Так вот... Вместо того, чтобы заносить в .htaccess можно банить сразу доступ к компу, и тогда уже реально защититься от самого настояещего DDoS (если атакуют 2-3 компа :D)
     
  9. Deem3n®

    Deem3n® RTFMSDN

    Joined:
    19 Sep 2005
    Messages:
    378
    Likes Received:
    153
    Reputations:
    164
    Ога mod_evasive и снорт отдыхают. ппц
     
  10. ant0ha

    ant0ha Elder - Старейшина

    Joined:
    22 May 2007
    Messages:
    130
    Likes Received:
    50
    Reputations:
    13
    Трафа практически не будет, уклон какраз и был на это.
    Повторюсь
    И что ты предлагаешь брать просто REMOTE_ADDR, а как же тогда прокси?
    Я и не писал что она от всех DDOS атак спасет, вот http флуд она погасит.
     
  11. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Моё предложение - прекратить этот цирк и закрыть тему.
     
  12. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Лучше сразу добавлять злые адреса в .httaccess , а то так ещё php-cgi будет вызываться. Обычно на хостингах есть лимит на память, и тп. Когда меня ДДОСили, то ДДОС включили всего на несколько минут, а сервер запросы обрабатывал до утра, пока я deny from all не сделал и переждал. Так-что если ДДОС серьёзный, то тут никакая подобная защита не спасёт. Надо писать в суппорт и пусть они на рутере отрубают досеров.
    Но все-равно от малолеток с программой "взлом интернета" и такой способ сгодиться.
    ++
    А это уже не твоя проблема будет, а всего сервера. Чтобы вывести твой сайт из строя им придётся весь сервер задосить, что куда сложнее, чем превысить лимиты памяти для конкретного пользователя :)
     
    #12 fucker"ok, 14 Sep 2007
    Last edited: 14 Sep 2007
  13. tolsty7

    tolsty7 Member

    Joined:
    27 Aug 2007
    Messages:
    21
    Likes Received:
    5
    Reputations:
    0
    Название, конечно, громкое, но на лицо - оперативное решение насущной проблемы.
     
  14. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Не вижу решения... Таким "решением" моя бабушка от Митника в своё время защищалась, и то безуспешно... В то время как тебя досят - писать в файл? Это по вашему решение? Уж хоть бы, как правильно заметил, фукерок - .htaccess на эту директорию создавали при привышении нагрузки...
     
  15. tolsty7

    tolsty7 Member

    Joined:
    27 Aug 2007
    Messages:
    21
    Likes Received:
    5
    Reputations:
    0
    Спросим автора - достиг ли он целей, которые ставил когда писал скрипт?
     
  16. Егорыч+++

    Staff Member

    Joined:
    27 May 2002
    Messages:
    1,373
    Likes Received:
    895
    Reputations:
    20
    Безусловно подобный скрипт не погасит атаку никак. Но это не значит, что на самом сервере ничего сделать нельзя. Просто надо немного по другому подойти к этому делу.
     
  17. ant0ha

    ant0ha Elder - Старейшина

    Joined:
    22 May 2007
    Messages:
    130
    Likes Received:
    50
    Reputations:
    13
    Иначе бы я его тут не выложил, от 100-200 машин реально спасет, больше испытывать не приходилось, да и зачастую, если ддосят не на заказ в атаке одновременно больше машин и не участвует, а чтобы припугнуть этого количества вполне достаточно.
     
    1 person likes this.
  18. IIAHbI4

    IIAHbI4 Banned

    Joined:
    24 Aug 2006
    Messages:
    276
    Likes Received:
    331
    Reputations:
    11
    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

     
  19. ant0ha

    ant0ha Elder - Старейшина

    Joined:
    22 May 2007
    Messages:
    130
    Likes Received:
    50
    Reputations:
    13
    Смотри внимательней, эти параметры заданы в начале, их не подделать:
    PHP:
    $ad_dir='anti_ddos'// каталог со скриптами 
    $ad_check_file='check.txt'// файл для записи текущего состояния во время мониторинга
    Издеваешься =), там sql не используется.
     
    1 person likes this.
  20. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    Во-первых: Где-то этот принцип я видел уже...
    Во-вторых: по-моему, тоже самое, что и
    PHP:
    <?php
    $ip
    =$_SERVER['REMOTE_ADDR'];
    if(
    $ip=='127.0.0.1'){
    echo(
    "На*** надо...");
    } else { echo(
    Дорогая!); }
    ?>