Многоадресный DNS (MDNS) в домашних сетях

Многоадресный DNS является частью набора сетевых технологий с нулевой конфигурацией (zeroconf), предназначенных для того, чтобы устройства могли работать в сети без ручной настройки.

Многоадресный DNS используется для поиска устройства или службы по имени в небольшой локальной сети без использования предварительно настроенного сервера имен, например DNS.

Первоначально разработанный Apple, он носит название Bonjour. Это интернет-стандарт Multicast DNS RFC 6762.

Многоадресный DNS использует ту же структуру пакетов и команды, что и DNS, но не полагается на настроенный пользователем DNS-сервер.

Вместо этого компьютеры в сети создают свои собственные локальные записи DNS и сохраняют их локально в кэше (память компьютера).

В этом руководстве вы узнаете, как работает mDNS и как выполнять запросы mDNS с помощью служебных инструментов avahi и инструмента dns-sd из Bonjour sdk.

mDNs в Linux и Windows

В Linux, включая Raspberry Pi, он обычно устанавливается автоматически и использует пакеты Avahi.

Вы также можете скачать утилиты, которые могут быть полезны для устранения неполадок, используя:

sudo apt-get avahi-utils

В Windows и Apple службы mDNS предоставляются пакетами Bonjour.

Добрый день-SDK

 

Вы можете скачать Bonjour SDK здесь, который позволит вам использовать инструмент командной строки dns-sd.

Вам нужно будет создать учетную запись разработчика, чтобы загрузить SDK.

Как работает mDNS

Полезно сравнить mDNS с традиционной службой DNS, особенно если вы знакомы с DNS.

Когда хосту требуется знать IP-адрес другого хоста, он отправляет DNS-запрос на DNS-сервер, используя одноадресное сообщение UDP на порту 53.

Адрес этого DNS-сервера является частью сетевой конфигурации хоста.

При использовании mDNS сервер mDNS предварительно не настроен, и хост использует многоадресный запрос по адресу IPv4 224.0.0.251 или адресу IPv6 ff02::fb и порту UDP 5353.

Примечание. Многоадресная рассылка — это метод отправки данных группе компьютеров в IP-сетях.

Все хосты mDNS видят этот запрос, и хост с таким сетевым именем отвечает на запрос, используя многоадресное сообщение, содержащее его IP-адрес.

Поскольку обмен сообщениями осуществлялся с использованием многоадресной рассылки, все остальные узлы mDNS видят этот обмен и могут записать имя сети и IP-адрес и сохранить их в своем локальном кэше.

Все хосты mDNS теперь знают имя и IP-адрес запрошенного хоста.

Итак, процесс:

 

    • Хост A отправляет запрос IP-адреса хоста Z.
    • Все хосты mDNS видят этот запрос.
    • Хост Z отвечает своим IP-адресом
    • Все хосты mDNS видят этот ответ.
    • Все хосты mDNS обновляют свой локальный кеш с именем хоста Z и его IP-адресом.

Доменное имя.local

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

Это означает, что все хосты в локальной сети будут иметь имя вида.

host1.local

Преобразователь mDNS на клиенте регистрирует узел с префиксом .local.

Поэтому, когда вы выполняете ping в локальной сети, вы должны использовать:

пинг ws6.local

для компьютера под названием ws6 в вашей локальной сети. Локальный преобразователь имен автоматически выберет mDNS в качестве первого выбора для разрешения имени из-за наличия суффикса .local.

mDNS-записи

mDNS поддерживает как записи имен хостов (A и AAAA), так и записи SRV, как и в стандартной DNS.

Благодаря этому mDNS можно использовать для поиска хостов и служб в локальной сети.

Структура служебной записи может показаться запутанной на первый взгляд для любого, кто плохо знаком с служебными записями DNS.

Структура (взято из вики) показана ниже вместе с примером записи:

_service._proto.name. TTL class SRV priority weight port target.

_sip._tcp.example.com. 86400 IN SRV 0 5 5060 sipserver.example.com.

Здесь служба — _sip, имя протокола — tcp// служба протокола использует имя — example.com . // доменное имя, для которого оно действительно.

Вы должны заметить использование подчеркивания в структуре.

В конце записи имеем

port target

Порт — это порт, на котором работает служба (5060), а целью является хост, на котором работает эта служба (sipserver.example.com.)

Объявления

В рамках протокола mDNS устройства mDNS будут делать объявления, содержащие их записи mDNS, при запуске и в ответ на изменения сети на хост-компьютере.

Эти объявления будут получены всеми клиентами mDNS в локальной сети и использоваться для обновления их собственных записей.

Обнаружение службы с помощью mDNS

mDNS можно использовать для обнаружения таких сервисов, как MQTT, в вашей локальной сети.

Клиент mDNS отправляет запрос для этой службы, как показано ниже, с помощью утилиты avahi-browse:

 

avahi-найти-сервис-mqtt

 

Вы можете видеть, что эта служба доступна на машине с именем pi2 и на IPv4 и IPv6.

В Windows используйте команду dns -sd -B имя службы

mdns-инструменты-окна-1

Поиск хостов с помощью mDNS

Это можно продемонстрировать с помощью утилиты avahi-resolve, как показано ниже.

avahi-резолюция-хост

 

В Windows используйте команду dns -sd -Q hostname

mDNS-инструменты-окна

 

Общие вопросы и ответы

В. Могу ли я по-прежнему использовать локальный сервер доменных имен, такой как DNSMasq, если мои клиенты используют mDNS.

О. Да, они сосуществуют в одной сети.

В. Можно ли использовать mDNS в сетях VLAN?

О. Не без дополнительной настройки.

В. Могу ли я использовать службы оповещения хоста, которые доступны на других машинах в сети?

О. Да, в Linux вам нужно будет создать и добавить файл сервисов avahi.