Как защититься от DDos-атак!

ОС - CentOS. Но почти все, что вы написали подходит и к ней. Обязательно сейчас установлю и настрою mod_evasive.
Спасибо!

На CentOS рекомендую использовать фаерволлом IPTABLES, в нем и настроек больше... Через iptables можно творить много чего хорошего и нужного...
Сам сейчас занимаюсь интеграцией этого пакета iptables на FreeBSD
 
От DDOS помогает сеть прокси серверов перед сайтом
 
Сам сейчас занимаюсь интеграцией этого пакета iptables на FreeBSD
зачем??? что за глупости :eek:
штатных средств не хвататет, линуксовый iptables на фрю переносить? :D он туда не станет, и он там и не нужен, т.к. есть лучшее средство - PF.
вот по поводу mod_evasive, типа тестировал один учаснег, синаксис в оригинале)
Проверял на Апаче 1,3 первых 5 - 10 минут ДОС атаки держыт дальше Апач всетаки падает. Всетаки Апач дайот ответ на запрос хоть и Forbidden но отвечает. А окончательно проблему возможно решить с ДОС и ДДОС атаками с стандартным фаерволом OpenBSD тоисть PF.
так что не стоит надеяться на этот модуль, он не помогает.
А вот и защита. Выкладываю правила PF, которые можно успешно использовать против атак на вебсервер - кому надо, тот разбирется что с этим делать :)
#pf simple rules for apache anti-ddos:
table <abusive_http> persist
block in quick on $if inet proto tcp from <abusive_http> to any
pass in quick on $if inet proto tcp from any port > 1023 to $addr135 port { 80, 443 } modulate state ( max 300 source-track rule max-src-nodes 100 max-src-conn-rate 15/5 max-src-states 15 tcp.established 600 tcp.closing 10 overload <abusive_http>) flags S/SAFR
А вот и защита: конфиг PF-а, написаный для дедика с freebsd, с установленной Cpanel, и защищающий и от DDoS в том числе. изменяйте его под конфигурацию своего сервера и тестируйте. Предупреждаю! PF может заблокировать вам доступ на сервер, если вы не знаете что с ним делать или нет опыта конфигурирования.
# FreeBSD Cpanel 'pf' firewall with basic dDoS mitigation using 'syn-proxy' states
# and other rate limits. USE AT YOUR OWN RISK.

# Macros: define common values, so they can be referenced and changed easily.
ext_if="fxp0" # replace with actual external interface name i.e., dc0
tcp_services="{ 22, 25, 26, 53, 80, 110, 143, 443, 465, 783, 953, 993, 995, 3306 }"
udp_services="{ 53, 514 }"
cpanel_services="{ 995, 2082, 2083, 2095, 2096, 2084, 2086, 2087 }"
icmp_types="8"

# Game servers (Quake3, CS )
# game_ports="27015"

# Tables: similar to macros, but more flexible for many addresses.
table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }
table <badguys> persist file "/etc/pf.blocklist.txt"

# Options: tune the behavior of pf, default values are given.
set timeout { interval 10, frag 30 }
set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 }
set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 90 }
set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
set timeout { icmp.first 20, icmp.error 10 }
set timeout { other.first 60, other.single 30, other.multiple 60 }
set timeout { adaptive.start 0, adaptive.end 0 }
set limit { states 10000, frags 5000 }
set loginterface $ext_if
set optimization normal
set block-policy drop
set require-order yes
set fingerprints "/etc/pf.os"

# Normalization: reassemble fragments and resolve or reduce traffic ambiguities.
#scrub in all
scrub in on $ext_if all fragment reassemble min-ttl 15 max-mss 1400
scrub in on $ext_if all no-df
scrub on $ext_if all reassemble tcp

# Filtering: the implicit first two rules are
pass in all
pass out all

# Pass all 'quick' on localhost loopback device
pass quick on lo0 all

## Default DENY & Log filter rules
block in log all
block out log all

# Drop our 'badguys' 'quick' with no reply or logging.
block in quick on $ext_if from <badguys> to any

# Drop our rfc1918 ranges
block in quick on $ext_if from <rfc1918> to any

# Pass in rules for Various services defined above. Using 'synproxy-state' for
# basic dDoS mitigation on TCP services.
pass in on $ext_if proto tcp from any to $ext_if port $tcp_services flags S/SA synproxy state
pass in on $ext_if proto tcp from any to $ext_if port $cpanel_services flags S/SA synproxy state

# Pass UDP keeping state
pass in on $ext_if proto udp from any to $ext_if port $udp_services keep state

# Pass ICMP Type 8 (echo-reply) only with state
pass in on $ext_if inet proto icmp all icmp-type $icmp_types keep state

# Pass FTP
pass in quick on $ext_if proto tcp from any to any port 21 flags S/SA keep state
pass in quick on $ext_if proto tcp from any to any port > 49151 keep state

# Pass out rule allowing all with modulate state
pass out on $ext_if proto tcp all modulate state flags S/SA

# Pass out rules for UDP, ICMP
pass out on $ext_if proto { udp, icmp } all keep state

# End
Защищайтесь, друзья, для этого все уже есть :ay:
 
Борьба с DDOS посредством использования утилиты ipset на выделенных серверах с Debian.
Тянем последний Для просмотра ссылки Войди или Зарегистрируйся в /usr/src, распаковываем, заходим в директорию и стартуем ./runme set.
При этом подразумевается что исходники текущего ядра находятся в /usr/src/linux, а iptables - в /usr/src/iptables.
После заходим в /usr/src/linux и делаем make oldconfig, где указываем поддержку фич ipset модулями.

Собираем и устанавливаем ядро:
# make-kpkg --bzImage kernel_image
# dpkg -i /usr/src/linux-image-x.x.x-blablabla.deb
Устанавливаем ipset из репозитория:
Добавляем загрузку модуля ipset в /etc/modules и либо загружаем модуль modprobe ipset, либо перезагружаемся в новое ядро.
Создаем хеш ip-адресов для использования в правилах iptables. Стоит учесть, что максимальное количество ip в списке - 65536 штук:
# ipset -N blacklist iphash
Создаем перловый скрипт /root/antiddos/num-filter.pl для отбора ip-адресов, с которых идет большое количество одинаковых запросов:
#!/usr/bin/perl
while ($line = <STDIN>) {
if ($line =~ /^\s+(\d+) (\d+)\.(\d+)\.(\d+)\.(\d+)/) {
print $2, ".", $3, ".", $4, ".", $5, "\n" if ($1 > $ARGV[0]);
}
}
Создаем скрипт /root/antiddos/blacklist.sh для cron:
#!/bin/bash
# variables, change them to get script work
BADREQUEST="GET / HTTP/1.1";
LOGPATH="/home/clients/login_ftp0/domains/domain.com/logs/access_log";
MINREQUESTS="50";
SCRIPTHOME="/root/antiddos";
# don't change anything bellow
grep "$BADREQUEST}" $LOGPATH | awk -F ' ' '{ print $ 1 }' | sort | uniq -c | ${SCRIPTHOME}/num-filter.pl $MINREQUESTS >> ${SCRIPTHOME}/in_blacklist.add.pre
sort -u < {SCRIPTHOME}/in_blacklist.add.pre > ${SCRIPTHOME}/in_blacklist.add
cat ${SCRIPTHOME}/in_blacklist.add > ${SCRIPTHOME}/in_blacklist
for i in `cat ${SCRIPTHOME}/in_blacklist`;
do
/usr/sbin/ipset -q -A blacklist $i;
done
Добавляем правила для iptables:
/sbin/iptables -F
/sbin/iptables -X DDOS_HTTP_FILTER
/sbin/iptables -N DDOS_HTTP_FILTER
/sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m set --set blacklist src -j DROP
/sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m hashlimit --hashlimit 10/min --hashlimit-burst 30 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT
/sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --dport 80 --syn -j DROP
/sbin/iptables -A DDOS_HTTP_FILTER -d $IP -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
/sbin/iptables -A DDOS_HTTP_FILTER -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport http -j DDOS_HTTP_FILTER
Добавляем запуск скрипта /root/antiddos/blacklist.sh в крон с интервалом в 10 минут.
howto/ddos_ipset.txt · Последние изменения: 2007/12/09 05:57 kyxap
 
Если защититься от ДДОС почти не возможно, кроме как банить конкретные IP адреса на некоторое время, то подскажите, плз, каким образом отследить IP ддосера, если есть подозрение на ддос? Какие конкретные средства для этого можно использовать? Скрипты? Анализаторы логов?
Потому что в интернете в основном везде одна вода о том, что можно написать свой скрипт, который будет анализировать логи или смотреть текущую сетевую активноесть и бла-бла-бла прочее. Хочу конкретики!

Лучшая защита от DDOS - это распределенная сеть, но такое не всегда по карману или востребовано.
Лично пришлось столкнуться.
Расскажу как решал.
Сайт лежит на VPS у хостера. Обычный апач.
Было решено банить по IP в iptables

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

netstat -ntu | grep :80 | grep SYN_RECV | grep -v [свой ип] | awk -F\ '{print $5;}' | awk -F: '{print $1;}' | uniq | sort

Хостер пошел навстречу дал 300 правил для iptables при обычных 30, хоть на этом спасибо.

Ни о каких модификациях TCP стека VPS сервера предложения не принимались - аргументсреда виртиуализации не позволяет.
Большой минус - в iptables не оказалось возможности подключить модуль iplimit - чтобы ограничить количество подключений с одного IP
--
Тогда бы правилом
-A INPUT -p tcp --dport 80 -m iplimit --iplimit-above 10 - DROP
Можно было бы снять лишнюю нагрузку
--

Но нет, пришлось думать дальше.
В срочном порядке были установлены
модули к апачу
mod_bw
mod_bwshare
mod_dosevasive
Результаты
mod_bw - регулирует нагрузку на целиковый сайт, а хочется только плохишей давить - не подошел

mod_bwshare - тоже самое, но можно делить клиентов на отдельные подсети/IP - запарились делить, атака была больше чем с 300 адресов - просто понизили отдачу от сервера

mod_dosevasive - умный, сам смотрит кто часто лезет, того обрубает - оставили

Стали думать дальше.
Додумались до nginx
Поставили. Настроили. Стали кумекать как ускорить все.
Первым делом, прокинули напрямую запросы к картинкам css, flash и пр.
Потом посетила нас мудрая мысль -
-- лог
xxx.xx.xx.xx - - [16/Jul/2008:20:48:30 +0400] "GET / HTTP/1.0"
--
как выглядит атака DDOS-бота
Он запрашивает главную страницу и отключается.
Решили ускорить отдачу входной страницы
Как?
location = / {
root /usr/local/nginx/html;
rewrite ^/$ http : // site.ws / index.html permanent;
}

Бот получает редирект, но поскольку его это не интересует, никуда не идет.
nginx получает обрыв соединения и закрывает канал,
apache отдыхает.

Можно еще попробовать отдавать статическую "главную" страницу, или легкую страницу с редиректом на входную сайта.
Так сайт может в разы больше обслужить DDOS ботов.

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

К примеру, создадим каталог anti_ddos и кидаем все скрипты туда:

index.php (модуль обнаружения DDOS атаки:(
PHP:
<?php 

$ad_ddos_query=10; // количество запросов в секунду для обнаружения DDOS атаки 
$ad_check_file='check.txt'; // файл для записи текущего состояния во время мониторинга 
$ad_temp_file='all_ip.txt'; // временный файл 
$ad_black_file='black_ip.txt'; // будут заносится ip машин зомби 
$ad_white_file='white_ip.txt'; // заносятся ip посетителей 
$ad_dir='anti_ddos'; // каталог со скриптами 
$ad_num_query=0; // текущее количество запросов в секунду из файла $check_file 
$ad_sec_query=0; // секунда из файла $check_file 
$ad_end_defense=0; // время окончание защиты из файла $check_file 
$ad_sec=date("s"); // текущая секунда 
$ad_date=date("mdHis"); // текущее время 
$ad_defense_time=10000; // при обнаружении ddos атаки время в секундах на которое прекращается мониторинг 



if(!file_exists("{$ad_dir}/{$ad_check_file}") or !file_exists("{$ad_dir}/{$ad_temp_file}") or !file_exists("{$ad_dir}/{$ad_black_file}") or !file_exists("{$ad_dir}/{$ad_white_file}") or !file_exists("{$ad_dir}/anti_ddos.php")){ 
die("Не хватает файлов."); 
} 

require("{$ad_dir}/{$ad_check_file}"); 

if ($ad_end_defense and $ad_end_defense>$ad_date){ 
require("{$ad_dir}/anti_ddos.php"); 
} else { 
if($ad_sec==$ad_sec_query){ 
$ad_num_query++; 
} else { 
$ad_num_query='1'; 
} 

if ($ad_num_query>=$ad_ddos_query){ 
$ad_file=fopen("{$ad_dir}/{$ad_check_file}","w"); 
$ad_end_defense=$ad_date+$ad_defense_time; 
$ad_string='<?php $ad_end_defense='.$ad_end_defense.'; ?>'; 
fputs($ad_file,$ad_string); 
fclose($ad_fp); 
} else { 
$ad_file=fopen("{$ad_dir}/{$ad_check_file}","w"); 
$ad_string='<?php $ad_num_query='.$ad_num_query.'; $ad_sec_query='.$ad_sec.'; ?>'; 
fputs($ad_file,$ad_string); 
fclose($ad_fp); 
} 
} 
?> 



anti_ddos.php (модуль погашения DDOS атаки): 
PHP код: 
<?php 
function getIP() { 
if(getenv("HTTP_CLIENT_IP") and preg_match("/^[0-9\.]*?[0-9\.]+$/is",getenv("HTTP_CLIENT_IP")) and getenv("HTTP_CLIENT_IP")!='127.0.0.1') { 
$ip = getenv("HTTP_CLIENT_IP"); 
} elseif(getenv("HTTP_X_FORWARDED_FOR") and preg_match("/^[0-9\.]*?[0-9\.]+$/is",getenv("HTTP_X_FORWARDED_FOR")) and getenv("HTTP_X_FORWARDED_FOR")!='127.0.0.1') { 
$ip = getenv("HTTP_X_FORWARDED_FOR"); 
} else { 
$ip = getenv("REMOTE_ADDR"); 
} 
return $ip; 
} 
$ad_ip=getIP(); 

$ad_source=file("{$ad_dir}/{$ad_black_file}"); 
$ad_source=explode(' ',$ad_source[0]); 
if (in_array($ad_ip,$ad_source)){die();} 

$ad_source=file("{$ad_dir}/{$ad_white_file}"); 
$ad_source=explode(' ',$ad_source[0]); 
if (!in_array($ad_ip,$ad_source)){ 

$ad_source=file("{$ad_dir}/{$ad_temp_file}"); 
$ad_source=explode(' ',$ad_source[0]); 
if (!in_array($ad_ip,$ad_source)){ 
$ad_file=fopen("{$ad_dir}/{$ad_temp_file}","a+"); 
$ad_string=$ad_ip.' '; 
fputs($ad_file,"$ad_string"); 
fclose($ad_fp); 
?> 

Сайт в данный момент подвергается DDOS атаке, если Вы не машина-зомби атакующая сайт нажмите на кнопку, иначе Ваш IP (<?=$ad_ip?>) будет заблокирован!!! 
<form method="post"> 
<input type="submit" name="ad_white_ip" value="Кнопка"> 
</form> 

<?php 
die(); 
} 
elseif ($_POST['ad_white_ip']){ 
$ad_file=fopen("{$ad_dir}/{$ad_white_file}","a+"); 
$ad_string=$ad_ip.' '; 
fputs($ad_file,"$ad_string"); 
fclose($ad_fp); 
} 
else { 
$ad_file=fopen("{$ad_dir}/{$ad_black_file}","a+"); 
$ad_string=$ad_ip.' '; 
fputs($ad_file,"$ad_string"); 
fclose($ad_fp); 
die(); 
} 
} 
?>

Также для работы скрипта понадобятся 4 файла check.txt, white_ip.txt, black_ip.txt и all_ip.txt создаем их в этом же каталоге и на все ставим права 666 (чтение и запись).

Желательно также во время атаки списки IP адресов атакующих машин формирующихся в файле black_ip.txt переносить постепенно в файл .htaccess и блокировать их оттуда, тогда нагрузка еще значительно снизится.

Пример файла .htaccess
Код:
Deny from 11.11.11.11 22.22.22.22 и т.д. через пробел



Да чуть не забыл, для подключения скрипта, в начале каждого файла, который может быть подвергнут атаке добавляем строчку:
Код:
require("anti_ddos/index.php");
 
а кто из русских колокеишн помогает в фильтрование ботов ?
 
Hostway бил себя в грудь что помагают, но они работают только с безналом, у них сами каналы за цисками (по рассказам)
 
Такой статьи вроде нету, цитирую то что нашел,может кому поможет,заодно хочу услышать поможет ли оно?


Если на уровне PHP тогда это скрипт поудобней будет, он автоматом добавляет в htaccess блокируемые IP, вначале настройка есть
 

Вложения

  • antiddos2.txt
    14 KB · Просмотры: 100
  • Нравится
Реакции: kibi
Если на уровне PHP тогда это скрипт поудобней будет, он автоматом добавляет в htaccess блокируемые IP, вначале настройка есть
Добрый день. Расскажите, как настроить.

Поставил. В первый же день IP Яндекса оказался в htaccess. Убрал, **х.
 
Назад
Сверху