Базовая защита от DDoS и Slowloris атак в Nginx: лимиты буферов и соединений
- Сервер перестает принимать новые 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 Частые вопросы (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 раз больше оперативной памяти в общих зонах.