Невозможно выполнить ping на mDNS-имя хоста

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

У меня есть приложение, которое использует сервер 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=, либо через профили соединений Network­Manager как опция 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:

  1. Продолжайте использовать Avahi: Отключите systemd-resolved с помощью:

    sudo systemctl disable systemd-resolved
    sudo systemctl stop systemd-resolved
  2. Перейдите на 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.

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

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