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

Веб-программирование 30 сентября 2009 г., 9:20

На днях столкнулся с такой вещью как недобросовестная конкуренция, когда одного из наших потенциальных клиентов начали беспощадно 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)), что бы случайно не забанить хороших пользователей. Успехов!

Теги: 0


Станьте первым!

Пожалуйста, авторизуйтесь или зарегистрируйтесь для комментирования!

Яндекс.Метрика