La mayoría de los planes de hosting prometen protección DDoS. Eso suele significar filtrar grandes inundaciones de paquetes basura (capas 3 y 4) antes de que lleguen a tu servidor. No detiene a mil navegadores "reales" cargando tu página más lenta a la vez. Esos ataques de capa de aplicación (capa 7) parecen visitantes normales y debes gestionarlos tú mismo. Consulta qué es la protección DDoS para el contexto.
Conoce la diferencia
- Inundaciones volumétricas: llenan la tubería de red. El host o el proveedor upstream las filtra.
- Ataques de protocolo: agotan las tablas de conexiones. La red se encarga de ellos en su mayoría.
- Ataques de capa 7: peticiones HTTP de apariencia válida que consumen CPU, base de datos o workers. Estos llegan a tu aplicación.
Paso 1: limita la tasa en Nginx
Limita la rapidez con que una dirección puede hacer peticiones. Define una zona en el bloque http y aplícala a tu sitio.
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 límite mucho más estricto en los inicios de sesión y la búsqueda, ya que son costosos.
Paso 2: usa caché siempre que puedas
Servir una página en caché casi no cuesta nada. Activa la caché de FastCGI o de proxy para el tráfico anónimo, aunque sea durante 30 a 60 segundos. Convierte una inundación de peticiones idénticas en un puñado de reales.
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;
Paso 3: establece tiempos de espera razonables
Los ataques de conexión lenta mantienen los workers ocupados. Acorta los límites.
client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;
Paso 4: bloquea a los reincidentes con fail2ban
Bloquea las direcciones que activen el limitador de tasa. Nginx registra las peticiones rechazadas en el registro de errores, y un filtro puede detectarlas.
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime = 1h
Paso 5: coloca un proxy delante cuando la cosa se ponga seria
Un proxy inverso o una CDN con desafíos para bots puede absorber ataques que un solo VPS no puede. Recuerda proteger el origen como se describe en mantener en secreto la IP de tu origen, o los atacantes lo rodearán.
Prepárate antes de que ocurra
- Conoce tus páginas más lentas y arréglalas o ponlas en caché.
- Mantén la monitorización para notar un pico rápidamente.
- Ten un plan: límites más estrictos, una página de mantenimiento, un servidor más grande.
Lo básico de la guía de UFW y fail2ban complementa esta.