Pular para conteúdo

rdns: Módulo rDNS HTTP do NGINX

Requer o plano Pro (ou superior) da assinatura GetPageSpeed NGINX Extras.

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 nginx-module-rdns v1.2.1 lançado em 08 de maio de 2026.


Test Build

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 usa o nome de host resolvido para decisões de controle de acesso, registro ou manipulação condicional de solicitações.

Recursos

  • Resolução de DNS Assíncrona - Consultas PTR não bloqueantes usando o resolvedor principal do NGINX
  • Modo de Verificação Dupla - Verificação de DNS para frente opcional para prevenir 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, location e if
  • Cache Eficiente - Aproveita o cache do resolvedor do NGINX (até 30 segundos ou TTL de DNS)
  • Suporte a Módulos Dinâmicos - Compilar 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
            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

Ativa ou desativa consultas de DNS reverso.

Sintaxe rdns on | off | double
Padrão off
Contexto http, server, location, if
Fase rewrite

Valores:

Valor Descrição
off Desativa 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 para frente

Modo duplo fornece proteção contra spoofing de DNS, verificando 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 de DNS reverso.

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

Certifique-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 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 do 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

  1. As regras são avaliadas na ordem em que aparecem na configuração
  2. A primeira regra correspondente determina o resultado:
  3. Correspondência rdns_allow: Solicitação é permitida (o processamento continua)
  4. Correspondência rdns_deny: Solicitação é negada com 403 Forbidden
  5. 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_allow ou rdns_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 este 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;  # Desative 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 double apenas 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 está sempre "not found"

  1. Verifique se o resolvedor é acessível a partir do seu servidor
  2. Verifique as configurações de tempo limite do resolvedor
  3. Se estiver usando rdns double, certifique-se de que o nome do registro PTR tenha um registro A/AAAA válido apontando de volta para o IP do cliente
  4. Verifique os logs de erro do NGINX para erros do resolvedor

$rdns_hostname está sempre "-"

A diretiva rdns está: - Não ativada 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 sendo resolvido.