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