rdns: Модуль rDNS для NGINX HTTP
Установка на Debian/Ubuntu
Эти документы относятся к пакету APT nginx-module-rdns, предоставляемому репозиторием GetPageSpeed Extras.
- Настройте APT-репозиторий, как описано в настройке APT-репозитория.
- Установите модуль:
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