rdns: Módulo rDNS HTTP do 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-rdns
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-rdns
Ative o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:
load_module modules/ngx_http_rdns_module.so;
Este documento descreve o nginx-module-rdns v1.2.0 lançado em 02 de fevereiro de 2026.
Módulo de consulta DNS reversa para NGINX com controle de acesso baseado em nome de host.
Realiza consultas assíncronas de DNS reverso (PTR) em endereços IP de clientes e utiliza o nome de host resolvido para decisões de controle de acesso, registro em log ou tratamento condicional de solicitações.
Recursos
- Resolução DNS Assíncrona - Consultas PTR não bloqueantes usando o resolvedor principal do NGINX
- Modo de Verificação Dupla - Verificação DNS reversa opcional para evitar spoofing de DNS
- Controle de Acesso Baseado em Regex - Permitir ou negar solicitações com base em padrões de nome de host
- Suporte Completo ao Contexto - Funciona em blocos
http,server,locationeif - Cache Eficiente - Aproveita o cache do resolvedor do NGINX (até 30 segundos ou TTL do DNS)
- Suporte a Módulos Dinâmicos - Compilação como módulo estático ou dinâmico
- Suporte a IPv4 e IPv6 - Funciona com ambas as famílias de endereços
Início Rápido
http {
# Defina um resolvedor DNS (obrigatório)
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
server {
listen 80;
location / {
# Ative a consulta DNS reversa
rdns on;
# Permita apenas solicitações de *.google.com
rdns_allow \.google\.com$;
# Negue solicitações de atores conhecidos como maliciosos
rdns_deny \.spam\.example\.com$;
# Use o nome de host em sua aplicação
proxy_set_header X-Client-Hostname $rdns_hostname;
proxy_pass http://backend;
}
}
}
Diretivas
rdns
Habilita ou desabilita consultas DNS reversas.
| Sintaxe | rdns on | off | double |
| Padrão | off |
| Contexto | http, server, location, if |
| Fase | rewrite |
Valores:
| Valor | Descrição |
|---|---|
off |
Desabilita a consulta rDNS. $rdns_hostname será - |
on |
Realiza uma única consulta PTR |
double |
Realiza a consulta PTR e, em seguida, verifica com a consulta A/AAAA |
Modo Duplo fornece proteção contra spoofing de DNS ao verificar se o nome de host resolvido aponta de volta para o endereço IP original do cliente. Se a verificação falhar, $rdns_hostname é definido como not found.
rdns_allow
Permite acesso se o nome de host resolvido corresponder ao padrão.
| Sintaxe | rdns_allow regex |
| Padrão | - |
| Contexto | http, server, location |
| Fase | access |
O padrão é uma expressão regular PCRE sem distinção entre maiúsculas e minúsculas.
rdns_deny
Nega acesso (retorna 403) se o nome de host resolvido corresponder ao padrão.
| Sintaxe | rdns_deny regex |
| Padrão | - |
| Contexto | http, server, location |
| Fase | access |
O padrão é uma expressão regular PCRE sem distinção entre maiúsculas e minúsculas.
Variáveis
$rdns_hostname
Contém o resultado da consulta DNS reversa.
| Valor | Significado |
|---|---|
| hostname | Nome de host resolvido com sucesso |
not found |
Consulta falhou, expirou ou a verificação dupla falhou |
- |
rDNS está desativado neste contexto |
Exemplos de Uso
Verificar Crawlers de Motores de Busca
Assegure-se de que as solicitações que afirmam ser do Googlebot realmente se originam do Google:
location / {
resolver 8.8.8.8;
# Realize rDNS apenas para solicitações que afirmam ser do Googlebot
if ($http_user_agent ~* "Googlebot") {
rdns double;
}
# Permita o Googlebot verificado
rdns_allow \.googlebot\.com$;
rdns_allow \.google\.com$;
# Sua configuração normal
proxy_pass http://backend;
}
Bloquear Solicitações por Nome de Host
location / {
resolver 8.8.8.8;
rdns on;
# Bloquear fontes de spam conhecidas
rdns_deny \.spam\.example\.com$;
rdns_deny \.malicious\.net$;
proxy_pass http://backend;
}
Registrar Nomes de Host de Clientes
http {
resolver 8.8.8.8;
log_format with_hostname '$remote_addr - $rdns_hostname - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
server {
access_log /var/log/nginx/access.log with_hostname;
location / {
rdns on;
proxy_pass http://backend;
}
}
}
Lógica Condicional Baseada em Nome de Host
location / {
resolver 8.8.8.8;
rdns on;
# Defina uma variável com base no nome de host
set $is_internal "no";
if ($rdns_hostname ~ \.internal\.company\.com$) {
set $is_internal "yes";
}
# Use nos cabeçalhos de proxy
proxy_set_header X-Is-Internal $is_internal;
proxy_set_header X-Client-Hostname $rdns_hostname;
proxy_pass http://backend;
}
Regras Diferentes para Diferentes Localizações
server {
resolver 8.8.8.8;
# API Pública - sem rDNS
location /api/public {
proxy_pass http://api-backend;
}
# Área Administrativa - verificação estrita de nome de host
location /admin {
rdns double;
rdns_allow \.admin\.company\.com$;
proxy_pass http://admin-backend;
}
# Conteúdo Geral - registrar nomes de host
location / {
rdns on;
proxy_pass http://web-backend;
}
}
Comportamento de Controle de Acesso
Avaliação de Regras
- As regras são avaliadas na ordem em que aparecem na configuração
- A primeira regra correspondente determina o resultado:
- Correspondência
rdns_allow: Solicitação é permitida (o processamento continua) - Correspondência
rdns_deny: Solicitação é negada com403 Forbidden - Se nenhuma regra corresponder, a solicitação é permitida
Herança de Regras
- Contextos filhos (localizações) herdam regras de contextos pai somente se não definirem suas próprias regras
- Uma vez que um filho define qualquer regra
rdns_allowourdns_deny, as regras do pai não são herdadas
server {
rdns_allow \.trusted\.com$; # Regra em nível de servidor
location /public {
# Herda a regra rdns_allow em nível de servidor
}
location /private {
rdns_deny \.untrusted\.com$; # Tem sua própria regra
# NÃO herda a regra rdns_allow em nível de servidor
}
}
Notas Importantes
Configuração do Resolvedor
Uma diretiva resolver deve ser definida no mesmo contexto ou em um contexto pai ao usar rdns on ou rdns double. O NGINX falhará ao iniciar com o erro no core resolver defined for rdns se esse requisito não for atendido.
# Bom: resolvedor definido
server {
resolver 8.8.8.8;
location / {
rdns on; # Funciona
}
}
# Ruim: sem resolvedor
server {
location / {
rdns on; # Erro: no core resolver defined
}
}
Configuração problemática
server { rdns on;
location / {
error_page 404 = @fallback;
}
location @fallback {
# Loop! A consulta rDNS reinicia o processamento da solicitação
}
}
Configuração corrigida
server { rdns on;
location / {
error_page 404 = @fallback;
}
location @fallback {
rdns off; # Desabilitar rDNS na localização nomeada
# ...
}
} ```
Considerações de Desempenho
- Cada consulta rDNS adiciona latência ao processamento da solicitação
- Use habilitação condicional (via blocos
if) para limitar consultas a agentes de usuário ou condições específicas - O cache do resolvedor ajuda a reduzir consultas repetidas para o mesmo IP
- Considere o modo
doubleapenas quando a proteção contra spoofing for necessária
Solução de Problemas
"no core resolver defined for rdns"
Adicione uma diretiva resolver no mesmo ou no contexto pai:
nginx
resolver 8.8.8.8;
$rdns_hostname é sempre "not found"
- Verifique se o resolvedor é acessível a partir do seu servidor
- Verifique as configurações de tempo limite do resolvedor
- Se estiver usando
rdns double, certifique-se de que o nome de host do registro PTR tenha um registro A/AAAA válido apontando de volta para o IP do cliente - Verifique os logs de erro do NGINX para erros do resolvedor
$rdns_hostname é sempre "-"
A diretiva rdns está:
- Não habilitada no contexto atual
- Definida como off
- Dentro de um bloco if cuja condição é falsa
Respostas 403 Forbidden
Uma regra rdns_deny correspondeu ao nome de host do cliente. Verifique seus padrões de negação e o nome de host real que está sendo resolvido.
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-rdns.