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

[BETA!] rdns: NGINX HTTP rDNS модуль

Установка

Вы можете установить этот модуль в любом дистрибутиве на базе 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 v0, выпущенный 8 июня 2020 года.

Стабильность в производственной среде не гарантируется.


Резюме

Этот модуль позволяет выполнять обратный DNS (rDNS) запрос для входящего соединения и предоставляет простой контроль доступа к входящему имени хоста с помощью правил разрешения/запрета (аналогично директивам allow/deny модуля HttpAccessModule; поддерживаются регулярные выражения). Модуль работает с DNS-сервером, определенным стандартной директивой resolver. Этот модуль использует кэш резолвера ядра nginx при разрешении DNS-запроса, максимум на 30 секунд или TTL ответа DNS.

Пример

location / {
    resolver 127.0.0.1;

    rdns_deny badone\.example\.com;

    if ($http_user_agent ~* FooAgent) {
        rdns on;
    }

    if ($rdns_hostname ~* (foo\.example\.com)) {
        set $myvar foo;
    }

    #...
}

В приведенном выше примере nginx будет выполнять обратный DNS-запрос (через DNS-сервер 127.0.0.1) для каждого запроса с пользовательским агентом "FooAgent". Запросы от badone.example.com будут запрещены. Переменная $rdns_hostname будет содержать результат rDNS-запроса или "not found" (в случае, если он не найден или произошла ошибка) для любых запросов, сделанных FooAgent. Для других пользовательских агентов переменная $rdns_hostname будет иметь специальное значение "-".

Директивы

rdns

  • Синтаксис: rdns on | off | double
  • Значение по умолчанию: -
  • Контекст: http, server, location, if-in-server, if-in-location
  • Фаза: rewrite
  • Переменные: rdns_hostname

Включает/выключает rDNS-запросы.

  • on - включить rDNS-запрос в этом контексте.
  • double - включить двойной DNS-запрос в этом контексте. Если обратный запрос (rDNS) удался, модуль выполняет прямой запрос (DNS) для его результата. Если этот прямой запрос не удался или ни один из IP-адресов прямого запроса не совпал с оригинальным адресом, $rdns_hostname устанавливается в "not found".
  • off - отключить rDNS-запрос в этом контексте.

Переменная $rdns_hostname может иметь:

  • результат запроса;
  • специальное значение "not found", если не найдено или произошла ошибка во время запроса;
  • специальное значение "-", если запрос отключен.

После выполнения запроса модуль перезапускает конвейер обработки запросов, чтобы сделать новое значение переменной $rdns_hostname видимым для других директив.

Замечание по "if" в сервере/локации:

Внутренне, в "if" сервера или локации, модуль работает через коды модуля rewrite. Когда любая директива включения (rdns on|double) выполняется в первый раз, она включает DNS-запрос и делает прерывание (чтобы предотвратить выполнение дальнейших директив в этом "if"). После завершения запроса директивы в "if", использующие коды модуля rewrite, выполняются во второй раз без каких-либо прерываний. Отключающая директива (rdns off) не вызывает прерываний.

Ядро модуля резолвера должно быть определено для использования этой директивы.

rdns_allow

  • Синтаксис: rdns_allow regex
  • Значение по умолчанию: -
  • Контекст: http, server, location
  • Фаза: access
  • Переменные: -

Предоставляет доступ для домена, соответствующего регулярному выражению.

rdns_deny

  • Синтаксис: rdns_deny regex
  • Значение по умолчанию: -
  • Контекст: http, server, location
  • Фаза: access
  • Переменные: -

Запрещает доступ для домена, соответствующего регулярному выражению.

Замечание по спискам доступа

Директивы rdns_allow и rdns_deny определяют новый список доступа для контекста, в котором они используются.

Наследование списков доступа в контекстах работает только если дочерний контекст не определяет собственные правила.

Предупреждение о именованных локациях

Выполнение rDNS-запросов в именованных локациях не поддерживается и может вызвать зацикливание. Например:

server {
    rdns on;

    location / {
        echo_exec @foo;
    }

    location @foo {
        #...
    }
}

Находясь в именованной локации и перезапуская конвейер обработки запросов, nginx продолжает обработку запроса в обычной (неименованной) локации. Вот почему этот пример вызовет зацикливание, если вы не отключите модуль в вашей именованной локации. Правильная конфигурация для этого примера должна выглядеть следующим образом:

server {
    rdns on;

    location / {
        echo_exec @foo;
    }

    location @foo {
        rdns off;
        #...
    }
}

Ссылки

GitHub

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