Avahi (Русский)

From ArchWiki

Эта статья или раздел нуждается в переводе

Примечания: Section order does not match the English page, although most of the content still seems to be there. (обсуждение: Talk:Avahi (Русский)#)

Из Wikipedia:Avahi (software):

Avahi — система, производящая анализ локальной сети на предмет выявления различных сервисов. К примеру, вы можете подключить ноутбук к локальной сети и сразу получить информацию об имеющихся принтерах, разделяемых ресурсах, сервисах обмена сообщениями и прочих услугах. Подобная технология существует в Mac OS X (Rendezvous, Bonjour) и показала себя с лучшей стороны. Avahi во многом базируется на реализации протокола mDNS — flexmdns, которая в настоящий момент заброшена; все силы переключены на разработку нового продукта.

Установка

Установите пакет avahi.

Вы можете управлять демоном Avahi avahi-daemon.service используя systemd.

Примечание: systemd-resolved имеет встроенную службу mDNS; перед использованием Avahi обязательно отключите широковещательный DNS из systemd-resolved (см. resolved.conf(5)) или же полностью отключите systemd-resolved.service.

Настройка

Получение IP адреса (IPv4LL)

При использовании dhcpcd

This article or section is a candidate for merging with dhcpcd.

Notes: should be merged into the main page (Discuss in Talk:Avahi (Русский))

dhcpcd-клиент пытается получить IPv4LL-адрес, если ему не удалось получить его через DHCP. По умолчанию эта опция отключена. Чтобы включить ее, зaкомментируйте строку noipv4ll:

/etc/dhcpcd.conf
...
#noipv4ll
...

Или запустите avahi-autoipd:

# avahi-autoipd -D

При использовании NetworkManager

При использовании NetworkManager, следует добавить альтернативную конфигурацию для получения IPv4LL-адреса, которая задействовалась бы, если не удалось получить IP через DHCP.

# nmcli connection add type ethernet ifname enp0s3 con-name enp0s3-auto
# nmcli connection modify enp0s3-auto connection.autoconnect-priority 100
# nmcli connection modify enp0s3-auto connection.autoconnect-retries 2 # reduce DHCP retries [since NM v1.6]
# nmcli connection modify enp0s3-auto ipv4.dhcp-timeout 3 # reduce timeout time for each DHCP probe [since NM v1.2]
# nmcli connection add type ethernet ifname enp0s3 con-name enp0s3-ll
# nmcli connection modify enp0s3-ll connection.autoconnect-priority 50 ipv4.method link-local

При использовании systemd-networkd

При использовании systemd-networkd, следует добавить в конфигурационный файл вида "/etc/systemd/network/wired.network" в раздел Network параметр для получения IPv4LL-адреса, в случае, если не удалось получить IP через DHCP:

LinkLocalAddressing=yes

Сопоставление имён хостов (DNS)

Avahi выполняет сопоставление имён хостов из local, имеющих вид "<имя хоста>.local". Для включения, установите пакет nss-mdns и запустите/включите avahi-daemon.service.

Примечание: Судя по опыту, сопоставление имён из local работает по умолчанию, а вот для нестандартного доменного имени верхнего уровня, действительно нужно ставить nss-mdns и вносить соответствующие правки в конфиг avahi: domain-name=<имя домена>(например, alocal) и enable-wide-area=no.

Затем отредактируйте файл /etc/nsswitch.conf, в котором измените строку hosts, чтобы она включала mdns_minimal [NOTFOUND=return] перед resolve и dns:

hosts: mymachines mdns_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
Примечание:
  • Если у вас возникают сбои при разрешении .local хостов (или вы не хотите использовать IPv6), попробуйте использовать mdns4_minimal и mdns4 вместо mdns_minimal и mdns соответственно.
  • Приведенная выше строка делает nss-mdns авторитетным для домена .local, если только ваш одноадресный DNS-сервер не отвечает на запросы SOA для имени верхнего уровня local, или если запрос содержит более двух меток. Смотрите nss-mdns примечания по активации.

Конфигурирование mDNS для произвольного домена верхнего уровня (TLD)

Модуль mdns_minimal обрабатывает запросы только для TLD .local. Обратите внимание на [NOTFOUND=return], который указывает, что если mdns_minimal не может найти .local, он не будет продолжать поиск в dns, myhostname и т.д.

В случае, если вы хотите, чтобы Avahi поддерживал другие TLD, вы должны:

  • заменить mdns_minimal [NOTFOUND=return] на mdns (существуют модули только для IPv4 и только для IPv6 mdns[46](_minimal));
  • настроить в /etc/avahi/avahi-daemon.conf выбранное domain-name;
  • внести пользовательские TLD, используемые в Avahi, в белый список в /etc/mdns.allow.

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

Обязательно откройте UDP-порт 5353, если вы используете брандмауэр.

Использование

Утилиты обнаружения

Avahi включает в себя несколько утилит, которые помогут вам обнаружить сервисы, запущенные в сети. Например, запустите это, чтобы обнаружить сервисы в вашей сети:

$ avahi-browse --all --ignore-local --resolve --terminate

Если вы просто хотите выполнить запрос mDNS для преобразования имени хоста .local в IP-адрес (аналогично igили slookup), используйте:

$ avahi-resolve-host-name some-host-name.local

Обратите внимание, что команда getent host может выполнять поиск как по DNS, так и по mDNS.

Avahi Zeroconf Browser avahi-discover отображает различные сервисы в вашей сети. Обратите внимание, что для этого нужны необязательные зависимости Avahi gtk3, python-dbus и python-gobject. Вы также можете просматривать SSH-серверы и VNC-серверы, используя соответственно bssh и bvnc.

Добавление сервисов

Avahi оповещает о сервисах, указанных в файлах *.service, которых находятся в /etc/avahi/services. Файлы в этом каталоге должны быть доступны для чтения пользователю/группе avahi.

Если вы хотите оповещать о сервисе, для которого нет файла *.service, очень легко создать свой собственный. В качестве примера, допустим, вы хотите оповещать о присутствии на своём компьютере сервиса quote of the day (QOTD), работающего по RFC:865 на TCP-порту 17.

Первое, что нужно сделать, это определить <type>. avahi.service(5) указывает, что тип должен быть "типом службы DNS-SD для этой службы, например, '_http._tcp'". Поскольку Реестр DNS-SD был объединен с реестром FIANNA в 2010 году, мы ищем название службы в Реестре IANA или в файле /etc/services. Указанное там имя службы - qotd. Поскольку мы запускаем QOTD по протоколу tcp, теперь мы знаем, что сервис - это _qotd._tcp, а порт (для IANA и RFC 865) - 17.

Соответствующий файл сервиса:

qotd.service
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>

  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_qotd._tcp</type>
    <port>17</port>
  </service>

</service-group>

Для более сложных сценариев, таких как оповещение о сервисах, работающие на другом сервере, подтипах DNS и т.д., обратитесь к avahi.service(5).

Имейте в виду, что Avahi не поддерживает произвольные строки в поле <type>, вы можете задавать только значения, присутствующие в перечень сервисов Avahi. Если вы хотите зарегистрировать что-то своё, вам, скорее всего, придется отредактировать перечень, создать обновленную версию ПО и установить его на своих машинах.

SSH

Avahi поставляется с примером служебного файла для оповещения о доступности SSH-сервера. Чтобы включить его:

# cp /usr/share/doc/avahi/ssh.service /etc/avahi/services/

Общий доступ к файлам

NFS

Если у вас настроен общий доступ с использованием NFS, вы можете использовать Avahi для автомонтирования в браузерах с поддержкой Zeroconf (таких как Konqueror на KDE и Finder на macOS) или файловых менеджерах, таких как GNOME/Files.

Создайте файл .service в /etc/avahi/services со следующим содержимым:

/etc/avahi/services/nfs_Zephyrus_Music.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">NFS Music Share on %h</name>
  <service>
    <type>_nfs._tcp</type>
    <port>2049</port>
    <txt-record>path=/data/shared/Music</txt-record>
  </service>
</service-group>

Порт указан правильно, если у вас есть insecure как опция в вашем /etc/exports; в противном случае его необходимо изменить (учтите, что insecure необходим для клиентов с macOS). 'path' - это путь к вашему 'export' или его подкаталогу.

По какой-то причине функция автоматического монтирования была удалена из Leopard, однако доступен соответствующий скрипт. См. этот пост.

Samba

Если демон Avahi запущен как на сервере, так и на клиенте, файловый менеджер на клиенте автоматически найдёт сервер.

Vsftpd

Вы также можете автоматически обнаруживать обычные FTP-серверы, такие как vsftpd. Установите пакет vsftpd и измените настройки vsftpd в соответствии с вашими личными предпочтениями (смотрите эту тему на ubuntuforums.org или vsftpd.conf(5)).

Создайте файл .service в /etc/avahi/services со следующим содержимым:

/etc/avahi/services/ftp.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name>FTP file sharing</name>
  <service>
    <type>_ftp._tcp</type>
    <port>21</port>
  </service>
</service-group>

Теперь Avahi должен оповещать о FTP-сервере, и вы сможете найти FTP-сервер с помощью файлового менеджера на другом компьютере в вашей сети. Возможно, вам потребуется включить #Сопоставление имён хостов (DNS) на клиенте.

Мессенджеры, поддерживающие Link-Local (Bonjour/Zeroconf)

Avahi можно использовать для поддержки протокола Bonjour в Linux. Cписок клиентов, поддерживающих протокол Bonjour можно посмотреть в Сравнение клиентов обмена мгновенными сообщениями или Клиенты обмена мгновенными сообщениями.

Устранение ошибок

К имени хоста добавляются инкрементирующиеся числа

Это известная ошибка, вызванная состоянием гонки имен хостов. Одним из возможных обходных путей является отключение IPv6, чтобы попытаться предотвратить состояние гонки. Если присутствует несколько интерфейсов используйте allow-interfaces, чтобы ограничить Avahi одним интерфейсом. Другим возможным обходным решением является отключить кэш, чтобы вообще запретить Avahi проверять наличие конфликтов имен хостов, но это не позволит Avahi выполнять поиск.

systemd-resolved препятствует работе nss-mdns

nss-mdns работает только в том случае, если DNS-сервер, указанный в /etc/resolv.conf, возвращает NXDOMAIN на запросы SOA для "локального" домена.[1]

Прежде всего, проверьте отвечает ли ваш DNS-сервер, после настройки, на запрос SOA для домена "local" именно "NXDOMAIN". Например:

$ host -t SOA local
Примечание: Если host нет в системе, её можно добавить, установив пакет bind.

Если DNS-сервер отвечает "NXDOMAIN", вам не нужно выполнять приведенные ниже действия. Avahi должен иметь возможность нормально находить ресурсы в сети, даже если используется systemd-resolved.

В более старых версиях systemd-resolved глобальная настройка "MulticastDNS=no" в resolved.conf(5) приводила к кодам ответа, несовместимым с Avahi, для домена "local". Это приводило к тому, что Avahi не смог правильно найти ресурсы (принтеры). См. системная проблема 21659.

Однако, если приведенный выше запрос DNS не возвращает "NXDOMAIN" для домена "local", вы можете использовать полный mdns-nss модуль вместо mdns_minimal и создать /etc/mdns.allow, где разрешить доступ только к "локальному" домену. Например:

/etc/nsswitch.conf
hosts: mymachines mdns [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns
/etc/mdns.allow
.local.
.local
Примечание: Приведенное выше решение нарушит обратный поиск в сетевых утилитах, таких как mtr и traceroute. Эти приложения попытаются выполнить обратный поиск через Avahi, который завершится тайм-аутом вместо перехода к другим службам DNS. Это похоже на Ошибка Debian 433943, где, к сожалению, рекомендуется использовать mdns_minimal вместо mdns.

ECONNREFUSED (Connection refused) на сокете avahi

Если ваш Avahi запускается и работает корректно, но nss, похоже, не перенаправляет запросы в dns, это может быть вызвано зависанием сокета /run/avahi-daemon/socket. В этом можно убедиться, например, с помощью strace. Если это подтвердится, возможно, придется перезапустить как avahi-daemon.service, так и avahi-daemon.socket, чтобы заставить его работать корректно.

Смотри также