La maggior parte dei piani di hosting promette protezione DDoS. Di solito significa filtrare grandi ondate di pacchetti spazzatura (livelli 3 e 4) prima che raggiungano il tuo server. Non ferma mille browser "veri" che caricano contemporaneamente la tua pagina più lenta. Questi attacchi a livello applicativo (livello 7) sembrano visitatori normali e devi gestirli tu. Vedi cos'è la protezione DDoS per il contesto.
Conosci la differenza
- Flood volumetrici: riempiono la banda della rete. Li filtra l'host o l'upstream.
- Attacchi di protocollo: esauriscono le tabelle delle connessioni. Per lo più gestiti dalla rete.
- Attacchi di livello 7: richieste HTTP dall'aspetto valido che consumano CPU, database o worker. Questi raggiungono la tua applicazione.
Passo 1: limita la frequenza in Nginx
Imposta un tetto alla velocità con cui un singolo indirizzo può fare richieste. Definisci una zona nel blocco http e applicala al tuo sito.
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;
server {
location / {
limit_req zone=perip burst=20 nodelay;
limit_conn connip 20;
}
location = /login {
limit_req zone=perip burst=3 nodelay;
}
}
Usa un limite molto più stretto per login e ricerca, perché sono operazioni costose.
Passo 2: metti in cache il possibile
Una pagina in cache costa quasi nulla da servire. Attiva la cache FastCGI o proxy per il traffico anonimo, anche solo per 30-60 secondi. Trasforma un'ondata di richieste identiche in una manciata di richieste reali.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=site:50m inactive=10m;
fastcgi_cache site;
fastcgi_cache_valid 200 60s;
fastcgi_cache_use_stale updating error timeout;
Passo 3: imposta timeout ragionevoli
Gli attacchi a connessione lenta tengono occupati i worker. Riduci i limiti.
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;
Passo 4: banna i recidivi con fail2ban
Banna gli indirizzi che fanno scattare il limitatore di frequenza. Nginx registra le richieste rifiutate nel log degli errori e un filtro può riconoscerle.
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 1h
Passo 5: metti un proxy davanti quando la situazione si fa seria
Un reverse proxy o una CDN con sfide anti-bot possono assorbire attacchi che un singolo VPS non regge. Ricorda di proteggere l'origine come descritto in come mantenere segreto l'IP di origine, altrimenti gli attaccanti lo aggireranno.
Preparati prima che accada
- Conosci le tue pagine più lente e correggile o mettile in cache.
- Mantieni il monitoraggio per accorgerti subito di un picco.
- Abbi un piano: limiti più stretti, una pagina di manutenzione, un server più grande.
Le basi nella guida a UFW e fail2ban vanno di pari passo con questa.