Боремся с 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.
    Пример конфигурации для Nginx:

    Код:

    # В секции 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: Один из мировых лидеров в доставке и защите контента.

Заключение

Рассмотренный скрипт может быть полезным инструментом "первой помощи" на вашем сервере. Однако для построения настоящей, эшелонированной защиты необходимо комбинировать несколько подходов: грамотную настройку веб-сервера и, в идеале, подключение внешнего сервиса фильтрации трафика.

Оставить комментарий