Виды DDoS-атак (условия для DOS/DDos атак)
1. Недостаточная фильтрация данных может привести повышенному потреблению ресурсов, к длительному или бесконечному циклу, выделению огромного объема оперативной памяти.
2. Недостаточная фильтрация данных
3. Атака второго рода — подобные атаки приводят к срабатыванию системы защиты, что приводит к недоступности сервера
4. Флуд — Думаю тут все ясно. Большое количество ресурсоемких запросов, обращенных к серверу.
Что делать?
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
/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
Полезные команды:
Число процессов 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