Налаштування захисту від 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 дня







