Вопрос или проблема
У меня есть приложение, которое использует сервер mDNS на устройстве ESP32. Его имя хоста esp32-mdns.local
. Я могу пинговать это имя хоста с Windows. Однако это невозможно сделать с моего компьютера на Ubuntu 22.04.
Я переустановил демон avahi и утилиты. Когда я выполняю avahi-browse --all
:
avahi-browse -all
+ wlp0s20f3 IPv6 192-168-178-1 Microsoft Windows Network local
+ wlp0s20f3 IPv6 fritz-box Microsoft Windows Network local
+ wlp0s20f3 IPv4 192-168-178-1 Microsoft Windows Network local
+ wlp0s20f3 IPv4 fritz-box Microsoft Windows Network local
+ wlp0s20f3 IPv6 ESP32-WebServer1 Web Site local
+ wlp0s20f3 IPv6 ESP32-WebServer Web Site local
+ wlp0s20f3 IPv4 ESP32-WebServer1 Web Site local
+ wlp0s20f3 IPv4 ESP32-WebServer Web Site local
Затем avahi-resolve --name esp32-mdns.local
:
avahi-resolve --name esp32-mdns.local
esp32-mdns.local 192.168.178.71
Итак, имя разрешается, но когда я пингую его:
ping esp32-mdns.local
ping: esp32-mdns.local: Имя или служба не известны
Я могу пинговать IP-адрес напрямую, но не имя хоста.
Вот мой файл /etc/avahi/avahi-daemon.conf
. Не хватает чего-то? Или в чем может быть проблема? Спасибо.
# avahi распространяется в надежде, что он будет полезен, но БЕЗ
# ЛЮБОЙ ГАРАНТИИ; даже без подразумеваемой гарантии ПРИГОДНОСТИ
# или ПОДХОДЯЩЕСТВА ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. См. GNU General Public
# License для более подробной информации.
#
# Вы должны были получить копию GNU Lesser General Public
# License вместе с avahi; если нет, пишите в Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# США.
# См. avahi-daemon.conf(5) для получения дополнительной информации о этой конфигурации
# файл!
[server]
#host-name=foo
#domain-name=local
#browse-domains=0pointer.de, zeroconf.org
use-ipv4=yes
use-ipv6=yes
#allow-interfaces=eth0
#deny-interfaces=eth1
#check-response-ttl=no
#use-iff-running=no
#enable-dbus=yes
#disallow-other-stacks=no
#allow-point-to-point=no
#cache-entries-max=4096
#clients-max=4096
#objects-per-client-max=1024
#entries-per-entry-group-max=32
ratelimit-interval-usec=1000000
ratelimit-burst=1000
[wide-area]
enable-wide-area=yes
[publish]
#disable-publishing=no
#disable-user-service-publishing=no
Вам нужно установить библиотеку libnss_mdns_minimal.so
(из пакета “libnss-mdns”) и настроить ее в /etc/nsswitch.conf
, чтобы система знала, что нужно обращаться к Avahi-daemon для поиска имен хостов.
Пакетирование Ubuntu, вероятно, включит это автоматически (или включит только IPv4 ‘mdns4’; затем вы можете изменить nsswitch.conf, чтобы перейти на вариант с двойным стеком). Если это не включено автоматически, добавьте
mdns_minimal [NOTFOUND=return]
в строку hosts:
файла /etc/nsswitch.conf, после модуля files
– но перед dns
или resolve
. Например:
hosts: files mdns_minimal [NOTFOUND=return] dns
Во многих последних дистрибутивах вместо этого есть частичная поддержка mDNS как часть модуля resolve
от systemd-resolved; вы можете использовать это вместо этого – хотя, когда я пробовал это в последний раз, это настаивало на выполнении обратных запросов mDNS для IPv6, из-за чего каждый обратный поиск занимал необычно много времени (не говоря уже о конфликте с avahi-daemon для входящих запросов, так что лучше не смешивать оба).
(То есть, если у вас есть программа, которая зависит от API обнаружения сервисов DNS-SD Avahi, то придерживайтесь Avahi. Если вам нужно только разрешение имени хоста *.local и ничего больше, то можете использовать либо Avahi, либо systemd-resolved, но не оба одновременно.)
В случае systemd-resolved модуль nsswitch.conf называется resolve
– тот же модуль обрабатывает как DNS, так и mDNS – и он должен быть указан на той же позиции (но в этом случае вы можете опустить dns
, хотя обычно его включают как запасной вариант):
hosts: files resolve
-или-
hosts: files resolve dns
Поддержка mDNS в resolved должна быть включена либо через /etc/systemd/resolved.conf
, либо через индивидуальные профили соединений systemd-networkd как опция MulticastDNS=
, либо через профили соединений NetworkManager как опция connection.mdns
. (Вам не нужно делать ничего из этого для Avahi.)
Комбинация Avahi для mDNS и systemd-resolved для обычного DNS будет выглядеть так:
hosts: files mdns_minimal [NOTFOUND=return] resolve
-или-
hosts: files mdns_minimal [NOTFOUND=return] resolve dns
Ответ или решение
Невозможность пинга mDNS хоста: анализ и решение проблемы
Ситуация, в которой вы не можете выполнить команду ping для mDNS хоста на Ubuntu 22.04, в то время как она успешно работает на Windows, может быть вызвана несколькими факторами, связанными с конфигурацией сети и настройками разрешения доменных имен в Ubuntu. В этом ответе мы проанализируем возможные причины проблемы и предложим решения.
1. Проверка конфигурации Avahi
Вы указали, что Avahi установлен и работает, поскольку команда avahi-browse --all
показывает обнаруженные устройства, а команда avahi-resolve --name esp32-mdns.local
успешно разрешает хост в IP-адрес. Это свидетельствует о том, что Avahi функционирует корректно. Однако, для успешного разрешения имен через mDNS, необходима правильная настройка системы.
2. Настройка /etc/nsswitch.conf
Важным аспектом является файл /etc/nsswitch.conf
, который определяет, как система ищет имена хостов. Для правильной работы mDNS вы должны добавить или изменить строки в этом файле. Найдите строку, начинающуюся с hosts:
и убедитесь, что в ней присутствует следующий порядок:
hosts: files mdns_minimal [NOTFOUND=return] dns
Эта конфигурация указывает системе сначала обращаться к локальным файлам, затем к mDNS, а при его отсутствии – к DNS-серверу.
Если порядок будет неправильным, система может не обращаться к Avahi для разрешения имен hмDNS. Если у вас используется systemd-resolved, вы можете изменить эту строку следующим образом:
hosts: files resolve
Обратите внимание, что в современных дистрибутивах часто может возникнуть конфликт между systemd-resolved и Avahi. Поэтому, если у вас возникли подобные конфликты, рекомендуется придерживаться одной из двух систем.
3. Установка libnss-mdns
Если libnss-mdns
не установлен, его необходимо установить. Это библиотека, позволяющая системе обращаться к mDNS для разрешения имен. Убедитесь, что пакет установлен:
sudo apt update
sudo apt install libnss-mdns
После установки выполните команду для перезагрузки системы или перезапуска службы Avahi, чтобы изменения вступили в силу:
sudo systemctl restart avahi-daemon
4. Конфликтующие службы
Если у вас установлены обе службы – Avahi
и systemd-resolved
– это может вызвать конфликты. решите, какую службу вы хотите использовать для mDNS:
-
Продолжайте использовать Avahi: Отключите
systemd-resolved
с помощью:sudo systemctl disable systemd-resolved sudo systemctl stop systemd-resolved
-
Перейдите на systemd-resolved: Если вы предпочли использовать
systemd-resolved
, убедитесь, что он настроен на поддержку mDNS, и измените файл конфигурации/etc/systemd/resolved.conf
, добавив:[Resolve] MulticastDNS=true
После изменений не забудьте перезапустить службу:
sudo systemctl restart systemd-resolved
5. Проверка сетевой конфигурации
Дополнительно, убедитесь, что ваш Ubuntu-устройство и ESP32 находятся в одной подсети без каких-либо сетевых ограничений, таких как брандмауэры, блокировки портов мDNS (UDP 5353) или другие факторы, которые могут препятствовать обмену сообщениями через mDNS.
Заключение
В результате, для успешного пинга esp32-mdns.local
выполните указанные шаги по проверке и настройке Avahi, а также конфигурации системы. Убедитесь в том, что используете только одну службу для разрешения имен: либо Avahi, либо systemd-resolved, чтобы избежать конфликтов. После всех изменений попробуйте снова выполнить команду ping esp32-mdns.local
.