Примеры просмотра количества активных соединений:

[cc lang=»bash»]netstat -an | wc -l
cat /proc/net/ip_conntrack | wc -l
netstat -anp | grep ‘tcp\|udp’ | cut -d: -f1| sort | uniq -c
netstat -anp |grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n[/cc]

Примеры просмотра соединений на порт, например 80:

[cc lang=»bash»]netstat -na | grep :80 | wc -l
netstat -na | grep :80 | grep syn
netstat -na | grep «:80\ » | grep syn
netstat -na | grep «:80\ » | grep SYN | wc -l
netstat -na | grep «:80\ » | grep SYN | sort -u | more
netstat -na | grep «:80\ » | grep SYN_RCVD
netstat -na | grep «:80\ » | sort | uniq -c | sort -nr | less[/cc]

Определение SYN атаки:

[cc lang=»bash»]netstat -n —tcp | grep SYN_RECV
netstat -n —tcp | grep SYN_RECV | wc -l[/cc]

Просмотр количества процессов Апача:

  • ps aux | grep apache | wc -l

Статус Apache2:

  • apachectl status

Просмотреть логи Apache2 /var/log/apache2/error.log, /var/log/apache2/access.log, …
Просмотр в логах количества запросов с ip адресов:

[cc lang=»bash»]cat /var/log/apache2/access.log | awk ‘{print $1}’ | sort | uniq -c[/cc]

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

  • tcpdump -npi eth0 port domain

Просмотр загрузки сетевых интерфейсов:

  • sudo cat /proc/net/dev

Просмотр открытых портов:

[cc lang=»bash»]netstat -na|grep LISTEN
nmap -r -v -O 127.0.0.1[/cc]

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

[cc lang=»bash»]tcpdump -npi eth0 port domain[/cc]
Теперь посмотрим какое количество запросов приходит с каждого IP. Эта команда показывает по всем портам:

[cc lang=»bash»]netstat -ntu | awk ‘{print $5}’| cut -d: -f1 | sort | uniq -c | sort -nr | more[/cc]
аналогичные команды:

[cc lang=»bash»]netstat -anp |grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
netstat -antu | awk ‘$5 ~ /[0-9]:/{split($5, a, «:»); ips[a[1]]++} END {for (ip in ips) print ips[ip], ip | «sort -k1 -nr»}'[/cc]
Эта команда показывает количество запросов только по 80 порту:

[cc lang=»bash»]netstat -ntu | grep «:80\ » | awk ‘{print $5}’| cut -d: -f1 | sort | uniq -c | sort -nr | more[/cc]
Эта команда показывает все запросы на 80 порт, не считая их, т.е. «упрощенный» но «наиболее полный» вариант вывода:

[cc lang=»bash»]netstat -na | grep :80 | sort | uniq -c | sort -nr | more[/cc]
Вычислив наиболее активный IP можно так же посмотреть на какие порты идут с него запросы. Тут для примера подставлен IP 127.0.0.1:

[cc lang=»bash»]netstat -na | grep 127.0.0.1[/cc]
Кстати, если у вас не настроен server-status на Apache, то статус этого сервера можно посмотреть в CLI:

[cc lang=»bash»]apachectl status[/cc]
Лог Файлы
Естественно рекомендуется смотреть лог файлы вашего сервера Apache и Nginx (если он есть).

Глобальные логи Apache, в Debian, обычно находятся там:

[cc lang=»bash»]/var/log/apache2/error.log
/var/log/apache2/access.log[/cc]
В CentOS:

[cc lang=»bash»]/var/log/httpd/error.log
/var/log/httpd/access.log[/cc]
Глобальные логи Nginx находятся там:

[cc lang=»bash»]/var/log/nginx/error.log
/var/log/nginx/access.log[/cc]

Так же не забывайте просматривать логи виртуальных хостов, если хосты у вас настроены. Нас будет интересовать самый большой лог, который «растет» на глазах.

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

Выявить конкретные IP с числом запросов до сайта можно данной командой:

[cc lang=»bash»]cat access.log | awk ‘{print $1}’ | sort | uniq -c[/cc]
Так же можно получить статистика по запросам с группировкой по IP с помощью утилиты logtop.

Для начала установим эту утилиту:

[cc lang=»bash»]apt-get install git libncurses5-dev uthash-dev gcc #на случай, если у вас не стоят пакеты для корректной работы GIT
git clone https://github.com/JulienPalard/logtop.git [/cc]
И теперь получим статистику:

[cc lang=»bash»]tail -f access.log | awk {‘print $1; fflush();’} | logtop[/cc]
Следующая команда поможет нам выявить популярные user-агенты:

[cc lang=»bash»]cat access.log | awk -F\» ‘{print $6}’ | sort | uniq -c | sort -n[/cc]

Как блокировать?
Так или иначе у вас должен стоять iptables. Скорее всего он может быть не настроен, особенно если вы не знаете что это такое. Ранее я уже писал статью о том как им пользоваться: «Краткая памятка по Iptables» , поэтому тут я приведу только необходимые команды, чтобы решить проблему здесь и сейчас.

Вот как можно заблокировать tcp запросы на 80 порт с определенного IP:

[cc lang=»bash»]iptables -A INPUT -p tcp —dport 80 -s 12.34.56.78 -j DROP[/cc]
Так мы блокируем запросы на все порты с определенного IP:

[cc lang=»bash»]iptables -A INPUT -s 12.34.56.78 -j DROP[/cc]
Посмотреть список уже заблокированных мы можем данными командами:

[cc lang=»bash»]iptables -L -n[/cc]

или

[cc lang=»bash»]iptables -L -n —line-numbers[/cc]
Если нам нужно удалить из блокировки определенный IP, можно воспользоваться этой командой

[cc lang=»bash»]iptables -D INPUT -s 1.2.3.4 -j DROP[/cc]
или можно удалить правило по его номеру, предварительно посмотрев его номер командой iptables -L -n —line-numbers:

[cc lang=»bash»]iptables -D INPUT 6[/cc]
Чтобы удалить все правила, можно воспользоваться командой:

[cc]iptables -F[/cc]
Немного профилактики, в целях защиты от DDos…
Есть еще некоторые правила, которые смогут оградить нас от бездумных ботов, создающих нагрузку на сервер.

Следующей командой мы установим максимальное количество подключений с одного IP на 80 порт:

[cc lang=»bash»]iptables -A INPUT -p tcp —dport 80 -m connlimit —connlimit-above 128 -j DROP
iptables -A INPUT -p tcp —dport 80 -j ACCEPT[/cc]
Тоже самое можно сделать и для DNS:

[cc lang=»bash»]iptables -A INPUT -p udp —dport 53 -m connlimit —connlimit-above 16 -j DROP
iptables -A INPUT -p udp —dport 53 -j ACCEPT[/cc]
Следующее правило в iptables будет препятствовать спуфингу от нашего имени. Как правило, во время ddos мы получаем пакет с установленными флагами SYN и ACK по еще не открытому соединению (этой комбинацией флагов обладает только ответ на SYN-пакет). Это говорит о том, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам.
По данному правилу, наш хост ответит RST-пакетом, после получения которого атакуемый хост закроет соединение.

[cc lang=»bash»]iptables -I INPUT -m conntrack —ctstate NEW,INVALID -p tcp —tcp-flags SYN,ACK SYN,ACK -j REJECT —reject-with tcp-reset[/cc]
Сохранить правила можно следующей командой:

[cc lang=»bash»]iptables-save > /etc/iptables.rules[/cc]
Что еще можно сделать?
Еще не помешает немного «оттюнинговать» ядро, сделать тонкую настройку Apache и Nginx (если таковой стоит), поставить дополнительные модули и пакеты для защиты от атак, такие как Fail2Ban, mod_evasive, ModSecurity..