Saltar a contenido

rdns: Módulo rDNS HTTP de NGINX

Instalación

Puedes instalar este módulo en cualquier distribución basada en RHEL, incluyendo, pero no limitado a:

  • 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-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

Habilita el módulo añadiendo lo siguiente en la parte superior de /etc/nginx/nginx.conf:

load_module modules/ngx_http_rdns_module.so;

Este documento describe nginx-module-rdns v1.2.0 lanzado el 02 de febrero de 2026.


Test Build

Módulo de búsqueda inversa de DNS para NGINX con control de acceso basado en nombres de host.

Realiza búsquedas inversas de DNS (PTR) asíncronas en direcciones IP de clientes y utiliza el nombre de host resuelto para decisiones de control de acceso, registro o manejo condicional de solicitudes.

Características

  • Resolución DNS Asíncrona - Búsquedas PTR no bloqueantes utilizando el resolvedor central de NGINX
  • Modo de Doble Verificación - Verificación opcional de DNS hacia adelante para prevenir el spoofing de DNS
  • Control de Acceso Basado en Regex - Permitir o denegar solicitudes basadas en patrones de nombres de host
  • Soporte Completo de Contexto - Funciona en bloques http, server, location y if
  • Caching Eficiente - Aprovecha la caché del resolvedor de NGINX (hasta 30 segundos o TTL de DNS)
  • Soporte para Módulos Dinámicos - Construir como módulo estático o dinámico
  • Soporte para IPv4 e IPv6 - Funciona con ambas familias de direcciones

Inicio Rápido

http {
    # Definir un resolvedor DNS (requerido)
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    server {
        listen 80;

        location / {
            # Habilitar búsqueda inversa de DNS
            rdns on;

            # Permitir solo solicitudes de *.google.com
            rdns_allow \.google\.com$;

            # Denegar solicitudes de actores conocidos como maliciosos
            rdns_deny \.spam\.example\.com$;

            # Usar el nombre de host en tu aplicación
            proxy_set_header X-Client-Hostname $rdns_hostname;
            proxy_pass http://backend;
        }
    }
}

Directivas

rdns

Habilita o deshabilita las búsquedas inversas de DNS.

Sintaxis rdns on | off | double
Por Defecto off
Contexto http, server, location, if
Fase rewrite

Valores:

Valor Descripción
off Deshabilitar búsqueda rDNS. $rdns_hostname será -
on Realizar una búsqueda PTR única
double Realizar búsqueda PTR, luego verificar con búsqueda A/AAAA hacia adelante

El modo doble proporciona protección contra el spoofing de DNS al verificar que el nombre de host resuelto apunta de vuelta a la dirección IP original del cliente. Si la verificación falla, $rdns_hostname se establece en not found.

rdns_allow

Permitir acceso si el nombre de host resuelto coincide con el patrón.

Sintaxis rdns_allow regex
Por Defecto -
Contexto http, server, location
Fase access

El patrón es una expresión regular PCRE sin distinción de mayúsculas y minúsculas.

rdns_deny

Denegar acceso (retornar 403) si el nombre de host resuelto coincide con el patrón.

Sintaxis rdns_deny regex
Por Defecto -
Contexto http, server, location
Fase access

El patrón es una expresión regular PCRE sin distinción de mayúsculas y minúsculas.

Variables

$rdns_hostname

Contiene el resultado de la búsqueda inversa de DNS.

Valor Significado
hostname Nombre de host resuelto con éxito
not found La búsqueda falló, se agotó el tiempo, o la verificación doble falló
- rDNS está deshabilitado en este contexto

Ejemplos de Uso

Verificar Crawlers de Motores de Búsqueda

Asegúrate de que las solicitudes que afirman ser de Googlebot realmente provengan de Google:

location / {
    resolver 8.8.8.8;

    # Solo realizar rDNS para solicitudes que afirman ser Googlebot
    if ($http_user_agent ~* "Googlebot") {
        rdns double;
    }

    # Permitir Googlebot verificado
    rdns_allow \.googlebot\.com$;
    rdns_allow \.google\.com$;

    # Tu configuración normal
    proxy_pass http://backend;
}

Bloquear Solicitudes por Nombre de Host

location / {
    resolver 8.8.8.8;
    rdns on;

    # Bloquear fuentes de spam conocidas
    rdns_deny \.spam\.example\.com$;
    rdns_deny \.malicious\.net$;

    proxy_pass http://backend;
}

Registrar Nombres 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 Basada en el Nombre de Host

location / {
    resolver 8.8.8.8;
    rdns on;

    # Establecer una variable basada en el nombre de host
    set $is_internal "no";
    if ($rdns_hostname ~ \.internal\.company\.com$) {
        set $is_internal "yes";
    }

    # Usar en encabezados de proxy
    proxy_set_header X-Is-Internal $is_internal;
    proxy_set_header X-Client-Hostname $rdns_hostname;
    proxy_pass http://backend;
}

Reglas Diferentes para Diferentes Ubicaciones

server {
    resolver 8.8.8.8;

    # API pública - sin rDNS
    location /api/public {
        proxy_pass http://api-backend;
    }

    # Área de administración - verificación estricta del nombre de host
    location /admin {
        rdns double;
        rdns_allow \.admin\.company\.com$;
        proxy_pass http://admin-backend;
    }

    # Contenido general - registrar nombres de host
    location / {
        rdns on;
        proxy_pass http://web-backend;
    }
}

Comportamiento de Control de Acceso

Evaluación de Reglas

  1. Las reglas se evalúan en el orden en que aparecen en la configuración
  2. La primera regla que coincida determina el resultado:
  3. Coincidencia rdns_allow: La solicitud es permitida (el procesamiento continúa)
  4. Coincidencia rdns_deny: La solicitud es denegada con 403 Forbidden
  5. Si no hay coincidencias, la solicitud es permitida

Herencia de Reglas

  • Los contextos hijos (ubicaciones) heredan reglas de los contextos padres solo si no definen sus propias reglas
  • Una vez que un hijo define cualquier regla rdns_allow o rdns_deny, las reglas del padre no se heredan
server {
    rdns_allow \.trusted\.com$;  # Regla a nivel de servidor

    location /public {
        # Hereda la regla rdns_allow a nivel de servidor
    }

    location /private {
        rdns_deny \.untrusted\.com$;  # Tiene su propia regla
        # NO hereda rdns_allow a nivel de servidor
    }
}

Notas Importantes

Configuración del Resolvedor

Una directiva resolver debe ser definida en el mismo contexto o en un contexto padre al usar rdns on o rdns double. NGINX fallará al iniciar con el error no core resolver defined for rdns si este requisito no se cumple.

# Bueno: resolvedor definido
server {
    resolver 8.8.8.8;
    location / {
        rdns on;  # Funciona
    }
}

# Malo: sin resolvedor
server {
    location / {
        rdns on;  # Error: no core resolver defined
    }
}

Configuración problemática

server { rdns on;

location / {
    error_page 404 = @fallback;
}

location @fallback {
    # ¡Bucle! La búsqueda rDNS reinicia el procesamiento de la solicitud
}

}

Configuración corregida

server { rdns on;

location / {
    error_page 404 = @fallback;
}

location @fallback {
    rdns off;  # Deshabilitar rDNS en la ubicación nombrada
    # ...
}

} ```

Consideraciones de Rendimiento

  • Cada búsqueda rDNS añade latencia al procesamiento de solicitudes
  • Usa habilitación condicional (a través de bloques if) para limitar búsquedas a agentes de usuario o condiciones específicas
  • La caché del resolvedor ayuda a reducir búsquedas repetidas para la misma IP
  • Considera el modo double solo cuando la protección contra spoofing sea necesaria

Solución de Problemas

"no core resolver defined for rdns"

Agrega una directiva resolver en el mismo contexto o en un contexto padre: nginx resolver 8.8.8.8;

$rdns_hostname siempre es "not found"

  1. Verifica que el resolvedor sea accesible desde tu servidor
  2. Revisa la configuración de tiempo de espera del resolvedor
  3. Si usas rdns double, asegúrate de que el nombre de host del registro PTR tenga un registro A/AAAA válido que apunte de vuelta a la IP del cliente
  4. Revisa los registros de errores de NGINX para errores del resolvedor

$rdns_hostname siempre es "-"

La directiva rdns está: - No habilitada en el contexto actual - Establecida en off - Dentro de un bloque if cuya condición es falsa

Respuestas 403 Forbidden

Una regla rdns_deny coincidió con el nombre de host del cliente. Revisa tus patrones de denegación y el nombre de host real que se está resolviendo.

GitHub

Puedes encontrar consejos adicionales de configuración y documentación para este módulo en el repositorio de GitHub para nginx-module-rdns.