rdns: Модуль rDNS для NGINX
Установка
Вы можете установить этот модуль в любой дистрибутив на базе RHEL, включая, но не ограничиваясь:
- RedHat Enterprise Linux 7, 8, 9 и 10
- CentOS 7, 8, 9
- AlmaLinux 8, 9
- Rocky Linux 8, 9
- Amazon Linux 2 и 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
Включите модуль, добавив следующее в начало /etc/nginx/nginx.conf:
load_module modules/ngx_http_rdns_module.so;
Этот документ описывает nginx-module-rdns v1.2.0, выпущенный 2 февраля 2026 года.
Модуль обратного DNS для NGINX с контролем доступа на основе имени хоста.
Выполняйте асинхронные обратные DNS (PTR) запросы по IP-адресам клиентов и используйте разрешенное имя хоста для принятия решений о контроле доступа, ведения журналов или условной обработки запросов.
Особенности
- Асинхронное разрешение DNS - Неблокирующие PTR-запросы с использованием основного резолвера NGINX
- Режим двойной проверки - Опциональная проверка обратного DNS для предотвращения подделки DNS
- Контроль доступа на основе регулярных выражений - Разрешать или запрещать запросы на основе шаблонов имен хостов
- Полная поддержка контекста - Работает в блоках
http,server,locationиif - Эффективное кэширование - Использует кэш резолвера NGINX (до 30 секунд или TTL DNS)
- Поддержка динамических модулей - Собирается как статический или динамический модуль
- Поддержка IPv4 и IPv6 - Работает с обеими семействами адресов
Быстрый старт
http {
# Определите резолвер DNS (обязательно)
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
server {
listen 80;
location / {
# Включите обратный DNS-запрос
rdns on;
# Разрешить только запросы от *.google.com
rdns_allow \.google\.com$;
# Запретить запросы от известных плохих актеров
rdns_deny \.spam\.example\.com$;
# Используйте имя хоста в вашем приложении
proxy_set_header X-Client-Hostname $rdns_hostname;
proxy_pass http://backend;
}
}
}
Директивы
rdns
Включает или отключает обратные DNS-запросы.
| Синтаксис | rdns on | off | double |
| По умолчанию | off |
| Контекст | http, server, location, if |
| Фаза | rewrite |
Значения:
| Значение | Описание |
|---|---|
off |
Отключить rDNS-запрос. $rdns_hostname будет - |
on |
Выполнить одиночный PTR-запрос |
double |
Выполнить PTR-запрос, затем проверить с помощью прямого A/AAAA-запроса |
Режим двойной проверки обеспечивает защиту от подделки DNS, проверяя, что разрешенное имя хоста указывает обратно на оригинальный IP-адрес клиента. Если проверка не удалась, $rdns_hostname устанавливается в not found.
rdns_allow
Разрешить доступ, если разрешенное имя хоста соответствует шаблону.
| Синтаксис | rdns_allow regex |
| По умолчанию | - |
| Контекст | http, server, location |
| Фаза | access |
Шаблон является нечувствительным к регистру регулярным выражением PCRE.
rdns_deny
Запретить доступ (вернуть 403), если разрешенное имя хоста соответствует шаблону.
| Синтаксис | rdns_deny regex |
| По умолчанию | - |
| Контекст | http, server, location |
| Фаза | access |
Шаблон является нечувствительным к регистру регулярным выражением PCRE.
Переменные
$rdns_hostname
Содержит результат обратного DNS-запроса.
| Значение | Значение |
|---|---|
| hostname | Успешно разрешенное имя хоста |
not found |
Запрос не удался, время ожидания истекло или двойная проверка не удалась |
- |
rDNS отключен в этом контексте |
Примеры использования
Проверка поисковых систем
Убедитесь, что запросы, утверждающие, что они от Googlebot, действительно происходят от Google:
location / {
resolver 8.8.8.8;
# Выполняйте rDNS только для запросов, утверждающих, что они от Googlebot
if ($http_user_agent ~* "Googlebot") {
rdns double;
}
# Разрешить проверенный Googlebot
rdns_allow \.googlebot\.com$;
rdns_allow \.google\.com$;
# Ваша обычная конфигурация
proxy_pass http://backend;
}
Блокировка запросов по имени хоста
location / {
resolver 8.8.8.8;
rdns on;
# Блокировать известные источники спама
rdns_deny \.spam\.example\.com$;
rdns_deny \.malicious\.net$;
proxy_pass http://backend;
}
Ведение журнала имен хостов клиентов
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;
}
}
}
Условная логика на основе имени хоста
location / {
resolver 8.8.8.8;
rdns on;
# Установите переменную на основе имени хоста
set $is_internal "no";
if ($rdns_hostname ~ \.internal\.company\.com$) {
set $is_internal "yes";
}
# Используйте в заголовках прокси
proxy_set_header X-Is-Internal $is_internal;
proxy_set_header X-Client-Hostname $rdns_hostname;
proxy_pass http://backend;
}
Разные правила для разных местоположений
server {
resolver 8.8.8.8;
# Публичный API - без rDNS
location /api/public {
proxy_pass http://api-backend;
}
# Административная зона - строгая проверка имени хоста
location /admin {
rdns double;
rdns_allow \.admin\.company\.com$;
proxy_pass http://admin-backend;
}
# Общий контент - ведение журнала имен хостов
location / {
rdns on;
proxy_pass http://web-backend;
}
}
Поведение контроля доступа
Оценка правил
- Правила оцениваются в порядке их появления в конфигурации
- Первое совпадающее правило определяет результат:
- Совпадение
rdns_allow: Запрос разрешен (обработка продолжается) - Совпадение
rdns_deny: Запрос отклонен с403 Forbidden - Если ни одно правило не совпадает, запрос разрешен
Наследование правил
- Дочерние контексты (местоположения) наследуют правила от родительских контекстов только если они не определяют свои собственные правила
- Как только дочерний контекст определяет любое правило
rdns_allowилиrdns_deny, родительские правила не наследуются
server {
rdns_allow \.trusted\.com$; # Правило на уровне сервера
location /public {
# Унаследует правило rdns_allow на уровне сервера
}
location /private {
rdns_deny \.untrusted\.com$; # Имеет собственное правило
# НЕ наследует правило rdns_allow на уровне сервера
}
}
Важные заметки
Конфигурация резолвера
Директива resolver должна быть определена в том же контексте или родительском контексте при использовании rdns on или rdns double. NGINX не сможет запуститься с ошибкой no core resolver defined for rdns, если это требование не выполнено.
## Хорошо: резолвер определен
server {
resolver 8.8.8.8;
location / {
rdns on; # Работает
}
}
## Плохо: нет резолвера
server {
location / {
rdns on; # Ошибка: no core resolver defined
}
}
Проблемная конфигурация
server { rdns on;
location / {
error_page 404 = @fallback;
}
location @fallback {
# Цикл! Обратный DNS-запрос перезапускает обработку запроса
}
}
Исправленная конфигурация
server { rdns on;
location / {
error_page 404 = @fallback;
}
location @fallback {
rdns off; # Отключить rDNS в именованном местоположении
# ...
}
} ```
Соображения по производительности
- Каждый rDNS-запрос добавляет задержку к обработке запроса
- Используйте условное включение (через блоки
if), чтобы ограничить запросы для определенных пользовательских агентов или условий - Кэш резолвера помогает уменьшить количество повторных запросов для одного и того же IP
- Рассматривайте режим
doubleтолько тогда, когда защита от подделки необходима
Устранение неполадок
"no core resolver defined for rdns"
Добавьте директиву resolver в том же или родительском контексте:
nginx
resolver 8.8.8.8;
$rdns_hostname всегда "not found"
- Проверьте, что резолвер доступен с вашего сервера
- Проверьте настройки времени ожидания резолвера
- Если используете
rdns double, убедитесь, что у PTR-записи есть действительная A/AAAA-запись, указывающая обратно на IP-адрес клиента - Проверьте журналы ошибок NGINX на наличие ошибок резолвера
$rdns_hostname всегда "-"
Директива rdns либо:
- Не включена в текущем контексте
- Установлена в off
- Находится внутри блока if, условие которого ложно
Ответы 403 Forbidden
Правило rdns_deny совпало с именем хоста клиента. Проверьте ваши шаблоны запрета и фактическое разрешенное имя хоста.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-rdns.