Hace unos meses ya os había comentado aquí la forma de bloquear directamente los bots en vuestros sitios web si usáis Nginx
Qué ocurre? que en algunos casos pues lo de bloquear no siempre es la mejor idea.. En qué casos es mala idea?
- Si bloqueamos algunos bots de Google, nuestro sitio no podrá ser indexado
- Si bloqueamos bots de Meta y tenemos campañas publicitarias asociadas al dominio, las campañas no funcionarán correctamente
- Incluso si bloqueamos algún bot sospechoso que realmente no es maligno.. pues estaremos perdiendo tráfico
Qué podemos hacer entonces?
Pues en vez de bloquear directamente, mitigar/reducir su accesos a nuestras webs. Con esto conseguimos evitar que los bots nos rompan los sitios pero al mismo tiempo le dejamos continuar con su trabajo
Cómo?
Pues en nuestro caso, como estamos usando Nginx, con las directivas Rate-limits de requests. La configuración es bastante sencilla. Básicamente:
- Define las reglas de rate_limits (request por segundo, memoria, etc..)
- Asigna esas reglas a las urls que quieras (o a todo claro)
Ejemplo completo
Vamos a configurar un par de rate limits para un sitio en Nginx.
Primero creamos los rate limits dentro del fichero rate_limits.conf para que sea una config global de Nginx
# ARCHIVO: /etc/nginx/conf.d/rate_limits.conf
# MAPEO PARA (POR EJEMPLO) FILTRAR URLS QUE SEAN DE BUSCAR
map $query_string $is_filter_url {
default ""; # Nada ¿? valor por de
~*"buscar" $binary_remote_addr; # buscar....
}
# DEFINIMOS LOS RATE_LIMITS
# COMANDO VARIABLE NOMBRE:MEMORIA RATE
# Limite global para todos con un máximo de 300 request por minuto y una memoria de IPs de 10m
limit_req_zone $binary_remote_addr zone=global:10m rate=300r/m;
# Limite buscar para todos con un máximo de 100 request por minuto y una memoria de IPs de 10m
limit_req_zone $is_filter_url zone=buscar:10m rate=100r/m;
# EXTRA: definimos los errores como warnign y devolvemos un 429
limit_req_log_level warn;
limit_req_status 429;
Segundo, en nuestro site-config, aplicamos los rate_limits:
server {
.
.
.
.
# PARA TODAS LAS RUTAS
location / {
.
.
.
# Activamos el global con un margen de 50 requests extra y las nuevas, se rechazan (nodelay)
limit_req zone=global burst=50 nodelay;
# Además activamos el buscar con el mismo margen y rechazo
limit_req zone=filters burst=50 nodelay;
.
.
.
}
.
.
.
}
Listo!!! Con esto ya estaría. De esta forma estamos mitigando posibles ataques o bots que se vuelven locos...





