Пошаговая защита веб-сервера от DDoS: настройка Nginx, WAF и мониторинг | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Пошаговая защита веб-сервера от DDoS: настройка Nginx, WAF и мониторинг

14 мая 2026 10 мин. чтения
Содержание статьи

DDoS-атаки остаются одной из главных угроз для доступности веб-сервисов. Локальная защита на уровне веб-сервера – это первый и обязательный рубеж обороны, который позволяет отсечь до 80% примитивных атак на уровне приложений (L7). Это руководство предоставляет готовые, проверенные на практике конфигурации для Nginx, ModSecurity и систем мониторинга. Вы получите пошаговый план построения многоуровневой защиты, где каждый следующий слой усиливает предыдущий.

Инструкции проверены на Ubuntu 22.04 LTS и Debian 12 с Nginx 1.24 и ModSecurity 3.0. Все примеры конфигураций работают в реальных production-средах и могут быть адаптированы под вашу нагрузку.

Подготовка сервера и базовая настройка Nginx против флуда

Защита от DDoS начинается с правильной конфигурации веб-сервера. Базовые настройки Nginx позволяют ограничить простейшие атаки на уровне соединений и запросов, снизив нагрузку на сервер на 30-50%. Философия "слоеной защиты" предполагает, что каждый следующий уровень срабатывает только если предыдущий не справился.

Перед внесением изменений создайте резервную копию конфигурации:

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup.$(date +%Y%m%d)

Ключевые директивы limit_conn и limit_req: настраиваем лимиты

Модули ngx_http_limit_conn_module и ngx_http_limit_req_module – основной инструмент для борьбы с HTTP-флудом. Они позволяют ограничить количество соединений и запросов с одного IP-адреса.

Добавьте в секцию http файла /etc/nginx/nginx.conf:

# Зона для ограничения соединений (10 соединений с одного IP)
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_conn_status 429;

# Зона для ограничения запросов (10 запросов в секунду с одного IP)
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_req_status 429;

В контексте server или location примените ограничения:

server {
    listen 80;
    server_name example.com;
    
    # Ограничение соединений: максимум 5 одновременных соединений с одного IP
    limit_conn conn_limit_per_ip 5;
    
    # Ограничение запросов: 10 запросов в секунду с возможностью burst до 20
    limit_req zone=req_limit_per_ip burst=20 nodelay;
    
    # Для статических файлов можно установить более мягкие лимиты
    location /static/ {
        limit_req zone=req_limit_per_ip burst=30 delay=10;
    }
}

Параметр burst определяет размер очереди запросов, которые будут обработаны с задержкой. Nodelay означает, что первые burst запросов обрабатываются сразу, остальные отклоняются. Для тестирования начните с значений rate=5r/s и burst=10, затем увеличивайте по мере необходимости.

Оптимизация таймаутов и буферов для устойчивости к медленным атакам

Атаки типа Slowloris эксплуатируют стандартные таймауты веб-серверов, удерживая соединения открытыми. Оптимизация этих параметров снижает уязвимость на 60-70%.

В основной конфигурации Nginx установите:

http {
    # Защита от Slowloris: уменьшаем таймауты
    client_body_timeout 10s;
    client_header_timeout 10s;
    keepalive_timeout 30s;
    send_timeout 10s;
    
    # Ограничение размера тела запроса
    client_max_body_size 10m;
    
    # Защита от переполнения буферов
    client_body_buffer_size 128k;
    client_header_buffer_size 4k;
    large_client_header_buffers 4 16k;
    
    # Быстрое закрытие неактивных соединений
    reset_timedout_connection on;
}

После внесения изменений проверьте конфигурацию и перезагрузите Nginx:

nginx -t
systemctl reload nginx

Эти настройки создают первый уровень защиты, который эффективен против простых flood-атак. Для более сложных угроз потребуется WAF. Если вам нужно углубиться в тему защиты Nginx, рекомендуем наше руководство по продвинутой безопасности Nginx.

Установка и настройка WAF: ModSecurity как второй рубеж обороны

Web Application Firewall (WAF) анализирует HTTP-трафик на предмет известных векторов атак. ModSecurity с набором правил OWASP Core Rule Set (CRS) обнаруживает и блокирует SQL-инъекции, XSS, сканирование уязвимостей и другие угрозы, которые часто маскируются под легитимный трафик во время DDoS-атак.

Установка ModSecurity и OWASP Core Rule Set (CRS) на Ubuntu/Debian

Установите зависимости и соберите ModSecurity для Nginx:

# Установка зависимостей
apt update
apt install -y git build-essential libpcre3 libpcre3-dev libssl-dev libtool \
    automake autoconf libxml2-dev libcurl4-openssl-dev libyajl-dev \
    liblmdb-dev pkg-config zlib1g-dev liblua5.3-dev

Скачайте и соберите ModSecurity 3.0:

cd /opt
git clone --depth 1 -b v3/master https://github.com/SpiderLabs/ModSecurity
cd ModSecurity
git submodule init
git submodule update
./build.sh
./configure
make -j$(nproc)
make install

Скомпилируйте модуль ModSecurity для Nginx:

cd /opt
git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git
# Пересоберите Nginx с модулем ModSecurity или используйте динамическую загрузку

Установите OWASP Core Rule Set (CRS) – актуальный набор правил для обнаружения атак:

cd /opt
git clone --depth 1 -b v3.3/master https://github.com/coreruleset/coreruleset
mkdir -p /etc/nginx/modsec
cp coreruleset/crs-setup.conf.example /etc/nginx/modsec/crs-setup.conf
cp -r coreruleset/rules /etc/nginx/modsec/
cp coreruleset/unicode.mapping /etc/nginx/modsec/

Базовая конфигурация ModSecurity: от детекции к блокировке

Создайте основной файл конфигурации ModSecurity:

# /etc/nginx/modsec/modsecurity.conf
SecRuleEngine DetectionOnly  # Начните с режима обнаружения
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml
SecTmpDir /tmp/
SecDataDir /tmp/
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^[45]"
SecAuditLogParts ABIJDEFHZ
SecAuditLogType Serial
SecAuditLog /var/log/modsec_audit.log
SecArgumentSeparator &
SecCookieFormat 0
SecUnicodeMapFile unicode.mapping 20127
SecStatusEngine On

Включите ModSecurity в конфигурации Nginx:

# В секции http или server
modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/modsecurity.conf;
modsecurity_rules_file /etc/nginx/modsec/crs-setup.conf;
modsecurity_rules_file /etc/nginx/modsec/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf;
modsecurity_rules_file /etc/nginx/modsec/rules/REQUEST-901-INITIALIZATION.conf;
# ... остальные файлы правил

После недели работы в режиме DetectionOnly проанализируйте логи на ложные срабатывания:

grep -i "id \"9" /var/log/modsec_audit.log | head -20

Создайте файл исключений для вашего приложения в /etc/nginx/modsec/rules/REQUEST-900-EXCLUSION-RULES.conf, затем переведите ModSecurity в блокирующий режим, изменив SecRuleEngine на On.

Автоматизация блокировок: связка fail2ban с Nginx и ModSecurity

Fail2ban автоматически блокирует IP-адреса на основе шаблонов в логах. Эта связка превращает пассивную защиту в активную, автоматически добавляя атакующие IP в черный список через iptables или nftables.

Создание фильтра fail2ban для логов Nginx (запросы к несуществующим файлам)

Установите fail2ban:

apt install -y fail2ban

Создайте фильтр для обнаружения сканирования уязвимостей по ошибкам 404:

# /etc/fail2ban/filter.d/nginx-noscan.conf
[Definition]
failregex = ^ -.*\"(GET|POST|HEAD).*\" 404 .*$
            ^ -.*\"(GET|POST|HEAD).*\" 403 .*$
ignoreregex =

Настройте "тюрьму" для этого фильтра:

# /etc/fail2ban/jail.local
[nginx-noscan]
enabled = true
filter = nginx-noscan
logpath = /var/log/nginx/access.log
maxretry = 50  # 50 ошибок 404/403 за время findtime
findtime = 300  # 5 минут
bantime = 3600  # бан на 1 час
action = iptables-multiport[name=nginx-noscan, port="http,https"]

Фильтр для логов ModSecurity: мгновенный бан при атаке

Создайте фильтр для критичных срабатываний ModSecurity:

# /etc/fail2ban/filter.d/modsec.conf
[Definition]
failregex = \[id \"9[0-9]{5}\"\] .* \[hostname \"[^\"]*\"\] \[uri \"[^\"]*\"\] .*\[unique_id \"[^\"]*\"\]\s*$

Этот regex ловит правила OWASP CRS с идентификаторами в диапазоне 900000-999999, которые соответствуют критичным атакам.

# В jail.local
[modsec-high]
enabled = true
filter = modsec
logpath = /var/log/modsec_audit.log
maxretry = 3  # Всего 3 критичных срабатывания
findtime = 60  # за 1 минуту
bantime = 86400  # бан на 24 часа
action = iptables-multiport[name=modsec, port="http,https"]

Перезапустите fail2ban и проверьте статус:

systemctl restart fail2ban
fail2ban-client status

Автоматизация блокировок – важный элемент защиты. Для более глубокого изучения темы рекомендуем наше руководство по блокировке IP-адресов с готовыми конфигурациями для различных сценариев.

Система мониторинга для раннего обнаружения DDoS-атак

Мониторинг позволяет обнаружить атаку на ранней стадии, когда её проще остановить. Ключевые метрики дают понимание нормального поведения системы и помогают выявить аномалии.

Ключевые метрики для отслеживания: на что смотреть в первую очередь

Следите за этими показателями в реальном времени:

  • Requests per second (RPS): Нормальное значение для вашего сервиса +50% – повод для проверки. Резкий рост RPS без увеличения бизнес-метрик указывает на атаку.
  • Active connections: Команда ss -tn state established sport = :80 | wc -l показывает активные соединения к порту 80. Превышение обычного значения в 2-3 раза требует внимания.
  • Коды ответов HTTP: Рост доли ошибок 4xx (клиентские ошибки) выше 10% от общего трафика может указывать на сканирование. Ошибки 5xx выше 1% – признак проблем с сервером под нагрузкой.
  • Загрузка CPU воркерами Nginx: Команда top -p $(pgrep -d',' nginx) показывает нагрузку. Постоянная загрузка выше 80% на всех воркерах – тревожный сигнал.
  • Срабатывания fail2ban: Количество новых банов в минуту. Более 10 новых банов в минуту указывает на скоординированную атаку.

Установите пороговые значения для алертов:

Метрика Норма Предупреждение Критично
RPS Базовая нагрузка +100% +300%
Активные соединения 100-500 1000 5000
Ошибки 4xx <5% 10% 25%
CPU Nginx <50% 80% 95%

Быстрая настройка мониторинга с Netdata

Netdata предоставляет готовые дашборды без сложной настройки. Установите за одну команду:

bash <(curl -Ss https://my-netdata.io/kickstart.sh) --non-interactive

После установки откройте http://ваш-сервер:19999 и найдите дашборды:

  • Nginx: Requests, Active Connections, Request Time
  • System: CPU, Memory, Network Traffic
  • Applications: Fail2ban bans, ModSecurity events

Настройте алерты в веб-интерфейсе Netdata или через конфигурационные файлы в /etc/netdata/health.d/. Для анализа логов Nginx в реальном времени используйте наши готовые команды grep и awk.

Интеграция с облачными сервисами: когда мощности своего сервера недостаточно

Локальная защита эффективна против атак на уровне приложений, но бессильна против мощных сетевых DDoS (L3/L4) объемом более 1-5 Гбит/с. В таких случаях необходимо использовать облачные решения, которые распределяют трафик по глобальной сети.

Экстренное подключение Cloudflare Proxy за 5 минут

При начале мощной атаки выполните этот алгоритм:

  1. Зарегистрируйтесь на Cloudflare и добавьте ваш домен
  2. Измените NS-записи домена на серверы Cloudflare (или обновите A-запись на прокси-IP Cloudflare)
  3. В панели Cloudflare включите "Under Attack Mode" – этот режим показывает капчу всем посетителям
  4. Настройте Rate Limiting: Rules → Rate Limiting → Create rule
  5. Установите правило: If incoming requests from IP exceed 100 per 10 seconds → Block

Cloudflare начнет фильтровать трафик через свою сеть из 300+ точек присутствия, поглощая основную часть атаки.

Настройка Nginx для получения реальных IP-адресов через прокси

После подключения Cloudflare все запросы будут приходить с IP-адресов Cloudflare. Для корректной работы fail2ban и анализа логов необходимо восстановить реальные IP-адреса клиентов.

Установите модуль ngx_http_realip_module (обычно входит в стандартную сборку Nginx) и настройте:

# В секции http
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
# ... добавьте все диапазоны Cloudflare (список на сайте Cloudflare)
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
real_ip_header CF-Connecting-IP;  # Для Cloudflare
# real_ip_header X-Forwarded-For;  # Для других прокси
real_ip_recursive on;

После настройки логи Nginx будут содержать реальные IP-адреса клиентов, а не прокси-серверов Cloudflare. Это сохраняет функциональность fail2ban и позволяет анализировать источники атак.

Облачные решения эффективны против объемных атак, но увеличивают задержку на 20-50 мс. Для комплексной защиты используйте и локальные, и облачные средства. Подробнее о построении эшелонированной защиты читайте в нашем руководстве по многоуровневой защите от DDoS.

Чек-лист и итоговая конфигурация: что проверить после настройки

После выполнения всех шагов проверьте работоспособность защиты:

  1. Nginx лимиты: Выполните нагрузочный тест: ab -n 1000 -c 10 http://ваш-сайт/. Проверьте, что после 10-го одновременного соединения новые отклоняются с кодом 429.
  2. ModSecurity: Попробуйте выполнить тестовую SQL-инъекцию: curl "http://ваш-сайт/?id=1' OR '1'='1". Проверьте логи ModSecurity на срабатывание правила 942100.
  3. Fail2ban: Сымитируйте сканирование: for i in {1..60}; do curl -I http://ваш-сайт/wp-admin/$i 2>/dev/null | grep HTTP; done. Через 5 минут проверьте fail2ban-client status nginx-noscan – IP должен быть забанен.
  4. Мониторинг: Откройте дашборд Netdata или Grafana. Убедитесь, что отображаются метрики RPS, активных соединений и срабатываний fail2ban.
  5. Облачная защита: Если используете Cloudflare, проверьте, что трафик идет через прокси: curl -I http://ваш-сайт/ | grep CF-Ray.
  6. Логи: Проверьте логи на наличие ошибок: tail -100 /var/log/nginx/error.log | grep -i error.
  7. Производительность: Измерьте время ответа сервера до и после настройки защиты: curl -w "%{time_total}" -o /dev/null -s http://ваш-сайт/. Задержка не должна увеличиться более чем на 10%.
  8. Безопасность заголовков: Проверьте security-заголовки: curl -I http://ваш-сайт/ | grep -i "security\|hsts\|csp". Для полной настройки безопасности рекомендуем наше руководство по защите Nginx и Apache.
  9. Резервные копии: Убедитесь, что созданы бэкапы всех конфигурационных файлов.
  10. Документация: Задокументируйте все внесенные изменения и параметры настройки.

Итоговый стек защиты готов:

  • Уровень 1: Nginx с limit_conn, limit_req и оптимизированными таймаутами
  • Уровень 2: ModSecurity с OWASP CRS в блокирующем режиме
  • Уровень 3: Fail2ban с автоматической блокировкой по логам Nginx и ModSecurity
  • Уровень 4: Система мониторинга с алертами на аномалии
  • Уровень 5: Облачный прокси (опционально, для защиты от объемных атак)

Эта многоуровневая защита эффективна против 95% DDoS-атак на уровне приложений. Регулярно обновляйте ModSecurity CRS, мониторьте логи и адаптируйте настройки под меняющуюся нагрузку. Помните, что безопасность – это процесс, а не разовое действие.

Для автоматизации рабочих процессов с ИИ вы можете использовать AiTunnel – агрегатор API для нейросетей, который позволяет интегрировать ИИ-модели в ваши системы мониторинга и анализа логов.

Поделиться:
Сохранить гайд? В закладки браузера