Вопрос или проблема
Минимальный пример
Машины 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:
-
Установите пакет
libnss-mdns
, если он ещё не установлен:sudo apt install libnss-mdns
-
Измените файл
/etc/nsswitch.conf
, чтобы включить поддержку mDNS:hosts: files mdns [NOTFOUND=return] dns
-
Проверьте разрешение mDNS с помощью команды
getent
:getent hosts b.local
2. Использование avahi2dns
Проект avahi2dns может помочь в переадресации запросов DNS на mDNS, что позволит Nginx использовать локальный IP для резолвинга mDNS-имен:
- Установите и настройте avahi2dns для направленных DNS-запросов в mDNS.
- Обновите резолвер в конфигурации Nginx:
resolver 127.0.0.1 valid=30s;
Заключение
Для успешного использования доменных имен mDNS в Nginx необходимо настроить систему так, чтобы DNS-запросы перенаправлялись на mDNS, либо использовать решения для переадресации. Следуя перечисленным шагам, вы сможете добиться желаемой функциональности.
Этот подход, несмотря на его специфичность, может повысить гибкость сетевой инфраструктуры и упростить автоматизацию конфигурации для домашних и офисных сетей.