Обнаружение и защита от DDoS-атак
Опасность большинства DDoS-атак – в их абсолютной прозрачности и «нормальности». Ведь если ошибка в программном обеспечении всегда может быть исправлена, то полное сжирание ресурсов - явление почти обыденное. С ним сталкиваются многие администраторы, когда ресурсов машины (ширины канала) становится недостаточно, или web-сайт подвергается слэшдот-эффекту (twitter стал недоступен уже через несколько минут после первого известия о смерти Майкла Джексона). И если резать трафик и ресурсы для всех подряд, то спасешься от DDoS, но потеряешь добрую половину клиентов.
Выхода из этой ситуации фактически нет, однако последствия DDoS-атак и их эффективность можно существенно снизить за счет правильной настройки маршрутизатора, брандмауэра и постоянного анализа аномалий в сетевом трафике.
Существует два типа DoS/DDoS-атак, и наиболее распространенная из них основана на идее флуда, то есть заваливания жертвы огромным количеством пакетов. Флуд бывает разным: ICMP-флуд, SYN-флуд, UDP-флуд и HTTP-флуд. Современные DoS-боты могут использовать все эти виды атак одновременно, поэтому следует заранее позаботиться об адекватной защите от каждой из них.
Универсальные советы для защиты. Чтобы не попасть в безвыходное положение во время обрушения DDoS на системы, необходимо тщательным образом подготовить их к такой ситуации:
- Все сервера, имеющие прямой доступ во внешнюю сеть, должны быть подготовлены к простому и быстрому удаленному ребуту (sshd спасет отца русской демократии). Большим плюсом будет наличие второго, административного, сетевого интерфейса, через который можно получить доступ к серверу в случае забитости основного канала.
- ПО, используемое на сервере, всегда должно находиться в актуальном состоянии. Все дырки - пропатчены, обновления установлены (простой, как сапог, совет, которому многие не следуют). Это оградит тебя от DoS-атак, эксплуатирующих баги в сервисах.
- Все слушающие сетевые сервисы, предназначенные для административного использования, должны быть спрятаны брандмауэром ото всех, кто не должен иметь к ним доступ. Тогда атакующий не сможет использовать их для проведения DoS-атаки или брутфорса.
Обнаружение DoS-атак
Первым делом смотрим показатель Загрузка системы (Load average, LA) (в статье указаны допустимые значения LA для двухъядерного процессора.)
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
- Вариант №2. Если используется Руководство по iptables: Настройка и оптимизация фаервола Linux
cat /proc/net/nf_conntrack | grep udp | wc -l cat /proc/net/ip_conntrack | grep udp | wc -l
SYN-флуд (Полуоткрытое TCP/IP-соединение)
Наличие SYN- флуда устанавливается легко - через подсчет числа «полуоткрытых» TCP- соединений. В обычной ситуации их не должно быть совсем (или очень небольшое количество: максимум 1-3).
netstat -na | grep ":1720\ " | grep SYN_RCVD netstat -na | grep ":443\ " | grep SYN_RCVD netstat -na | grep ":80\ " | wc -l
Один из распространенных способов не только забить канал связи, но и ввести сетевой стек операционной системы в такое состояние, когда он уже не сможет принимать новые запросы на подключение. Основан на попытке инициализации большого числа одновременных TCP-соединений через посылку SYN-пакета с несуществующим обратным адресом. После нескольких попыток отослать ответный ACK-пакет на недоступный адрес большинство операционок ставят неустановленное соединение в очередь. И только после n-ой попытки закрывают соединение. Так как поток ACK-пакетов очень велик, вскоре очередь оказывается заполненной, и ядро дает отказ на попытки открыть новое соединение. Наиболее умные DoS-боты еще и анализируют систему перед началом атаки, чтобы слать запросы только на открытые жизненно важные порты. Идентифицировать такую атаку просто: достаточно попробовать подключиться к одному из сервисов. Оборонительные мероприятия обычно включают в себя:
Увеличение очереди «полуоткрытых» TCP-соединений:
# sysctl -w net.ipv4.tcp_max_syn_backlog=1024
Уменьшение времени удержания «полуоткрытых» соединений:
# sysctl -w net.ipv4.tcp_synack_retries=1
Включение механизма TCP syncookies:
# sysctl -w net.ipv4.tcp_syncookies=1
Как запретить Спуфинг (подмену адресов) от вашего имени
UDP-флуд
Метод захламления полосы пропускания. Основан на бесконечной посылке UDP-пакетов на порты различных UDP-сервисов. Легко устраняется за счет отрезания таких сервисов от внешнего мира и установки в фаерволе лимита на количество соединений в единицу времени.
# udp 5060 iptables -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j LOG --log-level info --log-prefix "REJECT 5060: " iptables -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j REJECT # tcp 1720 iptables -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 60 -j LOG --log-level info --log-prefix "REJECT 1720: " iptables -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 60 -j REJECT
ICMP- флуд
Очень примитивный метод забивания полосы пропускания и создания нагрузок на сетевой стек через монотонную посылку запросов ECHO (пинг) Не умеешь правильно фильтровать ICMP - не фильтруй вообще!!!. Легко обнаруживается с помощью анализа потоков трафика в обе стороны: во время атаки типа ICMP-флуд они практически идентичны. Почти безболезненный способ абсолютной защиты основан на отключении ответов на запросы ICMP ECHO:
sysctl net.ipv4.icmp_echo_ignore_all=1
Или с помощью брандмауэра:
iptables -A INPUT -p icmp -j DROP --icmp-type 8
Полностью заблокировать протокол icmp (не рекомендуется):
iptables -A INPUT -p icmp -f -j DROP
HTTP-флуд
Нужно подсчитать количество процессов Web - сервера (например Apache) и количество конектов на 80-ый порт. Значения, в несколько раз превышающие среднестатистические, дают основания задуматься.
- Количество процессов
ps aux | grep apache | wc -l ps aux | grep nginx | wc -l
- Количество конектов на 80, 443 порту
netstat -na | grep ":80\ " | wc -l netstat -na | grep ":443\ " | wc -l
- Просмотреть список IP- адресов, с которых идут запросы на подключение на порт 443:
netstat -na | grep ":443\ " | sort | uniq -c | sort -nr 1 tcp6 0 0 :::443 :::* LISTEN 1 tcp 0 0 193.233.203.51:443 54.36.149.33:60447 TIME_WAIT 1 tcp 0 0 193.233.203.51:443 178.64.46.67:60800 ESTABLISHED 1 tcp 0 0 193.233.203.51:443 178.64.46.67:60796 ESTABLISHED 1 tcp 0 0 193.233.203.51:443 178.64.46.67:60795 ESTABLISHED 1 tcp 0 0 193.233.203.51:443 144.76.58.13:51728 ESTABLISHED 1 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
- apachetop - отображает полученную от запущенной копии Apache информацию в режиме реального времени
Алгоритм защиты от HTTP флуда (подразумевается в мир смотрит Nginx):
- Выяснить какой именной сайт, а чаще всего какую именно страницу засыпают запросами, например при помощи httpry или просмотр логов вебсервера.
- Предположим DDOS идет на страницу сайта с url sitemap. Можем создать команду, которая создаст файл с ip для подключения к Nginx.
cat /var/log/nginx/site-access.log | grep sitemap | awk '{ print $1 }' | sort |uniq -c | sort -nr | awk '{ if ($1>100 ) print "deny " $2 ";"}' >> /etc/nginx/vhosts-includes/block_ddos.conf && nginx -t && nginx -s reload && echo > /var/log/nginx/site-access.log
Еще один вариант создания списка IP для блокировки, после его запуска не забываем обнулять файл лога site.error.log, например командой echo:
cat /var/www/httpd-logs/site.error.log| grep perip | cut -d : -f5 | cut -d , -f1 | sort | uniq -c | sort -nr | awk '{ if ($1>100) print "deny " $2";"}' echo -n > /var/www/httpd-logs/site.error.log
- Вариант жесткой блокировки DDOS. На выходе получаем подобный файл, где в начале блокируем: ботов, устаревший протокол HTTP1.0, некоторые юзер агенты (вы можете добавить на свое усмотрение) и ниже добавлены ip из предыдущего пункта. Если расположить этот файл в директории /etc/nginx/vhosts-includes/block_ddos.conf, то он автоматически, после перезагрузки nginx, подключиться ко всем доменам.
if ($http_referer ~* (arm-eais.rkn.gov.ru|eais.rkn.gov.ru|cases.corp.google.com|iframe-toloka.com|classdom.ru|savemyass.org|yahoo.com|facebook|ba idu.com|qq.com|reddit.com|bing.com|youtube.com|gmail.com) ) { return 444; } if ($server_protocol ~* "HTTP/1.0") { return 444; } if ($http_user_agent ~ "python-requests") { return 444; } if ($http_user_agent ~ "Wget") { return 444; } if ($http_user_agent ~ "curl/7.36.0") { return 444; } if ($http_user_agent ~ Siege.*) { return 444; } if ($http_user_agent ~ ApacheBench.*) { return 444; } deny 196.xxx.xxx.xxx; deny 104.xxx.xxx.xxx; ...
- Вариант мягкой блокировки DDOS. Примеры настройки limit_conn в Nginx для ограничения числа соединений. Настройка Nginx ограничение скорости rate limit
Скрипт для разбора лог-файла Apache
Блокирование атак при помощи null route или blackhole
DDoS-атака с использованием SSDP
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах