Avahi (Русский)
Из Wikipedia:Avahi (software):
- Avahi — система, производящая анализ локальной сети на предмет выявления различных сервисов. К примеру, вы можете подключить ноутбук к локальной сети и сразу получить информацию об имеющихся принтерах, разделяемых ресурсах, сервисах обмена сообщениями и прочих услугах. Подобная технология существует в Mac OS X (Rendezvous, Bonjour) и показала себя с лучшей стороны. Avahi во многом базируется на реализации протокола mDNS — flexmdns, которая в настоящий момент заброшена; все силы переключены на разработку нового продукта.
Установка
Установите пакет avahi.
Вы можете управлять демоном Avahi avahi-daemon.service
используя systemd.
systemd-resolved.service
.Настройка
Получение IP адреса (IPv4LL)
При использовании dhcpcd
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
.
Затем отредактируйте файл /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
примечания по активации.- systemd-resolved отвечает на эти запросы, даже если поддержка mDNS отключена. Смотрите #systemd-resolved препятствует работе nss-mdns.
- Больше информации о конфигурировании nss можно найти в nss-mymachines(8) и Avahi docs.
Конфигурирование mDNS для произвольного домена верхнего уровня (TLD)
Модуль mdns_minimal
обрабатывает запросы только для TLD .local
. Обратите внимание на [NOTFOUND=return]
, который указывает, что если mdns_minimal
не может найти .local
, он не будет продолжать поиск в dns
, myhostname
и т.д.
В случае, если вы хотите, чтобы Avahi поддерживал другие TLD, вы должны:
- заменить
mdns_minimal [NOTFOUND=return]
наmdns
(существуют модули только для IPv4 и только для IPv6mdns[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
mdns_minimal
вместо mdns
.ECONNREFUSED (Connection refused) на сокете avahi
Если ваш Avahi запускается и работает корректно, но nss, похоже, не перенаправляет запросы в dns, это может быть вызвано зависанием сокета /run/avahi-daemon/socket
. В этом можно убедиться, например, с помощью strace. Если это подтвердится, возможно, придется перезапустить как avahi-daemon.service
, так и avahi-daemon.socket
, чтобы заставить его работать корректно.
Смотри также
- Avahi - Official project website
- Wikipedia:Avahi (software)
- iTunes (includes Bonjour) - Enable Zeroconf on Windows
- http://www.zeroconf.org/