bot-verifier: Un módulo de verificación de bots de índices de búsqueda para NGINX
Instalación
Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, entre otras:
- RedHat Enterprise Linux 7, 8, 9 y 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 y Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-bot-verifier
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-bot-verifier
Habilita el módulo añadiendo lo siguiente al principio de /etc/nginx/nginx.conf:
load_module modules/ngx_http_bot_verifier_module.so;
Este documento describe nginx-module-bot-verifier v0.0.17 publicado el 06 de febrero de 2026.
Módulo de NGINX para verificar las identidades de bots de motores de búsqueda mediante búsqueda DNS inversa/directa.
Este módulo valida a los actores que afirman ser rastreadores de motores de búsqueda (Google, Bing, Yahoo, Baidu, Yandex) realizando el método de verificación DNS recomendado por cada proveedor de búsqueda. Evita que actores maliciosos eludan las medidas de seguridad suplantando cadenas User-Agent de bots.
Un reemplazo directo del ngx_bot_verifier original de Aaron Bedra.
Características
- Verificación DNS inversa/directa siguiendo las directrices de los proveedores de motores de búsqueda
- Resolución DNS asíncrona usando el resolver integrado de NGINX (no bloqueante)
- Caché en Redis con agrupación de conexiones para minimizar la sobrecarga de las búsquedas DNS
- Proveedores configurables - añade proveedores de bots personalizados más allá de los predeterminados
- Diseño fail-open - los errores de verificación permiten el paso de las solicitudes para evitar bloquear tráfico legítimo
- Soporte de IP real mediante
ngx_http_realip_modulepara despliegues detrás de proxies
Proveedores compatibles
Proveedores integrados
| Proveedor | Dominios verificados |
|---|---|
google.com, googlebot.com |
|
| Bing | search.msn.com |
| Yahoo | yahoo.com |
| Baidu | crawl.baidu.com |
| Yandex | yandex.com, yandex.net, yandex.ru |
Proveedores personalizados
Añade proveedores personalizados usando la directiva bot_verifier_provider:
bot_verifier_provider facebook .facebook.com .fbcdn.net;
bot_verifier_provider apple .applebot.apple.com;
Los proveedores personalizados se verifican además de los proveedores integrados.
Sinopsis
http {
# Required: Configure realip module to trust your upstream proxies
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 192.168.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
# Required: Configure resolver for non-blocking DNS lookups
resolver 8.8.8.8 8.8.4.4 valid=300s ipv6=off;
resolver_timeout 5s;
server {
location / {
bot_verifier on;
bot_verifier_redis_host localhost;
bot_verifier_redis_port 6379;
bot_verifier_redis_expiry 3600;
# Optional: Add custom providers
bot_verifier_provider applebot .applebot.apple.com;
}
}
}
Directivas
bot_verifier
syntax: bot_verifier on|off;
default: off
context: http, server, location
Habilita o deshabilita la verificación de bots. Cuando está habilitada, las solicitudes con cadenas User-Agent que coinciden con patrones de bots conocidos se verifican mediante búsqueda DNS.
bot_verifier_provider
syntax: bot_verifier_provider <name> <domain1> [domain2] ...;
default: none
context: http, server, location
Añade un proveedor de bots personalizado para su verificación. El name se compara con las cadenas User-Agent (sin distinguir mayúsculas y minúsculas). Los dominios se usan para verificar el resultado de la búsqueda DNS inversa.
Ejemplo:
bot_verifier_provider facebook .facebook.com .fbcdn.net;
bot_verifier_provider apple .applebot.apple.com;
bot_verifier_provider duckduckgo .duckduckgo.com;
Los proveedores personalizados se comprueban además de los proveedores integrados (Google, Bing, Yahoo, Baidu, Yandex).
bot_verifier_redis_host
syntax: bot_verifier_redis_host <hostname>;
default: localhost
context: http, server, location
Nombre de host del servidor Redis para almacenar en caché los resultados de verificación.
bot_verifier_redis_port
syntax: bot_verifier_redis_port <port>;
default: 6379
context: http, server, location
Puerto del servidor Redis.
bot_verifier_redis_connection_timeout
syntax: bot_verifier_redis_connection_timeout <milliseconds>;
default: 10
context: http, server, location
Tiempo de espera para establecer conexiones con Redis.
bot_verifier_redis_read_timeout
syntax: bot_verifier_redis_read_timeout <milliseconds>;
default: 10
context: http, server, location
Tiempo de espera para las operaciones de lectura de Redis.
bot_verifier_redis_expiry
syntax: bot_verifier_redis_expiry <seconds>;
default: 3600
context: http, server, location
TTL para los resultados de verificación en caché. Tras su expiración, la siguiente solicitud desde la misma IP desencadena una nueva verificación DNS.
bot_verifier_redis_database
syntax: bot_verifier_redis_database <number>;
default: 0
context: http, server, location
Número de base de datos de Redis que se usará para almacenar los resultados de verificación.
bot_verifier_redis_password
syntax: bot_verifier_redis_password <password>;
default: empty
context: http, server, location
Contraseña para la autenticación con Redis. Déjala vacía si Redis no requiere autenticación.
Resolución DNS asíncrona
Cuando la directiva resolver de NGINX está configurada, el módulo realiza las búsquedas DNS de forma asíncrona usando el resolver integrado de NGINX. Esta es la configuración recomendada para producción:
- No bloqueante - las búsquedas DNS no bloquean los procesos worker de NGINX
- Escalable - maneja tráfico elevado sin picos de latencia inducidos por DNS
- Tiempos de espera controlados - las respuestas DNS lentas no afectan a otras solicitudes
El flujo de verificación:
- Búsqueda DNS inversa (registro PTR) para la IP del cliente
- Verificar que el nombre de host resuelto termina con un dominio de proveedor conocido
- Búsqueda DNS directa (registro A) para confirmar que la IP coincide
- Almacenar el resultado en caché en Redis