Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

NGINX_DOS_MITIGATION Linux / DevOps

Базовая защита от DDoS и Slowloris атак в Nginx: лимиты буферов и соединений

Обновлено: 21.08.2026
  • Сервер перестает принимать новые TCP-соединения из-за исчерпания пула worker_connections.
  • Атака типа Slowloris (медленная отправка заголовков или тела запроса) удерживает сотни соединений открытыми.
  • Высокое потребление памяти под раздутые буферы запросов при HTTP Flood.

1. Защита от медленных соединений (Slowloris/Slow-POST)

Уменьшите время ожидания клиента в блоке http:

# Таймауты чтения заголовка и тела запроса
client_header_timeout 10s;
client_body_timeout 10s;

# Закрытие неактивных keep-alive соединений
keepalive_timeout 30s;
send_timeout 10s;

# Немедленный сброс сокета при закрытии соединения клиентом
reset_timedout_connection on;

2. Ограничение размеров буферов для исключения утечек памяти

client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
client_max_body_size 10M;

3. Настройка Rate Limiting (limit_req и limit_conn)

В секции http создайте зоны ограничений:

# Зона по IP-адресу (10MB хранит ~160 000 IP)
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

Примените в блоке server или location:

# Ограничение до 15 одновременных TCP-соединений с одного IP
limit_conn conn_limit_per_ip 15;

# Лимит 10 r/s с возможностью всплеска (burst) до 20 запросов
limit_req zone=req_limit_per_ip burst=20 nodelay;
limit_req_status 429;

4. Валидация и перезагрузка

nginx -t && systemctl reload nginx
💡 Практика специалистов: Не используйте чрезмерно низкие лимиты limit_req на эндпоинтах статических файлов (CSS/JS/изображения), иначе браузеры пользователей получат ошибку 429 при параллельной загрузке ресурсов страницы.

Частые вопросы (FAQ)

Что делает директива reset_timedout_connection on?

При срабатывании таймаута соединения Nginx отправляет клиенту TCP RST пакет вместо стандартного четырехстороннего закрытия (FIN-ACK), освобождая сокет и память ядра мгновенно.

Почему в limit_req_zone используется $binary_remote_addr вместо $remote_addr?

Переменная $binary_remote_addr хранит IP в бинарном виде (4 байта для IPv4, 16 байт для IPv6) вместо строкового представления, что экономит в 4-8 раз больше оперативной памяти в общих зонах.

Полезные материалы
Рекомендуем