Что такое Zeroconf и с чем его едят
Я, как старый линуксоид, когда впервые установил Ubuntu и увидел незнакомое слово avahi, конечно же сразу посмотрел в google. Потыкался в несколько ссылок, увидел другие непонятные слова, типа zeroconf, multicast dns, bonjour. Сразу понял, что это какая то мутная технология от Apple и нафиг мне ненужная.
Однако, с ростом локальной сети внутри моей квартиры, подумал, что неплохо бы было полюбопытствовать, как можно приспособить zeroconf, чтобы облегчить себе жизнь.
Давайте разберемся с терминологией:
- Zeroconf — это протокол, разработанный Apple и призванный решать следующие проблемы:
- выбор сетевого адреса для устройства;
- нахождение компьютеров по имени;
- обнаружение сервисов, например принтеров.
- Avahi — открытая и свободная реализация протокола zeroconf.
- Bonjour — проприетарная реализация протокола zeroconf от Apple.
Для назначения IP-адресов устройствам, zeroconf использует RFC 3927. Стандарт описывает назначение, так называемых link-local адресов, из диапазона 169.254.0.0/16. Технология называется IPv4 Link-Local или IPv4LL.
Для разрешения имен (name resolving) используется протокол Multicast DNS или сокращено mDNS. Он позволяет устройству выбрать имя в зоне .local. Работает это почти как обычный DNS, но с нюансами. Каждый компьютер хранит записи своей зоны (A, MX, SRV) сам и сам же обслуживает запросы к ним. Когда какой либо компьютер хочет узнать запись зоны, скажем определить IP-адрес по имени (получить запись A для заданной зоны), он обращается по multicast-адресу 224.0.0.251. Соответственно, запрос получают все компьютеры в локальной сети, а отвечает тот, кто хранит зону для интересующего нас имени.
Для поиска и обнаружения сервисов используется протокол DNS based Service Discovery или DNS-SD. Для того, чтобы прорекламировать, какие сервисы доступны на устройстве, используются DNS-записи типа SRV, TXT, PTR.
Как все это заставить работать на Linux? Гораздо проще, чем кажется. Разберем по шагам:
1. Поставить пакеты avahi-daemon, avahi-autoipd, libnss-mdns. Если у вас стоит Ubuntu, то скорее всего эти пакеты уже установлены.
2. Включить IPv4LL. Этот шаг совершенно не обязателен. Если у вас есть любой IP-адрес, который нормально маршрутизируется в локальной сети, то использовать IPv4LL не нужно и даже вредно, так как по стандарту, маршрутизатуры не должны форвардить пакеты с link-local адресами (169.254.*). Иными словами, пробросить интернет через NAT скорее всего не удастся (мне не удалось). Но если вы уж решились, то достаточно для сетевого интерфейса локальной сети, в файле /etc/network/interfaces поставить тип ipv4ll. Что-то типа такого:
iface eth0 inet ipv4ll
Далее можно сделать sudo invoke-rc.d networking restart или даже перезагрузиться (avahi-autoipd не будет устанавливать на интерфейсе адрес 169.254.*, если там уже есть другой IP-адрес, а он после sudo invoke-rc.d networking restart скорее всего никуда не исчезнет).
3. Разрешить в брандмауэре прохождение UDP-пакетов через порт 5353 по адресу 224.0.0.251 (это нужно для нормально работы mDNS) на интерфейсах, смотрящих в локальную сеть.
На этом настройку можно считать завершенной. Какие бонусы после этого вы получите? Перечисляю: все компьютеры получат имена в домене *.local, без лишних телодвижений с вашей стороны; jabber-клиенты Gajim или Empathy будут показывать всех собеседников в локальной сети; Rhythmbox будет расшаривать всю музыку; Ekiga позволит находить и звонить всем, у кого она запущена в локалке; PulseAudio сможет находить все опубликованные звуковые устройства в сети; ну и многое, многое другое. Вы можете ознакомится со списком программ, поддерживающих avahi.
Несколько замечаний.
- Просмотреть анонсированные сервисы в сети можно командой
avahi-browse --all. Она же будет показывать в realtime подключение и отключение этих сервисов. - Если у вас стоит брандмауэр, то сервисы могут видеть друг друга, но не общаться, если закрыты нужные для них порты.
- При помощи демона
avahi-dnsconfdможно клонировать/etc/resolv.confна все компьютеры локальной сети.
- Непременно проголосуйте за идею внедрения связки NFS+Zeroconf в Gnome.






Большое спасибо, я как прочитал, что такое avahi, так cразу пошёл и сделал
/etc/init.d/avahi-daemon stop
chkconfig avahi-daemon off
:-)
А я сделал наоборот.
Спасибо за ликбез :-) До этого только в общих чертах представлял.
avahi — пример того, как должна взаимодействовать периферия. Как говорится, включил и пользуйся.
У меня он «на лету» подхватил сетевой принтер со второй ubuntu-машины. Использую также апплет padevchooser, чтобы перенаправить звук с ноута на акустику. Удобно :)
Flycat, ничего страшного, я до недавнего времени делал так же :)
Dr.AKULAvich, да-да, про принтеры я забыл упомянуть.
спасибо за статью. стало хоть понятно, что это такое.
поправьте ссылку на голосование, ваша ведет на дубликат идеи поэтому там голосование заблокировано, вот ссылка на эту идею, там со мной :) уже 296 голосов!
http://brainstorm.ubuntu.com/idea/456/
@Mikhail
Исправил, спасибо.
Я так понимаю, что «IPv4 Link-Local или IPv4LL» нужны в отсутствие DHCP в сети?
Саша
Как бы да. Но есть принципиальное различие между DHCP и IPv4LL: IPv4LL — децентрализованная технология, а DHCP — централизованная.
Поправочка: опция ipv4ll в interfaces доступна только на Ubuntu. В том же Debian её нет. https://wiki.ubuntu.com/ZeroConfNetworking
tmp
Похоже на то.
man interfacesна debian ничего не выдает про такую опцию.Pidgin тоже умеет использовать avahi, причём давно. Просто надо ручками создать учётную запись типа Bonjour
Выкорчевал эту дрянь из системы Ubuntu 9.10 и сразу стало легче как мне, так и системе.