Нагрузка на сервер
Число процессов Apache:
ps aux | grep httpd |wc -l
Число коннектов на 80 порт:
netstat -na | grep :80 | wc -l
Посмотреть много ли разных 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 -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
Проверяем на SYNC flood:
netstat -n -p | grep SYN_REC| awk '{print $5}'|awk -F: '{print $1}' | sort -n | uniq -c | sort -nr | head -n10
Убить соединения CLOSE_WAIT на порту 80 c определенного адреса netstat -anp | grep 192.168.0.1 | grep ':80 ' | grep CLOSE_WAIT | awk '{print $7}' | cut -d \/ -f1 | grep -oE "[[:digit:]]{1,}" | xargs kill -9
Убить соединения CLOSE_WAIT на порту 80
netstat -anp | grep ':80 ' | grep CLOSE_WAIT | awk '{print $7}' | cut -d \/ -f1 | grep -oE "[[:digit:]]{1,}" | xargs kill -9
Расшифровка:
netstat -anp |\ # отображение всеч сетевых подключений grep 192.168.0.1 |\ # фильтр по айпи 192.168.0.1 grep ':80 ' |\ # фильтр по порту 80 grep CLOSE_WAIT |\ # фильтр по CLOSE_WAIT awk '{print $7}' |\ # выделяем 7ой столбец cut -d \/ -f1 |\ # извлекаем PID grep -oE "[[:digit:]]{1,}" |\ # извлекаем PID xargs kill -9 # прибиваем процессы по PID
Какими командами, и что мы можем определить?
Для начала можно посмотреть число запущенных процессов Apache. Если их более 20-30 то явно уже что-то не так.
Смотрим число процессов Apache в Debian:
|
Смотрим число процессов Apache в CentOS:
|
Данной командой мы можем посмотреть количество соединений с сервером:
|
Так же показателем того, что на сервер идет DDos может служить числе коннектов на 80 или 443 порт. Вот команды способные показать это число:
|
|
Существует еще такая разновидность DDod, как SYN. Ниже приведена команда позволяющая определить число SYN запросов на те же 80 и 443 порты:
|
|
А эта команда показывает количество SYN запросов:
|
Следующая команда позволит понять нам, на какой домен идет больше всего запросов:
|
Теперь посмотрим какое количество запросов приходит с каждого IP. Эта команда показывает по всем портам:
|
аналогичные команды:
|
|
Эта команда показывает количество запросов только по 80 порту:
|
Эта команда показывает все запросы на 80 порт, не считая их, т.е. «упрощенный» но «наиболее полный» вариант вывода:
|
Вычислив наиболее активный IP можно так же посмотреть на какие порты идут с него запросы. Тут для примера подставлен IP 127.0.0.1:
|
Кстати, если у вас не настроен server-status на Apache, то статус этого сервера можно посмотреть в CLI:
|
Лог Файлы
Естественно рекомендуется смотреть лог файлы вашего сервера Apache и Nginx (если он есть).
Глобальные логи Apache, в Debian, обычно находятся там:
- /var/log/apache2/error.log
- /var/log/apache2/access.log
В CentOS:
- /var/log/httpd/error.log
- /var/log/httpd/access.log
Глобальные логи Nginx находятся там:
/var/log/nginx/error.log
/var/log/nginx/access.log
Так же не забывайте просматривать логи виртуальных хостов, если хосты у вас настроены. Нас будет интересовать самый большой лог, который «растет» на глазах.
Искать в этих логах нужно аномалии, а именно однотипные запросы без юзер агентов (или с одним и тем же), большое количество запросов с одного и того же IP, запросы без указания виртуального хоста и т.д.
Выявить конкретные IP с числом запросов до сайта можно данной командой:
|
Так же можно получить статистика по запросам с группировкой по IP с помощью утилиты logtop.
Для начала установим эту утилиту:
|
И теперь получим статистику:
|
Следующая команда поможет нам выявить популярные user-агенты:
|
Как блокировать?
Так или иначе у вас должен стоять iptables. Скорее всего он может быть не настроен, особенно если вы не знаете что это такое. Ранее я уже писал статью о том как им пользоваться: «Краткая памятка по Iptables» , поэтому тут я приведу только необходимые команды, чтобы решить проблему здесь и сейчас.
Вот как можно заблокировать tcp запросы на 80 порт с определенного IP:
|
Так мы блокируем запросы на все порты с определенного IP:
|
Посмотреть список уже заблокированных мы можем данными командами:
|
или
|
Если нам нужно удалить из блокировки определенный IP, можно воспользоваться этой командой
|
или можно удалить правило по его номеру, предварительно посмотрев его номер командой iptables -L -n —line-numbers:
|
Чтобы удалить все правила, можно воспользоваться командой:
|
Немного профилактики, в целях защиты от DDos…
Есть еще некоторые правила, которые смогут оградить нас от бездумных ботов, создающих нагрузку на сервер.
Следующей командой мы установим максимальное количество подключений с одного IP на 80 порт:
|
Тоже самое можно сделать и для DNS:
|
Следующее правило в iptables будет препятствовать спуфингу от нашего имени. Как правило, во время ddos мы получаем пакет с установленными флагами SYN и ACK по еще не открытому соединению (этой комбинацией флагов обладает только ответ на SYN-пакет). Это говорит о том, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам.
По данному правилу, наш хост ответит RST-пакетом, после получения которого атакуемый хост закроет соединение.
|
Сохранить правила можно следующей командой:
|
Часть взята отсюда
Автор: igel