В локальной сети компьютеры часто знают друг друга только по IP-адресам. Запомнить, что принтер получил 192.168.1.47, а NAS — 192.168.1.12, невозможно, особенно когда DHCP выдаёт новые адреса после перезагрузки. Avahi решает эту проблему: машины объявляют свои имена и службы через mDNS, а соседи находят их по понятным именам вида printer.local.

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

Multicast DNS — это DNS без выделенного сервера. Запросы отправляются на групповой адрес 224.0.0.251 (IPv4) и ff02::fb (IPv6), порт UDP 5353. Участники группы отвечают только за свои записи: имя хоста, адреса, список служб. Никакой центральной базы нет, поэтому сеть продолжает работать даже без интернета и роутера с DNS.

Зона .local зарезервирована для таких имён по RFC 6762. Не используйте её в публичном DNS и не заводите домен company.local на корпоративном сервере: конфликт с mDNS приведёт к непредсказуемому поведению. Для внутренних ресурсов лучше взять поддомен реального домена.

Что даёт Avahi

Avahi — реализация mDNS/DNS-SD в Linux. Она объявляет имя машины, позволяет публиковать службы (веб-интерфейс, принтер, медиасервер) и отвечает на запросы программ через стандартный resolver. Без неё браузеры и приложения не увидят устройства Apple Bonjour вроде принтеров и сетевых дисков.

  • Обращение к хосту по имени name.local без записи в /etc/hosts.
  • Обнаружение принтеров и сканеров, поддерживающих IPP/AirPrint.
  • Поиск служб вроде _http._tcp или _smb._tcp.
  • Публикация собственного сервиса одной командой.

Установка

Пакеты есть в Debian, Ubuntu и Linux Mint. Кроме демона понадобятся утилиты для проверки и модуль NSS, чтобы имя разрешалось обычными программами, а не только через avahi-resolve.

sudo apt update
sudo apt install avahi-daemon avahi-utils libnss-mdns
systemctl status avahi-daemon --no-pager

Служба запускается автоматически. Если статус active (running), переходите к настройке имени. При ошибке читайте journalctl -u avahi-daemon: чаще всего причина в занятом порту или отсутствии прав.

Имя хоста и файл конфигурации

Основные параметры лежат в /etc/avahi/avahi-daemon.conf. По умолчанию имя берётся из hostname, но его можно задать явно.

[server]
host-name=nas
domain-name=local
use-ipv4=yes
use-ipv6=yes
allow-interfaces=eth0
[wide-area]
enable-wide-area=no

После правки перезапустите службу. Параметр allow-interfaces полезен на машинах с несколькими сетевыми картами: вы ограничите вещание только нужным сегментом. Широковещательный режим wide-area не включайте без необходимости — он пытается обновлять публичный DNS.

sudo systemctl restart avahi-daemon
avahi-daemon --check && echo "avahi работает"

Проверка имён

Сначала убедитесь, что имя разрешается на самой машине, затем — с соседнего компьютера. Команда avahi-resolve показывает, какой адрес соответствует имени. Если ответа нет, проверьте, что оба хоста в одной подсети и не блокируют multicast.

avahi-resolve -n nas.local
getent hosts nas.local
avahi-resolve -a 192.168.1.12

Вывод getent важен: он проверяет цепочку NSS. Если avahi-resolve работает, а getent нет, проблема в /etc/nsswitch.conf. Строка для хостов должна содержать mdns4_minimal, иначе обычные приложения не увидят имена.

Поиск служб

Команда avahi-browse перечисляет опубликованные сервисы. Флаг -a показывает все типы, -r разрешает адреса и порты, -t завершает работу после первого прохода. Без -t утилита останется ждать новых событий.

avahi-browse -art
avahi-browse -rt _ipp._tcp
avahi-browse -rt _http._tcp

В выводе видно имя службы, хост, адрес, порт и TXT-записи. По ним удобно проверять, что принтер действительно анонсирует IPP, а не только старый протокол. Если список пуст, но устройства в сети есть, возможно, они не поддерживают mDNS или находятся в другом VLAN.

Публикация своей службы

Любой компьютер может объявить сервис. Это пригодится для домашней страницы, тестового API или файлового сервера. Служба живёт, пока запущена команда, поэтому для постоянной работы её оформляют как systemd-юнит.

avahi-publish -s "Home Page" _http._tcp 8080 "path=/"
avahi-publish -a printer.local 192.168.1.50

Первый пример публикует веб-службу, второй — дополнительный адрес для имени. Не объявляйте чужие имена и адреса: это ломает обнаружение и выглядит как попытка подмены. Для отладки достаточно запустить команду в терминале и остановить по Ctrl+C.

Межсетевой экран

mDNS использует UDP 5353. Если включён ufw, разрешите трафик только из локальной подсети, а не всему миру. На маршрутизаторе multicast обычно не пропускают между VLAN — это нормально и полезно.

sudo ufw allow from 192.168.1.0/24 to any port 5353 proto udp
sudo ufw status verbose
ss -lunp | grep 5353

Последняя команда показывает, кто слушает порт. Если там два процесса, например avahi-daemon и systemd-resolved, проверьте, не включён ли mDNS в обоих. Конфликт проявляется странностями: имена то находятся, то нет.

Сосуществование с systemd-resolved

systemd-resolved умеет и LLMNR, и mDNS. На многих дистрибутивах mDNS в нём выключен, и Avahi работает спокойно. Если включён, оба демона могут делить порт, но поведение зависит от настроек. Надёжнее оставить mDNS за Avahi, а в /etc/systemd/resolved.conf указать MulticastDNS=no и перезапустить службу.

Проверить состояние помогает resolvectl status: в блоке протоколов видно, какие механизмы активны. Не отключайте LLMNR, если им пользуются Windows-клиенты: это разные механизмы.

Диагностика

Если имя не разрешается, начните с захвата трафика. tcpdump покажет, уходят ли запросы и приходят ли ответы. Отсутствие пакетов означает проблему с интерфейсом или firewall, наличие запросов без ответов — проблему на стороне владельца имени.

sudo tcpdump -i any -n udp port 5353
journalctl -u avahi-daemon -n 50 --no-pager

Полезно проверить, что multicast вообще ходит: ping 224.0.0.251. Ответы от локальных участников подтвердят, что группа доступна. В контейнерах режим сети должен пропускать multicast; в Docker для этого обычно нужен host network.

Безопасность и ограничения

mDNS задуман для доверенного сегмента. Любой участник может объявить имя или службу, поэтому не стоит полагаться на него для аутентификации. Не публикуйте служебные интерфейсы без пароля и не открывайте базы данных в локальную сеть только потому, что имя красивое.

Имена .local не маршрутизируются за пределы подсети, и это плюс: меньше поверхности атаки. В гостевых сетях с изоляцией клиентов Avahi бесполезен, там нужен обычный DNS. Для офиса с несколькими сегментами разумнее поднять внутренний DNS с зоной и оставить mDNS для принтеров и медиаустройств.

Итог

Avahi убирает необходимость помнить IP-адреса и вручную править hosts. Установите пакеты, задайте короткое имя, проверьте разрешение через getent и откройте UDP 5353 только для своей подсети. Для диагностики держите под рукой avahi-browse, tcpdump и журнал службы. Если сеть сегментирована или требует строгой аутентификации, используйте DNS, а mDNS оставьте для бытовых устройств.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте