Pular para conteúdo

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.


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 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, location e if
  • 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

  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 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 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 é 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 de host 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 é 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.