Многоадресный 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.
Вы можете скачать 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:
Вы можете видеть, что эта служба доступна на машине с именем pi2 и на IPv4 и IPv6.
В Windows используйте команду dns -sd -B имя службы
Поиск хостов с помощью mDNS
Это можно продемонстрировать с помощью утилиты avahi-resolve, как показано ниже.
В Windows используйте команду dns -sd -Q hostname
Общие вопросы и ответы
В. Могу ли я по-прежнему использовать локальный сервер доменных имен, такой как DNSMasq, если мои клиенты используют mDNS.
О. Да, они сосуществуют в одной сети.
В. Можно ли использовать mDNS в сетях VLAN?
О. Не без дополнительной настройки.
В. Могу ли я использовать службы оповещения хоста, которые доступны на других машинах в сети?
О. Да, в Linux вам нужно будет создать и добавить файл сервисов avahi.