Боремся с DDOS
Проблемы с доступностью сайта могут быть вызваны разными причинами, и одна из самых неприятных — это DDoS-атака. Хотя полноценная защита от крупных и сложных атак требует профессиональных решений, от простого HTTP-флуда с ограниченного числа IP-адресов можно защититься на уровне сервера.
В этой статье мы рассмотрим базовый скрипт для автоматической блокировки атакующих, обсудим его ограничения и сравним с более современными и надежными методами защиты.
Первая помощь: скрипт для автоматической блокировки
Этот bash-скрипт анализирует текущие сетевые подключения к серверу. Если он обнаруживает, что с одного IP-адреса исходит слишком много соединений, он автоматически добавляет этот адрес в "черный список" с помощью ipset и iptables, блокируя ему доступ.
Скрипт:
#!/bin/bash
# --- НАСТРОЙКИ ---
# Порог срабатывания: количество подключений с одного IP, которое считаем атакой
LIMIT=50
# Имя для нашего списка заблокированных IP в ipset
IPSET_NAME="blacklist"
# Путь для временного файла со списком IP-адресов
IP_LIST_TEMP_FILE="/tmp/ip.list"
# --- ЛОГИКА СКРИПТА ---
# 1. Проверяем, существует ли наш ipset-список, и если нет - создаем его
if ! ipset -L ${IPSET_NAME} >/dev/null 2>&1; then
ipset create ${IPSET_NAME} hash:ip timeout 3600
iptables -I INPUT -m set --match-set ${IPSET_NAME} src -j DROP
fi
# 2. Получаем список IP-адресов, превысивших лимит подключений
# Мы используем netstat для получения списка соединений, затем awk и sort для подсчета
netstat -ntu | awk '{print $5}' | cut -d: -f1 | grep -vE '^(127.0.0.1|0.0.0.0|::1)$' \
| sort | uniq -c | sort -nr > ${IP_LIST_TEMP_FILE}
# 3. Добавляем "плохие" IP в наш список блокировки
while read -r count ip; do
if [ "${count}" -gt "${LIMIT}" ]; then
echo "Обнаружен флуд с IP ${ip} (${count} соединений). Блокируем."
ipset add ${IPSET_NAME} "${ip}"
fi
done < ${IP_LIST_TEMP_FILE}
# 4. Очищаем временный файл
rm -f ${IP_LIST_TEMP_FILE}
echo "Проверка завершена."
Как использовать скрипт:
- Сохраните код в файл, например,
/root/ddos_block.sh
- Сделайте файл исполняемым:
chmod +x /root/ddos_block.sh
- Добавьте его в cron для регулярного выполнения (например, каждые 5 минут):
*/5 * * * * /root/ddos_block.sh > /dev/null 2>&1
Ограничения этого метода
Важно понимать, что такой скрипт — это лишь базовый уровень защиты. Он не поможет против:
- Масштабных атак, идущих с тысяч разных IP-адресов.
- Атак на уровне протоколов (UDP/ICMP-флуд)
- "Умных" атак на уровне приложения (L7), которые имитируют поведение реальных пользователей.
Кроме того, есть риск заблокировать легитимных пользователей, например, целый офис, который выходит в интернет через один IP-адрес (NAT).
Современные и более надежные методы защиты
Для серьезных проектов стоит использовать более продвинутые инструменты.
- На уровне веб-сервера Nginx
Современные веб-серверы, такие как Nginx, имеют встроенные модули для очень эффективного ограничения запросов. Это работает быстрее и надежнее, чем внешний скрипт.
- limit_req_zone: Ограничивает частоту запросов (например, не более 10 запросов в секунду).
- limit_conn_zone: Ограничивает общее количество одновременных соединений с одного IP.
Код:
# В секции http вашего nginx.conf limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; server { # ... ваши настройки сервера ... location / { limit_req zone=req_limit_per_ip burst=10 nodelay; limit_conn conn_limit_per_ip 10; # ... остальные настройки location ... } }
-
Внешние сервисы (WAF и CDN)
Самый надежный способ защиты — использовать специализированные сервисы, которые фильтруют трафик еще до того, как он достигнет вашего сервера. Весь трафик направляется через их сеть, где "плохие" запросы отсеиваются, а "хорошие" — пропускаются к вам.
Популярные сервисы:- Cloudflare: Самый известный сервис, предоставляющий мощную защиту от DDoS даже на бесплатном тарифе.
- Qrator Labs: Профессиональное решение, специализирующееся на защите от DDoS-атак.
- Akamai: Один из мировых лидеров в доставке и защите контента.
Заключение
Рассмотренный скрипт может быть полезным инструментом "первой помощи" на вашем сервере. Однако для построения настоящей, эшелонированной защиты необходимо комбинировать несколько подходов: грамотную настройку веб-сервера и, в идеале, подключение внешнего сервиса фильтрации трафика.
Оставить комментарий