Aller au contenu

rdns: Module rDNS HTTP de NGINX

Nécessite le plan Pro (ou supérieur) de l'abonnement GetPageSpeed NGINX Extras.

Installation

Vous pouvez installer ce module dans toute distribution basée sur RHEL, y compris, mais sans s'y limiter :

  • RedHat Enterprise Linux 7, 8, 9 et 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 et 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

Activez le module en ajoutant ce qui suit en haut de /etc/nginx/nginx.conf :

load_module modules/ngx_http_rdns_module.so;

Ce document décrit nginx-module-rdns v1.2.1 publié le 08 mai 2026.


Test Build

Module de recherche DNS inversée pour NGINX avec contrôle d'accès basé sur le nom d'hôte.

Effectue des recherches DNS inversées (PTR) asynchrones sur les adresses IP des clients et utilise le nom d'hôte résolu pour les décisions de contrôle d'accès, la journalisation ou le traitement conditionnel des requêtes.

Fonctionnalités

  • Résolution DNS Asynchrone - Recherches PTR non-bloquantes utilisant le résolveur principal de NGINX
  • Mode de Vérification Double - Vérification DNS avant pour prévenir le spoofing DNS
  • Contrôle d'Accès Basé sur Regex - Autoriser ou refuser des requêtes en fonction des motifs de nom d'hôte
  • Support de Contexte Complet - Fonctionne dans les blocs http, server, location et if
  • Mise en Cache Efficace - Tire parti du cache de résolveur de NGINX (jusqu'à 30 secondes ou TTL DNS)
  • Support de Module Dynamique - Construire en tant que module statique ou dynamique
  • Support IPv4 et IPv6 - Fonctionne avec les deux familles d'adresses

Démarrage Rapide

http {
    # Définir un résolveur DNS (requis)
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    server {
        listen 80;

        location / {
            # Activer la recherche DNS inversée
            rdns on;

            # Autoriser uniquement les requêtes de *.google.com
            rdns_allow \.google\.com$;

            # Refuser les requêtes de mauvais acteurs connus
            rdns_deny \.spam\.example\.com$;

            # Utiliser le nom d'hôte dans votre application
            proxy_set_header X-Client-Hostname $rdns_hostname;
            proxy_pass http://backend;
        }
    }
}

Directives

rdns

Active ou désactive les recherches DNS inversées.

Syntaxe rdns on | off | double
Par défaut off
Contexte http, server, location, if
Phase rewrite

Valeurs :

Valeur Description
off Désactiver la recherche rDNS. $rdns_hostname sera -
on Effectuer une seule recherche PTR
double Effectuer une recherche PTR, puis vérifier avec une recherche A/AAAA

Le mode double offre une protection contre le spoofing DNS en vérifiant que le nom d'hôte résolu pointe vers l'adresse IP d'origine du client. Si la vérification échoue, $rdns_hostname est défini sur not found.

rdns_allow

Autoriser l'accès si le nom d'hôte résolu correspond au motif.

Syntaxe rdns_allow regex
Par défaut -
Contexte http, server, location
Phase access

Le motif est une expression régulière PCRE insensible à la casse.

rdns_deny

Refuser l'accès (retourner 403) si le nom d'hôte résolu correspond au motif.

Syntaxe rdns_deny regex
Par défaut -
Contexte http, server, location
Phase access

Le motif est une expression régulière PCRE insensible à la casse.

Variables

$rdns_hostname

Contient le résultat de la recherche DNS inversée.

Valeur Signification
hostname Nom d'hôte résolu avec succès
not found La recherche a échoué, a expiré ou la vérification double a échoué
- rDNS est désactivé dans ce contexte

Exemples d'Utilisation

Vérifier les Robots des Moteurs de Recherche

Assurez-vous que les requêtes prétendant provenir de Googlebot proviennent réellement de Google :

location / {
    resolver 8.8.8.8;

    # Effectuer rDNS uniquement pour les requêtes prétendant être Googlebot
    if ($http_user_agent ~* "Googlebot") {
        rdns double;
    }

    # Autoriser Googlebot vérifié
    rdns_allow \.googlebot\.com$;
    rdns_allow \.google\.com$;

    # Votre configuration normale
    proxy_pass http://backend;
}

Bloquer les Requêtes par Nom d'Hôte

location / {
    resolver 8.8.8.8;
    rdns on;

    # Bloquer les sources de spam connues
    rdns_deny \.spam\.example\.com$;
    rdns_deny \.malicious\.net$;

    proxy_pass http://backend;
}

Journaliser les Noms d'Hôte des Clients

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;
        }
    }
}

Logique Conditionnelle Basée sur le Nom d'Hôte

location / {
    resolver 8.8.8.8;
    rdns on;

    # Définir une variable en fonction du nom d'hôte
    set $is_internal "no";
    if ($rdns_hostname ~ \.internal\.company\.com$) {
        set $is_internal "yes";
    }

    # Utiliser dans les en-têtes de proxy
    proxy_set_header X-Is-Internal $is_internal;
    proxy_set_header X-Client-Hostname $rdns_hostname;
    proxy_pass http://backend;
}

Règles Différentes pour Différentes Localisations

server {
    resolver 8.8.8.8;

    # API publique - pas de rDNS
    location /api/public {
        proxy_pass http://api-backend;
    }

    # Zone admin - vérification stricte du nom d'hôte
    location /admin {
        rdns double;
        rdns_allow \.admin\.company\.com$;
        proxy_pass http://admin-backend;
    }

    # Contenu général - journaliser les noms d'hôte
    location / {
        rdns on;
        proxy_pass http://web-backend;
    }
}

Comportement de Contrôle d'Accès

Évaluation des Règles

  1. Les règles sont évaluées dans l'ordre où elles apparaissent dans la configuration
  2. La première règle correspondante détermine le résultat :
  3. Correspondance rdns_allow : La requête est autorisée (le traitement continue)
  4. Correspondance rdns_deny : La requête est refusée avec 403 Forbidden
  5. Si aucune règle ne correspond, la requête est autorisée

Héritage des Règles

  • Les contextes enfants (localisations) héritent des règles des contextes parents uniquement s'ils ne définissent pas leurs propres règles
  • Une fois qu'un enfant définit une règle rdns_allow ou rdns_deny, les règles parentales ne sont pas héritées
server {
    rdns_allow \.trusted\.com$;  # Règle au niveau du serveur

    location /public {
        # Hérite de la règle rdns_allow au niveau du serveur
    }

    location /private {
        rdns_deny \.untrusted\.com$;  # A sa propre règle
        # N'hérite PAS de rdns_allow au niveau du serveur
    }
}

Remarques Importantes

Configuration du Résolveur

Une directive resolver doit être définie dans le même contexte ou un contexte parent lors de l'utilisation de rdns on ou rdns double. NGINX échouera à démarrer avec l'erreur no core resolver defined for rdns si cette exigence n'est pas respectée.

# Bon : résolveur défini
server {
    resolver 8.8.8.8;
    location / {
        rdns on;  # Fonctionne
    }
}

# Mauvais : pas de résolveur
server {
    location / {
        rdns on;  # Erreur : no core resolver defined
    }
}

Configuration Problématique

server { rdns on;

location / {
    error_page 404 = @fallback;
}

location @fallback {
    # Boucle ! La recherche rDNS redémarre le traitement de la requête
}

}

Configuration Corrigée

server { rdns on;

location / {
    error_page 404 = @fallback;
}

location @fallback {
    rdns off;  # Désactiver rDNS dans la localisation nommée
    # ...
}

} ```

Considérations de Performance

  • Chaque recherche rDNS ajoute de la latence au traitement des requêtes
  • Utilisez l'activation conditionnelle (via des blocs if) pour limiter les recherches à des agents utilisateurs ou conditions spécifiques
  • Le cache de résolveur aide à réduire les recherches répétées pour la même IP
  • Envisagez le mode double uniquement lorsque la protection contre le spoofing est nécessaire

Dépannage

"no core resolver defined for rdns"

Ajoutez une directive resolver dans le même contexte ou un contexte parent : nginx resolver 8.8.8.8;

$rdns_hostname est toujours "not found"

  1. Vérifiez que le résolveur est accessible depuis votre serveur
  2. Vérifiez les paramètres de délai d'expiration du résolveur
  3. Si vous utilisez rdns double, assurez-vous que le nom d'hôte de l'enregistrement PTR a un enregistrement A/AAAA valide pointant vers l'adresse IP du client
  4. Vérifiez les journaux d'erreurs de NGINX pour les erreurs de résolveur

$rdns_hostname est toujours "-"

La directive rdns est soit : - Pas activée dans le contexte actuel - Définie sur off - À l'intérieur d'un bloc if dont la condition est fausse

Réponses 403 Forbidden

Une règle rdns_deny a correspondu au nom d'hôte du client. Vérifiez vos motifs de refus et le nom d'hôte réel étant résolu.