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.
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,locationyif - 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
- Las reglas se evalúan en el orden en que aparecen en la configuración
- La primera regla que coincida determina el resultado:
- Coincidencia
rdns_allow: La solicitud es permitida (el procesamiento continúa) - Coincidencia
rdns_deny: La solicitud es denegada con403 Forbidden - 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_allowordns_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
doublesolo 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"
- Verifica que el resolvedor sea accesible desde tu servidor
- Revisa la configuración de tiempo de espera del resolvedor
- 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 - 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.