bot-verifier: Um módulo de verificação de bots de índice de busca para NGINX
Instalação
Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:
- RedHat Enterprise Linux 7, 8, 9 e 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 e 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
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_http_bot_verifier_module.so;
Este documento descreve o nginx-module-bot-verifier v0.0.18 lançado em 27 de outubro de 2026.
Módulo NGINX para verificar identidades de bots de mecanismos de busca via consulta DNS reversa/encaminhada.
Este módulo valida agentes que alegam ser rastreadores de mecanismos de busca (Google, Bing, Yahoo, Baidu, Yandex) executando o método de verificação DNS recomendado por cada provedor de busca. Ele impede que agentes maliciosos contornem medidas de segurança falsificando strings de User-Agent de bots.
Um substituto direto para o ngx_bot_verifier original de Aaron Bedra.
Recursos
- Verificação DNS reversa/encaminhada seguindo as diretrizes dos provedores de mecanismos de busca
- Resolução DNS assíncrona usando o resolver integrado do NGINX (não bloqueante)
- Cache em Redis com pool de conexões para minimizar a sobrecarga de consultas DNS
- Provedores configuráveis - adicione provedores de bots personalizados além dos padrões
- Design fail-open - erros de verificação permitem que as requisições passem para evitar o bloqueio de tráfego legítimo
- Suporte a Real IP via
ngx_http_realip_modulepara implantações atrás de proxies
Provedores Suportados
Provedores Integrados
| Provedor | Domínios Verificados |
|---|---|
google.com, googlebot.com |
|
| Bing | search.msn.com |
| Yahoo | yahoo.com |
| Baidu | crawl.baidu.com |
| Yandex | yandex.com, yandex.net, yandex.ru |
Provedores Personalizados
Adicione provedores personalizados usando a diretiva bot_verifier_provider:
bot_verifier_provider facebookexternalhit fbsv.net;
bot_verifier_provider applebot applebot.apple.com;
Provedores personalizados são verificados além dos provedores integrados.
Sinopse
http {
# Obrigatório: Configure o módulo realip para confiar nos seus proxies upstream
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;
# Obrigatório: Configure o resolver para consultas DNS não bloqueantes
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;
# Opcional: Adicione provedores personalizados
bot_verifier_provider applebot applebot.apple.com;
}
}
}
Diretivas
bot_verifier
sintaxe: bot_verifier on|off;
padrão: off
contexto: http, server, location
Ativa ou desativa a verificação de bots. Quando ativada, requisições com strings de User-Agent que correspondem a padrões de bots conhecidos são verificadas via consulta DNS.
bot_verifier_provider
sintaxe: bot_verifier_provider <name> <domain1> [domain2] ...;
padrão: nenhum
contexto: http, server, location
Adiciona um provedor de bot personalizado para verificação. O name é comparado com strings de User-Agent (sem distinção entre maiúsculas e minúsculas). Os domínios são usados para verificar o resultado da consulta DNS reversa.
Exemplo:
bot_verifier_provider facebookexternalhit fbsv.net;
bot_verifier_provider applebot applebot.apple.com;
Um domínio corresponde ao próprio hostname DNS reverso ou a qualquer subdomínio dele: fbsv.net corresponde a fwdproxy-prn-020.fbsv.net, mas não a evilfbsv.net. Pontos no início e no final são ignorados e a correspondência não diferencia maiúsculas de minúsculas, então .fbsv.net é o mesmo que fbsv.net (antes da 0.0.18, um ponto no início fazia o domínio não corresponder a nada). Um domínio composto apenas por pontos é um erro de configuração.
Prévias de links do Meta e do WhatsApp: O rastreador facebookexternalhit da Meta (prévias do Facebook, Instagram, Messenger) resolve reversamente para fbsv.net, então o exemplo acima cobre isso. As prévias do WhatsApp são buscadas pelo próprio dispositivo do remetente a partir de um IP móvel comum, portanto não podem ser verificadas por DNS. Não adicione um provedor para o User-Agent WhatsApp, ou toda prévia será bloqueada.
Provedores personalizados são verificados além dos provedores integrados (Google, Bing, Yahoo, Baidu, Yandex).
bot_verifier_redis_host
sintaxe: bot_verifier_redis_host <hostname>;
padrão: localhost
contexto: http, server, location
Hostname do servidor Redis para armazenar em cache os resultados de verificação.
bot_verifier_redis_port
sintaxe: bot_verifier_redis_port <port>;
padrão: 6379
contexto: http, server, location
Porta do servidor Redis.
bot_verifier_redis_connection_timeout
sintaxe: bot_verifier_redis_connection_timeout <milliseconds>;
padrão: 10
contexto: http, server, location
Tempo limite para estabelecer conexões com o Redis.
bot_verifier_redis_read_timeout
sintaxe: bot_verifier_redis_read_timeout <milliseconds>;
padrão: 10
contexto: http, server, location
Tempo limite para operações de leitura no Redis.
bot_verifier_redis_expiry
sintaxe: bot_verifier_redis_expiry <seconds>;
padrão: 3600
contexto: http, server, location
TTL para resultados de verificação em cache. Após a expiração, a próxima requisição do mesmo IP dispara uma nova verificação DNS.
bot_verifier_redis_database
sintaxe: bot_verifier_redis_database <number>;
padrão: 0
contexto: http, server, location
Número do banco de dados Redis a ser usado para armazenar os resultados de verificação.
bot_verifier_redis_password
sintaxe: bot_verifier_redis_password <password>;
padrão: vazio
contexto: http, server, location
Senha para autenticação no Redis. Deixe vazio se o Redis não exigir autenticação.
Resolução DNS Assíncrona
Quando a diretiva resolver do NGINX está configurada, o módulo realiza consultas DNS de forma assíncrona usando o resolver integrado do NGINX. Esta é a configuração recomendada para produção:
- Não bloqueante - as consultas DNS não bloqueiam os processos worker do NGINX
- Escalável - lida com alto tráfego sem picos de latência induzidos por DNS
- Timeouts graciosos - respostas DNS lentas não afetam outras requisições
O fluxo de verificação:
- Consulta DNS reversa (registro PTR) para o IP do cliente
- Verifica se o hostname resolvido termina com um domínio de provedor conhecido
- Consulta DNS encaminhada (registro A) para confirmar que o IP corresponde
- Armazena o resultado em cache no Redis
Observador experimental local de Web Bot Auth
Um observador Ed25519 opcional pode relatar a validade de HTTP Message Signature usando um registro de chaves local revisado pelo operador. Ele vem desativado por padrão e não altera a aplicação de DNS/cache existente. Ele não realiza descoberta de chaves pela rede e não fornece autorização nem prevenção de replay. Consulte o perfil suportado delimitado, a configuração e os testes. A adaptação do scaffold de qualidade é intencionalmente qualificada; nenhuma certificação completa de scaffold ou evidência pública verificada é alegada.
Verificação rápida de desenvolvimento hermético: make test-l1 (sem nginx, Redis ou rede).