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.
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,locationetif - 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
- Les règles sont évaluées dans l'ordre dans lequel elles apparaissent dans la configuration
- La première règle correspondante détermine le résultat :
- Correspondance
rdns_allow: La requête est autorisée (le traitement continue) - Correspondance
rdns_deny: La requête est refusée avec403 Forbidden - 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_allowourdns_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
doubleuniquement 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"
- Vérifiez que le résolveur est accessible depuis votre serveur
- Vérifiez les paramètres de délai d'expiration du résolveur
- 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 - 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.