середу, 30 вересня 2009 р.

Dos атака или правда жизни?

На днях столкнулся с такой вещью как недобросовестная конкуренция, когда одного из наших потенциальных клиентов начали беспощадно DOS'ить. Так как я ни разу с таким не сталкивался я сразу начала искать нужную информацию. Благодаря друзьям я получил пару скриптов для анализа логов. И началась бурная работа. В первую очередь нужна была выделенная машина под управлением Linux и iptables как firewall.

Принцип тут простой, банить подсети. Так как основной поток трафика шел с Саудовской Аравии и несколько из Германии, то решил не церемониться.
В первую очередь были сделаны ограничения, я их делал прямо в терминале:
iptables --new-chain car
iptables --append car -m limit --limit 5/sec --jump RETURN
iptables --append car --jump DROP
Далее мы ждем когда apache поработает длительное период, что бы можно было проанализировать логи.
После чего создаем файл a.sh, в директории с логами (как правило это /var/log/httpd/, если стоит ISP то /var/www/httpd-log/):
touch a.sh
Далее открываем его текстовым редактором и вставляем следующий код:
tail -n 1500000 <файл с логами> | grep 'GET / ' | cut -d ' ' -f 1 | sort -n | uniq -c | sort -n > stat.txt
После этого запускаем его:
sh a.sh
В этом файле (stat.txt) появится список всех IP адресов, точнее подсчет сколько и кто делал соединения в 1500000 строчках.
Далее создаем файл a.php:
touch a.php
Открываем его и вставляем следующий код:
<?PHP
    $cont='';
    $a=file('stat.txt');

    foreach($a as $temp) {
        $temp = str_replace(array(" ", " ", " "), false, $temp);
        $temp=explode(" ",trim($temp));
        if($temp[0]>150) {
            $list = explode(".",$temp[1]);
            $cont.='iptables -I INPUT -s '.$list[0].'.'.$list[1].'.0.0/16 -j DROP'."n";
        }
    }

    $cont.='iptables-save > /etc/sysconfig/iptables';
    $handle=fopen('ban.sh','w');
    fwrite($handle,$cont);
    fclose($handle);
?>
Где $temp[0]>150 выбираем IP адреса особо активных. В данном случае если больше 150 соединений. Запускаем php a.php. Он создаст файл ban.sh.
Файл ban.sh будет выглядеть примерно вот так:
iptables -I INPUT -s 188.48.0.0/16 -j DROP
iptables -I INPUT -s 85.98.0.0/16 -j DROP
iptables -I INPUT -s 118.136.0.0/16 -j DROP
iptables -I INPUT -s 201.66.0.0/16 -j DROP
iptables -I INPUT -s 92.115.0.0/16 -j DROP
iptables -I INPUT -s 77.31.0.0/16 -j DROP
iptables-save > /etc/sysconfig/iptable
При запуске sh ban.sh все записи автоматически добавятся в правила iptables, вам остается только ребутнуть iptables (service iptables restart), удалить лог apache и рестартануть apache, что бы отлавливать другие IP адреса, при помощи которых вас DOS'ят.
Я таким образом добился полного снижения нагрузки на сервер. У меня правда была ситуация, когда на сайт никто не заходил - кроме тех кто DOS'ил... В других случаях лучше выбирать время когда минимум людей заходит на сайт и увеличивать порог (if($temp[0]>150)), что бы случайно не забанить хороших пользователей. Успехов!

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments