Команды для проверки нагрузки на сервер и определения DDoS атаки

Опубликовано:

Виды DDoS-атак (условия для DOS/DDos атак)

1. Недостаточная фильтрация данных может привести повышенному потреблению ресурсов, к длительному или бесконечному циклу, выделению огромного объема оперативной памяти.

2. Недостаточная фильтрация данных

3. Атака второго рода — подобные атаки приводят к срабатыванию системы защиты, что приводит к недоступности сервера

4. Флуд — Думаю тут все ясно. Большое количество ресурсоемких запросов, обращенных к серверу.

В интернете были найдены полезные команды для проверки нагрузки на сервер, а так же для анализа и определения ДДОС (DDoS) атаки.

Что делать?

Во-первых, посмотрим число процессов Апача:
ps aux | grep apache | wc -l

Либо в случае ОС CentOS5/RHEL:

ps aux | grep httpd | wc -l

Если их более 20-30, то это уже повод для беспокойства.

Далее обязательно просмотреть глобальные логи Апача на предмет наличия аномалий (например, запросов без указания вихоста):

/var/log/apache2/error.log
/var/log/apache2/access.log
 И для CentOS:
/var/log/httpd/error.log
/var/log/httpd/access.log
 Далее, стоит просмотреть логи всех сайтов и обратить особое внимание на самые большие из них.

Если «большой» лог найден, то его стоить проанализировать на предмет аномалий следующим образом:

cat log_type.log | awk '{print $1}' | sort | uniq -c

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

14 95.67.xx.xx
21 95.68.xx.xx
25 95.68.xx.xx
15 95.68.xx.xx
15 95.68.xx.xx
1 95.69.xx.xx
15 95.70.xx.xx
1 95.70.xx.xx
21 95.70.xx.xx
24 95.70.xx.xx
22 95.70.xx.xx
15 95.70.xx.xx
17 95.70.xx.xx
1 95.70.xx.xx
Таким образом, если какой-то IP / блок айпи заваливает сайт запросами, это будет видно по резко уходящим в верх значениям запросов для IP злоумышленников.

Полезные команды:

Число процессов Apache:

 ps aux | grep httpd |wc -l

Число коннектов на 80 порт:

 netstat -na | grep :80 | wc -l

То же, в статусе SYN

 netstat -na | grep :80 | grep syn

Пример SYN-флуда:

 netstat -na | grep :80 | grep SYN | wc -l 767

Посмотреть много ли разных IP:

 netstat -na | grep :80 | grep SYN | sort -u | more

На какой домен чаще всего идут запросы:

 tcpdump -npi eth0 port domain

Статус Apache:

 apachectl status

Посмотреть откуда IP или Domain:

 whois xxx.xxx.xxx.xxx

или

 jwhois xxx.xxx.xxx.xxx

С какого IP сколько запросов:

 netstat -na | grep :80 | sort | uniq -c | sort -nr | more

Количество соединений с сервером:

 cat /proc/net/ip_conntrack | wc -l

Вывод информации в реальном времени, IP которые соединены с сервером и какое количество соединений по каждому IP

 netstat -antu | awk '$5 ~ /[0-9]:/{split($5, a, ":"); ips[a[1]]++} END {for (ip in ips) print ips[ip], ip | "sort -k1 -nr"}'

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

# netstat -plan | grep :80 | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c
# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

# устанавливаем максимальное количество подключений с одного айпи.
# В браузерах эта количество подключений к серверу ограничено 16 соединениями,
# но стоит учитывать тех, кто сидит за NAT, а также что пользователь
# может открыть 2 сайта на разных айпишниках одного и того же сервера.
# Данный параметр подбирается оптимально с помощью предыдущей команды.

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 32 -j DROP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# то же для DNS

iptables -A INPUT -p udp --dport 53 -m connlimit --connlimit-above 8 -j DROP
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# будет препятствовать спуфингу от нашего имени.
# Ведь если мы получаем пакет с установленными флагами SYN и ACK
# (такой комбинацией флагов обладает только ответ на SYN-пакет) по еще не открытому соединению,
# это означает, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам.
# Конечно, злоумышленнику предстоит еще угадать номер последовательности.
# Согласно приведенному правилу, наш хост ответит RST-пакетом, после получения которого
# атакуемый хост закроет соединение.

iptables -I INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

# Для защиты от SYN атак включаем SYN-cookies

sysctl -w net.ipv4.tcp_syncookies=1

# Увеличиваем размер очереди полуоткрытых соединений (также полезно при SYN флуде) (default 512)

sysctl -w net.ipv4.tcp_max_syn_backlog=4096

# Проверять TCP-соединение каждую минуту. Если на другой стороне — легальная машина,
# она сразу ответит. Дефолтовое значение — 2 часа.

sysctl -w net.ipv4.tcp_keepalive_time=60

# Повторить пробу через десять секунд

sysctl -w net.ipv4.tcp_keepalive_intvl=10

# Количество проверок перед закрытием соединения

sysctl -w net.ipv4.tcp_keepalive_probes=5

# Фильтр обратного пути, защита от спуфинга (подмены адресов)

sysctl -w net.ipv4.conf.default.rp_filter=1

# Уменьшение времени удержания «полуоткрытых» соединений
# Сделаем так, чтобы перепередача осуществлялась на 3 секунде
# и полное время хранения полуоткрытых соединений в очереди составило 9 секунд

sysctl -w net.ipv4.tcp_synack_retries=1

# Изменяем время ожидания приема FIN до полного закрытия сокета

sysctl -w net.ipv4.tcp_fin_timeout=10

Понравилась статья, расскажи о ней друзьям, нажми кнопку!