Мой блог онлайн журнал! Меня нет в ЖЖ-дневнике и на лесби форумах. Я обычная девушка-блоггер! Мои заметки о любви и цитатах, о детях, о машинах, полезные советы и новости, рецепты и домашние заботы!

Anti DDoS для новичков с примерами

Если атака выполняется одновременно с большого числа компьютеров, говорят о DDoS-атаке (от англ. Distributed Denial of Service, распределённая атака типа «отказ в обслуживании»). В некоторых случаях к DDoS-атаке приводит легитимное действие, например, простановка ссылки на сайт (размещённый на не очень производительном сервере) на популярном интернет-ресурсе (слэшдот-эффект). Большой наплыв пользователей приводит к превышению допустимой нагрузки на сервер и отказу в обслуживании части из них.

Виды DoS-атак

1. Ошибка в программном коде, приводящая к обращению к неиспользуемому фрагменту адресного пространства, выполнению недопустимой инструкции или другой необрабатываемой исключительной ситуации, когда происходит аварийное завершение серверного приложения. Классическим примером является обращение по нулевому (англ. null) указателю.
2. Недостаточная проверка данных пользователя, приводящая к бесконечному либо длительному циклу или повышенному длительному потреблению процессорных ресурсов (исчерпанию процессорных ресурсов) либо выделению большого объёма оперативной памяти (исчерпанию памяти).
3. Флуд (англ. flood) — атака, связанная с большим количеством обычно бессмысленных или сформированных в неправильном формате запросов к компьютерной системе или сетевому оборудованию, имеющая своей целью или приведшая к отказу в работе системы из-за исчерпания ресурсов системы — процессора, памяти либо каналов связи.
4. Атака второго рода — атака, которая стремится вызвать ложное срабатывание системы защиты и таким образом привести к недоступности ресурса.

Если атака (обычно флуд) производится одновременно с большого количества IP-адресов, то в этом случае она называется распределённой атакой на отказ в обслуживании (DDoS).

Защита от Ddos

Реальных и гарантированных способов защита от ддоса не существует. В ддосе больше психологического запугивания, чем реальной угрозы. Да, теоретически ваш сайт могут ддосить и 1,2,3,4 недели. Но для этого нужны огромные средства и хорошие ботнеты. Если уже до такого дойдет, то врядли вам будет интересна эта статья, она расчитана в первую очередь на новичков.
Итак, защита от ддоса делится на 3 группы:
1. Аппаратные способы
2. Программные (подручные) способы
3. Активные ответные меры

Аппаратные способы защиты от Ddos

Существуют аппаратные средства, например, от Cisco, Sourcefire, IBM. Либо купить у кого-то сервис по очистке трафика. В решении Cisco System по защите от DDoS атак важнейщую роль играют два компонента Cisco Traffic Anomaly Detector и компонент Cisco Guard. Первый компонент действует как система пассивного контроля по мониторингу сетевого трафика и направлена на выявления аномалий от базового поведения для заданной сети. Если система считает, что интенсивность IP-пакетов передаваемых из одного источника превышает допустимые значения то она перенаправляет трафик компоненту Cisco Guard. Этот компонент представляет из себя высокопроизводительное устройство для устранения выше упомянутых атак. Cisco Guard подвергает тщательному пяти ступенчатому анализу весь проходящий трафик и выявляет весь злоумышленный трафик для его удаления. В результате удаляется не нужный, мусорный трафик и пропускаются хорошие пакеты, благодаря чему достигается стабильность работы всех сетевых систем и компонентов.

Также существуют средства от IBM. Если переполняются каналы и провайдер сам будет покупать, то Arbor SP+TMS, если каналы не переполняются и будете тратиться сами, то смотрите в строну Proventia IPS от IBM ISS — там куча сигнатур по защите от (D)DoS атак. Кроме этого, можно на сам сервер поставить Proventia Server IPS.

Если канал не забивается то можно пробовать Cisco ASA. Поигравшись с настройками (threat-detection и инспектированием трафика) можно будет довольно успешно защищаться от DDoS, с учетом нормально настроеных access-list.

Однако, детально останавливаться на аппаратных средствах защиты я не буду, стоят они дорого, нет смысла их рассматривать для владельцев обычных сайтов.

Программные (подручные) способы защиты от DDoS

Вот тут можно остановиться подробнее. Существует 2 вида защит — средствами вебсервера (Apache, например) и средствами доп.модулей (например, средствами php, js). Хороший результат может дать комбинация этих способов. Также помните, чем больше методом вы примените, тем лучше. И чем больше сможете снизить/минимизировать нагрузку на сервер, тем лучше.

Постараюсь тезисно (сжато) и с примерами:

Для Apache:

1. Для начала для Apache ставим — mod_evasive, конфигурируем — если уж ручками то он нам поможет + он умеет сразу же добавлять запись в фаерволл ( я тестировал с iptables ) или уже выдавать ответ средствами apache — можно указать свой вариант ( 404, 500 и т.д. ). В установке и настройки довольно прост.

Установка mod_evasive и mod_dosevasive

Код: Выделить всё

# wget http://www.zdziarski.com/projects/mo..._1.10.1.tar.gz
# tar -xzvf mod_evasive_1.10.1.tar.gz
# cd mod_evasive

# /usr/local/apache/bin/apxs -i -a -c mod_evasive.c
# /etc/init.d/httpd restart

Редактирование конфига апача

# vi /usr/local/apache/conf/httpd.conf

Код: Выделить всё

<IfModule mod_evasive.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>

Перезапуск вэбсервера

# /etc/init.d/httpd restart

2. Если у вас *nix очень важно используя тюнинг ядра системы включить SYN cookies и работать с SYN соединениями только через SYN cookies.

3. Обязательное требование firewall, в котором закрыто все кроме того, что нам на самом деле нужно. Всем известная рекомендация.

4. Далее, смотрим почаще текущие соединения в удобном для глаз виде следующей командой:
Цитата
netstat -nat | awk ‘{print $6}’ | sort | uniq -c | sort -n

5. В apache KeepAlive -> Off — сразу заметите прирост скорости работы.

Для nginx:

1. в sysctl

Код: Выделить всё

sysctl kern.maxfiles=90000
sysctl kern.maxfilesperproc=80000
sysctl net.inet.tcp.blackhole=2
sysctl net.inet.udp.blackhole=1
sysctl kern.polling.burst_max=1000
sysctl kern.polling.each_burst=50
sysctl kern.ipc.somaxconn=32768
sysctl net.inet.tcp.msl=3000
sysctl net.inet.tcp.maxtcptw=40960
sysctl net.inet.tcp.nolocaltimewait=1
sysctl net.inet.ip.portrange.first=1024
sysctl net.inet.ip.portrange.last=65535
sysctl net.inet.ip.portrange.randomized=0

2. Фильтрацию url, например, по критерию POST index.php?action=login с пустым реферером можно реализовать так:

Код: Выделить всё

set $add 1;
location /index.php {
limit_except GET POST {
deny all;
}
set $ban "”;
if ($http_referer = "” ) {set $ban $ban$add;}
if ($request_method = POST ) {set $ban $ban$add;}
if ($query_string = "action=login” ){set $ban $ban$add;}
if ($ban = 111 ) {
access_log /var/log/nginx/ban IP;
return 404;
}
proxy_pass http://127.0.0.1:8000; #тут живёт апач
}

Борьба с SYN-флудом

Один из распространенных способов не только забить канал связи, но и ввести сетевой стек операционной системы в такое состояние, когда он уже не сможет принимать новые запросы на подключение. Основан на попытке инициализации большого числа одновременных TCP-соединений через посылку SYN-пакета с несуществующим обратным адресом. После нескольких попыток отослать ответный ACK-пакет на недоступный адрес большинство операционок ставят неустановленное соединение в очередь. И только после n-ой попытки закрывают соединение. Так как поток ACK-пакетов очень велик, вскоре очередь оказывается заполненной, и ядро дает отказ на попытки открыть новое соединение. Наиболее умные DoS-боты еще и анализируют систему перед началом атаки, чтобы слать запросы только на открытые жизненно важные порты. Идентифицировать такую атаку просто: достаточно попробовать подключиться к одному из сервисов. Оборонительные мероприятия обычно включают в себя:

Увеличение очереди «полуоткрытых» TCP-соединений:
# sysctl -w net.ipv4.tcp_max_syn_backlog=1024

Уменьшение времени удержания «полуоткрытых» соединений:
# sysctl -w net.ipv4.tcp_synack_retries=1

Включение механизма TCP syncookies:
# sysctl -w net.ipv4.tcp_syncookies=1

Ограничение максимального числа «полуоткрытых» соединений с одного IP к конкретному порту:
# iptables -I INPUT -p tcp —syn —dport 80 -m iplimit —iplimit-above 10 -j DROP

Борьба с UDP-флудом

Типичный метод захламления полосы пропускания. Основан на бесконечной посылке UDP-пакетов на порты различных UDP-сервисов. Легко устраняется за счет отрезания таких сервисов от внешнего мира и установки лимита на количество соединений в единицу времени к DNS-серверу на стороне шлюза:
# iptables -I INPUT -p udp —dport 53 -j DROP -m iplimit —iplimit-above 1

Борьба с HTTP-флудом

C http-флудом бороться просто. Задача №1 — это установить легкий и производительный nginx – он будет кэшировать запросы и отдавать статику. Основная цель — снизить нагрузку, создаваемую базой данной и веб-сайтом. Для этого можно резать по реферу или user agent весь входящий траф. Блокировать по user-agent можно самим вебсервером, а также фаерволом. Например

Код: Выделить всё

#mod_setenvif
SetEnvIf User-Agent MSIE MustDie=1
Order allow,deny
Allow from all
Deny from env=MustDie

Но лучше это делать через фаерволл. Для этого надо пересобрать ядро с поддержкой patch-o-matic (расширение для iptables). Затем в правила добавить:

Код: Выделить всё

iptables -A FORWARD -m string --string "DownloadMaster" -j REJECT
не забыв их сохранить
iptables-save -c > /etc/sysconfig/iptables

Небольшой пример:

Код: Выделить всё

# vi /etc/nginx/nginx.conf
# Увеличиваем максимальное количество используемых файлов
worker_rlimit_nofile 80000;
events {
# Увеличиваем максимальное количество соединений
worker_connections 65536;
# Использовать эффективный метод epoll для обработки соединений
use epoll;
}
http {
gzip off;
# Отключаем таймаут на закрытие keep-alive соединений
keepalive_timeout 0;
# Не отдавать версию nginx в заголовке ответа
server_tokens off;
# Сбрасывать соединение по таймауту
reset_timedout_connection on;
}
# Стандартные настройки для работы в качестве прокси
server {
listen 111.111.111.111 default deferred;
server_name host.com www.host.com;
log_format IP $remote_addr;
location / {
proxy_pass http://127.0.0.1/;
}
location ~* \.(jpeg|jpg|gif|png|css|js|pdf|txt|tar)$ {
root /home/www/host.com/httpdocs;
}
}

Также можно использовать для простых ддосов средства php+htaccess с блокированием по юзерагенту. Например:

Код: Выделить всё

<?php
error_reporting(0);

$google = strpos($_SERVER[‘HTTP_USER_AGENT’], «Googlebot») !== false;
$yandex = strpos($_SERVER[‘HTTP_USER_AGENT’], «Yandex») !== false;
$rambler = strpos($_SERVER[‘HTTP_USER_AGENT’], «StackRambler») !== false;
$aport = strpos($_SERVER[‘HTTP_USER_AGENT’], «Aport») !== false;
$msn = strpos($_SERVER[‘HTTP_USER_AGENT’], «MSN») !== false;
$yahoo = strpos($_SERVER[‘HTTP_USER_AGENT’], «Yahoo») !== false;
$ip = strpos($_SERVER[‘REMOTE_ADDR’], ‘66.249.64.’) !== false;
$ip2 = strpos($_SERVER[‘REMOTE_ADDR’], ‘81.19.64.’) !== false;
$ip3 = strpos($_SERVER[‘REMOTE_ADDR’], ‘89.208.19.’) !== false;
$ip4 = strpos($_SERVER[‘REMOTE_ADDR’], ‘213.180.206.’) !== false;
$ip5 = strpos($_SERVER[‘REMOTE_ADDR’], ‘72.30.0.’) !== false;
$ip6 = strpos($_SERVER[‘REMOTE_ADDR’], ‘87.250.230.’) !== false;
$ip7 = strpos($_SERVER[‘REMOTE_ADDR’], ‘213.180.216.’) !== false;
$ip8 = strpos($_SERVER[‘REMOTE_ADDR’], ‘222.0.0.’) !== false;
$ip9 = strpos($_SERVER[‘REMOTE_ADDR’], ‘89.169.147.’) !== false;

if(!$google || !$yandex || !$rambler || !$aport || !$msn || !$yahoo || !$ip || !$ip2 || !$ip3 || !$ip4 || !$ip5 || !$ip6 || !$ip7 || !$ip8 || !$ip9)
{
$dir = ‘xekers/’;

$cook = strrev(sha1(‘xek’ . md5(getenv(‘HTTP_USER_AGENT’))));

function ban()
{
system(«/bin/sudo pfctl -t isis -T add » . escapeshellarg($_SERVER[«REMOTE_ADDR»]));
}

if (empty($_COOKIE[‘ddos’]))
{
$counter = @file($dir . $_SERVER[«REMOTE_ADDR»]);
if(count($counter) > 10) ban();
setcookie(‘ddos’, $cook, time() + 9800);
$f = @fopen($dir . $_SERVER[«REMOTE_ADDR»], «a»);
fwrite($f, «request\r\n
«);
fclose($f);
header(‘Location: ‘ . $_SERVER[‘PHP_SELF’]);
die();
}

if ($_COOKIE[‘ddos’] !== $cook)
{
ban();
die();
}

if ($_COOKIE[‘ddos’] == $cook)
{
system(«/bin/sudo pfctl -t isis -T del » . $_SERVER[«REMOTE_ADDR»]);
@unlink($dir . $_SERVER[«REMOTE_ADDR»]);
}
}
?>

Еще есть очень неплохой вариант, выдерживает до 3 000 ботов. Вот :http://depositfiles.com/files/vxtn5tlbc Минимизация нагрузки реализована самим языком php. Есть функция автоматической блокировки IP путём записи в htaccess. Однако, если будет сильный ддос, первым делом отвалится php, потом apache и эти полу-меры не помогут.

Защита средствами LightHTTPD

Есть очень хороший сервер Lighthttpd, он расчитан для оптимальной производительности. Сам сервер очень легкий и при масштабных атаках им очень просто регулировать создаваемую нагрузку. Подробнее об установке и самом сервере можно почитать на сайте http://lighttpd.net

Некоторые советы при использовании Lighthttpd

Бан по юзер-агенту:

Код: Выделить всё

$HTTP["useragent"] =~ "libwww-perl" {
url.access-deny = ( "" )
}

Можно ограничить скорость соединения с сервером

connection.kbytes-per-second = 512

помогает от резкого падения сервера

Блокирование по странам средствами iptables

Очень хорошо помогает iptables с фильтрацией по странам. Атаки, в основном, идут с азиатских, американских стран. Очень хорошей защитой является блокирование всех адресов, например, кроме RU. Фильтровать трафик по странам можно с помощью iptables + geoip патчем. Для начала качаем набор: http://netfilter.org/

Распаковываем и устанавливаем:

Код: Выделить всё

tar xfz patch-o-matic-ng-XXXXXX.tar.gz
cd patch-o-matic-ng
IPTABLES_DIR=/usr/src/iptables KERNEL_DIR=/usr/src/linux ./runme geoip

Затем включаем в ядро появившуюся там опцию «geoip match support». Пересобираем ядро, пересобираем iptables из тех исходников, которые пропатчили. Базу с адресами ложим в /var/geoip/
Пример пользования:

Код: Выделить всё

iptables -A INPUT --dport 25 -m geoip --src-cc RU -j ACCEPT
iptables -A INPUT --dport 25 -j LOG --log-prefix "Blocked smtp from not RU:"
iptables -A INPUT --dport 25 -j REJECT

Также советую зайти на http://www.netfilter.org, там очень много разных патчей и феничек.

Кроме этого, есть более новый и актуальный вариант xtables. Почитать подробнее и скачать можно с их сайта http://xtables-addons.sourceforge.net/. Штука хорошая.

Если ддос сильный, поможет временный увод непосредственной цели атаки (доменного имени или IP-адреса). Например, домен можно «занулить», направив на 127.0.0.1. Или направить на другие NS, чтобы не страдал ваш сервер. Если атака очень сильная, это единственный способ минимизировать последствия.

Предпринимаем активные ответные меры

Данный способ защиты от ддоса очень часто работает лучше, чем все остальные средства защиты. Задача проста — нужно найти ддосера и наказать его. Наказать можно, предприняв ответный ддос (если у вас есть возможности). Или предпринять защиту организационно-правового характера (это долго и в наших условиях мало эффективно).

Также, используйте методы СИ (социальной инженерии). Например, можно разместить на сайте объявление «За информацию о ддосере плачу 100$» или «За остановку ддоса заплачу 150$». Ддосеры — люди очень алчные, очень высокая вероятность того, что с вами свяжется непосредственно сам ддосер или кто-то, кто его знает. На а дальше — уже дело техники, если будет icq и/или ip — найти человека можно.

Краткое руководство по борьбе с DDOS-атаками на http-сервер (по материалам firstvds.ru)
(материал предназначен для борьбы с ддосами на VPS с несколькими клиентами)

Рассмотрим краткие способы выявления проблемного сайта на вашем сервере и восстановления работоспособности остальных сайтов. Проявляется Ddos в огромном количестве процессов apache, сервер недоступен из-за превышения максимального числа процессов, или, что наиболее вероятно, недоступен из-за нехватки оперативной памяти.

Диагностика

Если есть возможность зайдите на сервер по ssh. Командами ps и top отметьте большое количество процессов httpd. Если на сервер по ssh войти не удается, то воспользуйтесь VDSmanager (ссылка на него есть в клиентской зоне)

Посмотрите меню Запущенные процессы и Текущая нагрузка. Перезагрузите сервер через VDSmanager, попробуйте зайти по ssh, если падает, из-за apache, то остановите его, как вариант, можете убить все процессы httpd через него же.)

Действия администратора

Включите firewall — отредактируйте /etc/rc.conf прописав в нем строки (редактировать файлы можно через VDSmanager)

Код: Выделить всё

firewall_enable="YES"
firewall_type="/etc/firewall.conf"

Создайте файл /etc/firewall.conf и пропишите в нем

Код: Выделить всё

add allow ip from ip-адрес с_которого_администрируете_сервер
add deny tcp from any to me 80

Тем самым после перезагрузки сервера у вас будет недоступен apache извне и не будет приводить к зависанию сервера.

Теперь надо определить на какой именно сайт идет атака. У apache есть замечательный модуль mod_status. Mod_status позволяет в реальном времени осуществлять мониторинг загрузки сервера.

Подключение mod_status в Apache 2.2

В apache2.2 отредактируйте /usr/local/etc/apache22/httpd.conf

Раскомментируйте строки

Код: Выделить всё

#LoadModule status_module libexec/apache22/mod_status.so
#Include etc/apache22/extra/httpd-info.conf

Отредактируйте файл конфигурации /usr/local/etc/apache22/extra/httpd-info.conf

Код: Выделить всё

<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>

Поменяйте на

Код: Выделить всё

<Location /server-status>
SetHandler server-status
</Location>

Раскомментируйте строку

Код: Выделить всё

#ExtendedStatus On

Перезапустите apache

В apache 1.3 подключение server_status осуществляется аналогично apache 2.2, за исключением того, что все настраивается только в /usr/local/etc/apache/httpd.conf

Использование server-status

Теперь по адресу _http://ip-aдрес.сервера/server-status доступна статистика запросов к нему.

Аккуратно удалите правило запрещащие запросы к серверу по 80 порту

# ipfw delete 200

И посмотрите _http://ip-aдрес.сервера/server-status

Нас интересует следующее

Код: Выделить всё

0-0 86795 0/31/31 W 0.54 0 0 0.0 0.09 0.09 89.18.166.89 example.com GET / HTTP/1.0
1-0 86796 0/19/19 W 0.30 0 0 0.0 0.06 0.06 79.140.78.68 example.com GET / HTTP/1.0
2-0 86801 0/9/9 W 0.15 0 0 0.0 0.03 0.03 89.18.166.89 example.com GET / HTTP/1.0
3-0 86802 0/9/9 W 0.14 0 0 0.0 0.03 0.03 82.12.33.48 myhost.com GET /server-status/ HTTP/1.1
4-0 86805 0/4/4 W 0.07 1 0 0.0 0.01 0.01 79.140.78.68 example.com GET / HTTP/1.0
5-0 86806 0/3/3 W 0.06 2 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
6-0 86807 0/4/4 W 0.07 0 0 0.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
7-0 86808 1/4/4 C 0.08 0 2015 3.0 0.01 0.01 89.18.166.89 example.com GET / HTTP/1.0
8-0 86811 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
9-0 86812 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0
10-0 86813 0/1/1 W 0.02 0 0 0.0 0.00 0.00 89.18.166.89 example.com GET / HTTP/1.0

В данном случае, атака идет пустыми запросами GET / к серверу example.com

Вам следует его отключить. Выполнить это лучше всего создав файл .htaccess в корневой директории домена с содержимым

Deny from All

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

Как правило, флуд-боты обращаются по имени сервера, соответственно, пропишите DNS для этого домена на IP-адрес 127.0.0.1 и когда обновится кэш DNS, то поток пустых запросов полностью прекратится.

Дополнительная оптимизация сервера

В качестве дополнительных параметров, которые следует использовать, при настройке сервера

/usr/local/etc/apache22/extra/httpd-mpm.conf

Код: Выделить всё

<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
MaxClients 150
MaxRequestsPerChild 100
</IfModule>

Измените MaxClients (максимальное число процессов) в меньшую сторону до количества процессов, которые не роняют ваш сервер по нехватке оперативной памяти. Каждый процесс apache занимает в среднем 4-8 мегабайт памяти и необходимо чтобы суммарное количество помешалось в оперативной памяти.

Отредактируйте /usr/local/etc/apache22/extra/httpd-default.conf Следует уменьшить параметры

Код: Выделить всё

Timeout 300
MaxKeepAliveRequests 100

До 60 и 50 соответственно, чтобы как можно более скорее старые процессы apache прекращали свое существование

В Firewall пропишите правило

allow tcp from any to me dst-port 80 limit src-addr 4

Этим вы ограничите максимальное число одновременных подключений (не стоит его делать меньше) с одного IP-адреса. Используйте также утилиту netstat для определения большого количества подключений с одного IP-адреса

# netstat -na | grep 80

Оставить комментарий

Blue Captcha Image
Новый проверочный код

*

..

Мы живем и радуем наших читателей

Подписка на почту:

Сервис FeedBurner

Топ просмотров
Blog Traffic

Pages

Pages|Hits |Unique

  • Last 24 hours: 1 787
  • Last 7 days: 30 980
  • Last 30 days: 57 584
  • Online now: 5
Яндекс.Метрика

Нравится