Aller au contenu

rdns: Module rDNS HTTP de NGINX

Installation

Vous pouvez installer ce module dans n'importe quelle 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.0 publié le 02 février 2026.


Test Build

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

Effectuez des recherches DNS inversées (PTR) asynchrones sur les adresses IP des clients et utilisez 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 double vérification - Vérification DNS avant pour empêcher le spoofing DNS
  • Contrôle d'accès basé sur des regex - Autoriser ou refuser des requêtes en fonction des motifs de nom d'hôte
  • Support complet du contexte - Fonctionne dans les blocs http, server, location et if
  • Mise en cache efficace - Tire parti du cache du résolveur de NGINX (jusqu'à 30 secondes ou TTL DNS)
  • Support des modules dynamiques - Construire comme 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 recherche PTR unique
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 de nouveau 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 double vérification a échoué
- rDNS est désactivé dans ce contexte

Exemples d'utilisation

Vérifier les robots d'exploration 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ôtes 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 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érents emplacements

server {
    resolver 8.8.8.8;

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

    # Zone d'administration - 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ôtes
    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 dans lequel 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 (emplacements) héritent des règles des contextes parents uniquement si 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 : aucun résolveur principal défini
    }
}

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 l'emplacement nommé
    # ...
}

} ```

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 du résolveur aide à réduire les recherches répétées pour la même IP
  • Considérez 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 de nouveau vers l'IP du client
  4. Vérifiez les journaux d'erreur de NGINX pour les erreurs de résolveur

$rdns_hostname est toujours "-"

La directive rdns est soit : - Non 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.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-rdns.