Настройка защиты от DDoS-атак для сайта
DDoS (Distributed Denial of Service) — перегрузка сервера потоком запросов от множества источников до полной недоступности. Атаки бывают сетевого уровня (L3/L4: UDP flood, SYN flood) и прикладного уровня (L7: HTTP flood). Последние сложнее отфильтровать — запросы выглядят как легитимный трафик.
Уровни защиты
Уровень 1: CDN + Anycast (Cloudflare, AWS Shield) Трафик проходит через распределённую сеть узлов. Атакующий вынужден перегружать сразу сотни точек присутствия по всему миру — практически невозможная задача.
Уровень 2: Rate limiting на уровне Nginx/приложения Ограничение числа запросов с одного IP.
Уровень 3: Анализ и блокировка аномального трафика Поведенческие паттерны, IP-репутация, Challenge (CAPTCHA/JS-вызов) для подозрительного трафика.
Cloudflare — базовая настройка
Cloudflare Free/Pro закрывает большинство L3/L4 атак автоматически. Для L7:
Security > DDoS > HTTP DDoS attack protection:
- Sensitivity: High
- Action: Block (после тестирования, начинать с Log)
Security > Settings:
- Security Level: Medium или High при атаке
- Bot Fight Mode: ON
- Browser Integrity Check: ON
При активной атаке: Security > Under Attack Mode — все посетители проходят JS-вызов.
Rate Limiting в Nginx
# Зоны ограничения — в http блоке
limit_req_zone $binary_remote_addr zone=api:10m rate=30r/m;
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
limit_conn_zone $binary_remote_addr zone=perip:10m;
server {
# API — 30 запросов в минуту
location /api/ {
limit_req zone=api burst=10 nodelay;
limit_req_status 429;
}
# Форма входа — 5 попыток в минуту
location /login {
limit_req zone=login burst=3 nodelay;
limit_req_status 429;
}
# Максимум 20 одновременных соединений с одного IP
limit_conn perip 20;
}
Rate Limiting в приложении (Laravel)
// routes/api.php
Route::middleware('throttle:60,1')->group(function () {
Route::get('/data', [DataController::class, 'index']);
});
// Кастомные лимиты с разными правилами для авторизованных
Route::middleware('throttle:api')->group(function () { ... });
// config/app.php или RouteServiceProvider
RateLimiter::for('api', function (Request $request) {
return $request->user()
? Limit::perMinute(120)->by($request->user()->id)
: Limit::perMinute(30)->by($request->ip());
});
SYN Flood на уровне ядра Linux
# /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
# Применить
sysctl -p
Firewall: ограничение новых соединений через iptables/nftables
# Ограничить новые TCP-соединения: не более 20 в секунду с одного IP
iptables -A INPUT -p tcp --dport 80 -m state --state NEW \
-m recent --set --name HTTP_FLOOD
iptables -A INPUT -p tcp --dport 80 -m state --state NEW \
-m recent --update --seconds 10 --hitcount 200 \
--name HTTP_FLOOD -j DROP
Fail2ban для HTTP flood
# /etc/fail2ban/filter.d/nginx-req-limit.conf
[Definition]
failregex = limiting requests, excess:.* by zone.*client: <HOST>
# /etc/fail2ban/jail.d/nginx.conf
[nginx-req-limit]
enabled = true
filter = nginx-req-limit
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 600
Геоблокировка
При атаке из определённых регионов — временная блокировка через Cloudflare или GeoIP в Nginx:
# MaxMind GeoIP2
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_country_code country iso_code;
}
map $geoip2_country_code $blocked_country {
default 0;
CN 1;
RU 0; # Нельзя блокировать собственную аудиторию
}
if ($blocked_country = 1) { return 403; }
Мониторинг и алерты
Инструменты наблюдения за аномальным трафиком:
- Grafana + Prometheus — дашборды RPS, 4xx/5xx, latency
- GoAccess — real-time анализ Nginx-логов
- Cloudflare Analytics — статистика по заблокированным запросам
Алерт при превышении 90-го перцентиля RPS — сигнал к активации усиленного режима.
Срок реализации
- Подключение Cloudflare + базовые правила: 1 день
- Настройка rate limiting Nginx + Fail2ban: 1 день
- Настройка мониторинга: 1–2 дня







