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

rdns: Модуль rDNS для NGINX HTTP

Установка на Debian/Ubuntu

Эти документы относятся к пакету APT nginx-module-rdns, предоставляемому репозиторием GetPageSpeed Extras.

  1. Настройте APT-репозиторий, как описано в настройке APT-репозитория.
  2. Установите модуль:
sudo apt-get update
sudo apt-get install nginx-module-rdns
Показать наборы и архитектуры
| Дистрибутив | Набор            | Компонент   | Архитектуры   |
|-------------|------------------|-------------|----------------|
| debian      | bookworm         | main        | amd64, arm64   |
| debian      | bookworm-mainline| main        | amd64, arm64   |
| debian      | trixie           | main        | amd64, arm64   |
| debian      | trixie-mainline  | main        | amd64, arm64   |
| ubuntu      | focal            | main        | amd64, arm64   |
| ubuntu      | focal-mainline   | main        | amd64, arm64   |
| ubuntu      | jammy            | main        | amd64, arm64   |
| ubuntu      | jammy-mainline   | main        | amd64, arm64   |
| ubuntu      | noble            | main        | amd64, arm64   |
| ubuntu      | noble-mainline   | main        | amd64, arm64   |

Резюме

Этот модуль позволяет выполнять обратный DNS (rDNS) поиск для входящих соединений и предоставляет простой контроль доступа к входящему имени хоста с помощью правил разрешения/запрета (аналогично директивам allow/deny модуля HttpAccess; поддерживаются регулярные выражения). Модуль работает с DNS-сервером, определенным стандартной директивой разрешения. Модуль использует кеш разрешателя ядра 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 или "не найдено" (в случае, если он не найден или произошла ошибка) для любого запроса, сделанного FooAgent. Для других агентов пользователя значение $rdns_hostname будет специальным значением "-".

Директивы

rdns

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

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

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

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

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

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

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

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

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

rdns_allow

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

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

rdns_deny

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

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

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

Директивы 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: https://github.com/flant/nginx-http-rdns
  • Домашняя страница модуля (на русском): http://flant.ru/projects/nginx-http-rdns