[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: https://github.com/flant/nginx-http-rdns
- Домашняя страница модуля (на русском): http://flant.ru/projects/nginx-http-rdns
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-rdns.