Общие рекомендации по борьбе с DDOS-атаками на http-сервер

Случается, что на некоторые сайты кибер-преступники проводятся атаки. Мы предлагаем несколько способов выявления проблемного сайта на вашем сервере и восстановления работоспособности остальных сайтов.

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

Диагностика

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


netstat -na | grep ':80 '
 netstat -na

Эти команды покажут вывод, направление и состояние всех установленных на 80 порту или на всех портах соединений.

ps aux | grep -с httpd
 netstat -na | grep -с ":80 "

Эти команды считают количество процессов httpd и количество подключений на 80 порт. Если количество соединение превышает среднестатистическое, вероятно, это DoS/DDoS-атака.
На Centos 7 нет команды netstat в шаблоне, но её можно поставить командой

yum instal net-tools

Или воспользоватся альтернативным приложением, командой ss

ss -o '( dport = :http or sport = :http )'

Покажет все соединения к вашему Web-серверу.
Командой

ss -o '( dport = :http or sport = :http )' | awk '{print $6}' | cut -d : -f 1 | grep -v 'Address' | sort | uniq -c | sort -n

Можно посчитать подключений с одного IP адреса к Web-серверу и сортирует список по возрастанию.
Также http-флуд можно выявить по косвенным признакам:
watch 'ls -laS /var/www/httpd-logs/'
Эти команды каждые 2 секунды будут выводить список логов apache, если размер верхнего access файла быстро растет, почти наверняка атака идет на этот сайт.

tcpdump -n port 80 -c 200 -w ddos.log

данная команда также поможет в выявлении DoS/DDoS. Tcpdump запишет в файл ddos.log первые 200 пакетов, которые соединений на 80 порту.

tcpdump -nr ddos.log | awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn

а так лог-файл можно прочитать и отсортировать по ip и количеству подключений.

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

Теперь надо определить на какой именно сайт идет атака. У apache есть замечательный модуль mod_status http://httpd.apache.org/docs/2.2/mod/mod_status.html
mod_status позволяет в реальном времени осуществлять мониторинг загрузки сервера.

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

В apache2.4 необходимо отредактировать файл /etc/apache2/mods-enabled/status.conf

Меняем секцию

< Location /server-status > 
               SetHandler server-status
               Require local
               #Require ip 192.0.2.0/24
< /Location>

на

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

Проверьте чтобы строка, была раскоментированна.

ExtendedStatus On

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

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

В apache2.2 отредактируйте /etc/httpd/conf/httpd.conf
Раскомментируйте строки, если их нет, то добавьте

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

Находим этот Location

< 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

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

Теперь по адресу

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

И посмотрите 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, то поток пустых запросов полностью прекратится.

Фильтрация Панель ISPmanager 5

В панели ISPmanager 5 есть функция позволяющая ограничить количество подключений к сайту с одного IP адреса. При этом IP адрес блокируется по всем портам, поэтому если ваш IP адрес попадёт в бан, то вы потеряете связь с сервером на 5 минут.
Приступаем к настройке.
Заходим в ISPmanager 5 - WWW-домены - выделить домен - кнопка "Изменить" - ставим галочку "Включить защиту от DDoS-атаки"

Включить защиту от DDoS-атаки

Далее прокручиваем в самый низ страницы, там появятся параметры защиты от ддос

параметры защиты от ддос

А именно:
"Количество запросов в секунду" при достижении указанного количества подключений, IP блокируется только в Nginx(http, https)
"Максимальный размер всплеска" при достижении указанного количества подключений, IP блокируется по всем портам на 5 минут.
Если такой галочки нет в настройках домена, значит на вашем сервере не установлен Nginx. Для его установки переходим в ISPmanager - Возможности - выделить "Веб-сервер (WWW)" - кнопка "Изменить" - поставить галочку напротив Nginx

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

iptables -A INPUT -p tcp --src xxx.xxx.xxx.xxx --dport 80 -j DROP

так можно зафильтровать 80 порт для ip xxx.xxx.xxx.xxx

Для Linux. Создается цепочка dos, куда перенаправляются все подключения на 80 порт сервера. В эту цепочку добавляются «плохие» ip.

iptables -N dos
iptables -A INPUT -p tcp --dport 80 -j dos
while true; do tail -10000 /var/www/httpd-logs/site.ru.access.log | sort | cut -f 1 -d " " | uniq -c | awk '($1>50){print $2}' | xargs -tn 1 iptables -A dos -p tcp -j DROP --dport 80 -s; sleep 30; done
iptables -F INPUT — очищаем таблицу INPUT.
iptables -F dos — очищаем таблицу dos
iptables -X dos — удаляем таблицу dos

Способ для iptables, имеет одну нехорошую особенность, в цепочке возникают дублирующиеся правила. Поэтому лучше использовать ipset (нужен соответствующий модуль).

ipset -N ddos iphash
iptables -A INPUT -p tcp -m tcp --dport 80 -m set --set ddos src -j DROP
while true; do tail -10000 /var/www/httpd-logs/site.ru.access.log | sort | cut -f 1 -d " " | uniq -c | awk '($1>50){print $2}' | xargs -tl -I _ ipset -A ddos

Закрываем icmp (поможет при icmp-flood)

iptables -A INPUT -p icmp -j DROP --icmp-type 8

Ограничение максимального числа «полуоткрытых» соединений с одного IP к конкретному порту (необходим соответствующий модуль):

iptables -I INPUT -p tcp --syn --dport 80 -m iplimit --iplimit-above 10 -j DROP

Ограничение максимального числа соединений с одного IP к конкретному порту:

/sbin/iptables  -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 -j REJECT

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

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

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

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

top -d 1 | grep -E 'http|apache' | awk '{a =$7}END{print a/(1024*NR) " Mb"}'

Необходимо чтобы суммарное количество помещалось в оперативной памяти.
Отредактируйте /etc/httpd/conf/httpd.conf Следует уменьшить параметры

[/pb_text][pb_alert el_title="Alert 27" alert_style="alert-info" alert_close="no" appearing_animation="0" ]

Timeout 300
MaxKeepAliveRequests 100

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

Использование nginx

При использовании nginx в качестве Front-End к Apache (стандартная конфигурация при установки nginx совместно с ISPmanager) WWW домен следует отключать в конфигурации nginx в описании соответствующего виртуалхоста Например

server {
       listen       80;
       server_name  example.com www.example.com;

Пропишите ниже server_name строку

deny all;

И тем самым уже nginx будет выдавать ответ 403 Forbidden и не перенаправлять запросы к web-серверу apache.

Переменные sysctl

Системные переменные, которые могут быть полезны, при DDoS.
ICMP-FLOOD
Команда ниже поможет при отражении атаки типа icmp-flood.
sysctl net.ipv4.icmp_echo_ignore_all=1
Ограничиваем число ответов на ICMP-сообщения 50-ю в секунду (защита от ICMP-флуда) для FreeBSD:
sysctl net.inet.icmp.icmplim=50
SYN-FLOOD
Уменьшение времени удержания «полуоткрытых» соединений:
sysctl -w net.ipv4.tcp_synack_retries=1
Включение TCP syncookies:
sysctl -w net.ipv4.tcp_syncookies=1
Увеличиваем размер очереди полуоткрытых соединений. По-умолчанию - 512.
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
Проверять TCP-соединение каждую минуту. Если на другой стороне - легальная машина, она сразу ответит. По-умолчанию - 2 часа.
sysctl -w net.ipv4.tcp_keepalive_time=60
Повторить проверку через 20 секунд
sysctl -w net.ipv4.tcp_keepalive_intvl=20
Количество проверок перед закрытием соединения
sysctl -w net.ipv4.tcp_keepalive_probes=3
Изменяем время ожидания приема FIN
sysctl -w net.ipv4.tcp_fin_timeout=10

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

Убедитесь, что вы вводите (*) необходимую информацию, где нужно
HTML-коды запрещены

Support department:
Working hours are from 9:00 AM to 9:00 PM
For finance support write requests in billing tickets


Technics department 
Wounder st, Lt.11
3040 Limassol
Cyprus 
For technical support write requests in billing tickets

The company is founded in 2007 on universal human principles of integrity, human rights and freedoms, and the relationships between individuals.
Host-for.NET
Markova st., 88, Debrivne 15163
Geroev Stalingrada, 39B, Kiev 04210


Portugal Deportment 

NIB 238 520 960
Rua Francisco Sa Carneiro Lt.11
3430-048 Carregal do Sal
Portugal

+351 912 071 065
We answer calls from 19:00 to 24:00 GMT