Перейти к содержанию

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 года.


Test Build

Модуль обратного 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;
    }
}

Поведение контроля доступа

Оценка правил

  1. Правила оцениваются в порядке их появления в конфигурации
  2. Первое совпадающее правило определяет результат:
  3. Совпадение rdns_allow: Запрос разрешен (обработка продолжается)
  4. Совпадение rdns_deny: Запрос отклонен с 403 Forbidden
  5. Если ни одно правило не совпадает, запрос разрешен

Наследование правил

  • Дочерние контексты (местоположения) наследуют правила от родительских контекстов только если они не определяют свои собственные правила
  • Как только дочерний контекст определяет любое правило 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"

  1. Проверьте, что резолвер доступен с вашего сервера
  2. Проверьте настройки времени ожидания резолвера
  3. Если используете rdns double, убедитесь, что у PTR-записи есть действительная A/AAAA-запись, указывающая обратно на IP-адрес клиента
  4. Проверьте журналы ошибок NGINX на наличие ошибок резолвера

$rdns_hostname всегда "-"

Директива rdns либо: - Не включена в текущем контексте - Установлена в off - Находится внутри блока if, условие которого ложно

Ответы 403 Forbidden

Правило rdns_deny совпало с именем хоста клиента. Проверьте ваши шаблоны запрета и фактическое разрешенное имя хоста.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-rdns.