Nginx — невозможно использовать доменное имя mDNS в upstream сервере

Вопрос или проблема

Минимальный пример

Машины A и B, где B использует mDNS с доменным именем b.local и настроенная служба ssh на порту 2222. A и B не включают firewall.

В файле nginx.conf машины A:

stream {
    upstream b-ssh {
        server  b.local:2222;
    }
    server {
        listen      2222;
        listen      [::]:2222;
        proxy_pass  b-ssh;
    }
}

При использовании nginx -t для тестирования этой конфигурации на машине A произошла ошибка:

[emerg] host not found in upstream "b.local:2222"

Однако на машине A команда ssh -p 2222 b.local работает нормально (-4 или -6 также протестированы)

Возможно полезная информация

В моем реальном примере, машина A – это Windows 11, на которой отключены все firewalls; машина B – это Ubuntu 21.10 на WSL2 внутри машины A, которая использует службу mDNS avahi-daemon.

В файле nginx.conf машины A я также настроил HTTP proxy pass:

http {
    server {
        listen  8929;
        listen  [::]:8929;
        location / {
            proxy_pass  http://b.local:8929;
        }
    }
}

и это работает хорошо, даже при использовании доменного имени mDNS.

Если я заменю доменное имя mDNS на его реальный IP в upstream server, SSH proxy работает.

Установите libnss-mdns и убедитесь, что есть запись для mdns в /etc/nsswitch.conf:

hosts:          files mdns [NOTFOUND=return] dns

Вы можете протестировать разрешение mdns с помощью getent:

getent hosts b

При попытке решения аналогичной проблемы – нашел отличный пакет – https://github.com/LouisBrunner/avahi2dns

Он перенаправляет DNS-запросы в mDNS. И затем вы можете обновить resolver в конфигурации nginx для использования 127.0.0.1 и установить TTL на 30 секунд.

Проверено на контейнере Debian LXC с настройкой nginx proxy manager

Ответ или решение

Вопрос, связанный с использованием доменного имени mDNS в конфигурации Nginx для upstream-сервера, может вызвать определенные трудности. Рассмотрим эту проблему более детально и предложим решения.

Проблема

Вы пытаетесь настроить Nginx на машине A для использования mDNS-имени b.local в качестве upstream-сервера, который должен перенаправлять трафик на машину B с использованием SSH на порту 2222. Однако при проверке конфигурации с помощью команды nginx -t вы получаете ошибку: [emerg] host not found in upstream "b.local:2222". При этом, соединение по ssh напрямую с использованием команды ssh -p 2222 b.local работает корректно, что указывает на правильное разрешение mDNS в операционной системе.

Причины

Основная проблема заключается в том, что Nginx не использует системные методы разрешения доменных имен, такие как mDNS, по умолчанию. Это приводит к невозможности Nginx резолвить mDNS-имена.

Возможные решения

1. Использование libnss-mdns

Убедитесь, что у вас установлены все необходимые компоненты для mDNS:

  1. Установите пакет libnss-mdns, если он ещё не установлен:

    sudo apt install libnss-mdns
  2. Измените файл /etc/nsswitch.conf, чтобы включить поддержку mDNS:

    hosts:          files mdns [NOTFOUND=return] dns
  3. Проверьте разрешение mDNS с помощью команды getent:

    getent hosts b.local

2. Использование avahi2dns

Проект avahi2dns может помочь в переадресации запросов DNS на mDNS, что позволит Nginx использовать локальный IP для резолвинга mDNS-имен:

  1. Установите и настройте avahi2dns для направленных DNS-запросов в mDNS.
  2. Обновите резолвер в конфигурации Nginx:
    resolver 127.0.0.1 valid=30s;

Заключение

Для успешного использования доменных имен mDNS в Nginx необходимо настроить систему так, чтобы DNS-запросы перенаправлялись на mDNS, либо использовать решения для переадресации. Следуя перечисленным шагам, вы сможете добиться желаемой функциональности.

Этот подход, несмотря на его специфичность, может повысить гибкость сетевой инфраструктуры и упростить автоматизацию конфигурации для домашних и офисных сетей.

Оцените материал
Добавить комментарий

Капча загружается...