|
|||||||
Как бороться с DDOS атакой
Время создания: 29.09.2011 00:29
Раздел: Компьютер - Linux - Сеть в Linux
Запись: xintrea/mytetra_syncro/master/base/1317241773zty5uzm3ef/text.html на raw.github.com
|
|||||||
|
|||||||
Мы, как хостинг-компания, сталкиваемся с DDoS-атаками на сайты наших клиентов ежедневно и имеем некоторый опыт в борьбе с ними. Как было сказано выше, универсальных мер защиты попросту нет, но атаку все же можно отразить. Предположим, что на некий сайт (пусть это будет domain.ru) идет DDoS атака. По логам видно, что большое количество GET запросов идет на главную страницу. В большинстве таких случаев, ботов можно обмануть воспользовавшись javascript-редиректом. К примеру: <script type="text/javascript"> window.location = "domain.ru/index.php" </script> Как результат — с каждым разделом, который атакован GET запросом прямо в корень, размер файла получится всего несколько байт, что гораздо лучше, чем когда бот соприкасается c ~50-100кб страницей и при этом подтягивает ~5-10 SQL запросов. Легитимные же пользователи, у которых не отключен javascript в браузере, перенаправляются на index.php. Но есть одно большое НО – поисковые-боты тоже не оборудованы js-интерпретаторами и точно так же, как и атакующие боты, будут утопать в js редиректе. Можно, воспользовавшись такими UNIX утилитами как tcpdump или netstat, написать небольшой скрипт, который будет считать кол-во коннектов с определенного IP адреса, и банить его. Определить бота можно, например, проверив его host. Небольшой пример элементарного скрипта по блокировке IP, которые создают много коннектов к серверу (данный вариант проверялся на Centos 5.6): Запись в crond: */1 * * * * netstat -an | grep tcp | awk '{print $5}' | cut -d: -f1 | sort -n | uniq -c > /var/log/ip.list Данная команда создает список с кол-вом подключений и самим IP, пример: 10 209.232.223.117 1 209.85.161.191 2 212.113.39.162 1 212.78.78.78 61 213.142.213.19 5 213.151.240.177 1 210.169.67.225 1 216.179.59.97 Сам скрипт, который можно запустить в screen-е или сделать демоном: #!/bin/bash connects=150 <- лимит подключений с одного IP while read name do // здесь передаем переменной кол-во подключений с одного IP count=`echo $name | awk '{print $1 }'` // здесь передаем сам IP ip=`echo $name | awk '{print $2 }'` //проверка имени хоста hostname=`host $ip`; //если кол-во подключений превышает лимит if [ "$count" -gt "$connects" ] then //проверяем, нет ли в белом списке нашего IP if grep $ip /etc/white.list > /dev/null 2>&1 then // если в имени хоста есть слово google (у гугло-ботов это слово присутствует) if echo $hostname | grep "google" > /dev/null 2>&1 then // то добавляем его в белый список и делаем запись в лог echo "$ip" >> /etc/white.list echo `date +%H:%M_%d-%m-%Y` $ip "- ADDED TO WHITE LIST AS $hostname SEARCH BOT IP" >> /var/log/ddos_log else // если не гугл - блочим route add $hostname reject fi fi fi done < /var/log/ip.list Давайте также посмотрим и на настройки параметров Apache, которые помогут избежать некоторых проблем вызванных DDoS атакой. TimeOut – указывайте как можно меньшее значение для данной директивы (веб сервера, который подвержен DDoS атаке). KeepAliveTimeout директива – также нужно снизить ее значение или полностью выключить. Стоит обязательно проверить значения различных тайм-аут директив представленные другими модулями. Директивы LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine, LimitXMLRequestBody должны быть тщательно настроены на ограничение потребления ресурсов вызванных запросами клиентов. Убедитесь, что вы используете директиву AcceptFilter (на ОС которые поддерживают ее). По умолчанию она включена в конфигурации Apache httpd, но для своей работы может потребовать пересборку с новыми настройками ядра вашей ОС (*nix, *bsd). Используйте директиву MaxClients, чтобы указать максимальное количество клиентов, которые смогут быть одновременно подключены к серверу — уменьшив значение директивы вы сможете снизить нагрузку на web-сервер. Защитится от DDoS можно и на программном уровне. В этом вам поможет бесплатный скрипт – DDoS Deflate. С его помощью можно легко избавится от детского флуда и DDoS. Скрипт использует команду «netstat» для обнаружения DDoS и флуда, после чего блокирует IP адреса вредителей с помощью фаервола iptables или apf. Но не стоит расслабляться и считать, что слабый DDoS не сможет нанести ущерб вашему серверу. Возьмем, к примеру, что атакующих зомби-машин всего 10-50, но все они с толстыми каналами, а Вы, как назло, уехали в командировку, или у вас десятки (а то и сотни) серверов, и Вы не успеваете физически “мониторить” их все. В таком случае, даже небольшое количество машин сможет “зафлудить” канал или заставить выйти из строя вебсервер apache, mysql, etc. Другое дело, когда администратор круглосуточно “мониторит” сервер и с легкостью обнаруживает атаки. Но такое бывает крайне редко, поэтому нужно подключить систему сигнализации, а процесс блокировки атакующих зомби-машин — автоматизировать. P.S. Статья была прислана мне юзером offic. Вопросы по статье, рекомендации по следующим статьям и интересующим темам и вопросам просьба присылать ему. Спасибо за внимание! Дополнительно: 1. Так немного меньше сил потратит веб на подсчет коннекшнов (конечно если соединений будет 100500 — то больше памяти) netstat -ant | awk '/^tcp/ { split($5,IP,":") ; CNT[IP[1]]++ }; END { OFS="\t" ; for (ip in CNT) { print CNT[ip],ip } ;} ' 2. Если ддосят корень сайта, то я просто делаю вот так: iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET / HTTP" --algo kmp --to 1024 -m recent --set --name httpddos --rsource iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "GET / HTTP" --algo kmp --to 1024 -m recent --update --seconds 10 --hitcount 2 --name httpddos --rsource -j DROP Второй запрос на корень, в течении 10 секунд, и ты попал в бан (-j DROP) на десять секунд, если за время (10 сек) еще раз обратился, то опять (-j DROP). И все. Серверу моментально легчает. ДаДа, знаю не хорошо «стрингами» пакеты сканить, но на время атаки на заданный урл это отличный способ, также я довольно много описывал у себя в блоге способов о защите. Конечно там не все что я знаю, но большая часть. И я не уверен что я использую оптимальные варианты, но мне хватает. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|