Saltar a contenido

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_module para despliegues detrás de proxies

Proveedores compatibles

Proveedores integrados

Proveedor Dominios verificados
Google 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:

  1. Búsqueda DNS inversa (registro PTR) para la IP del cliente
  2. Verificar que el nombre de host resuelto termina con un dominio de proveedor conocido
  3. Búsqueda DNS directa (registro A) para confirmar que la IP coincide
  4. Almacenar el resultado en caché en Redis