Главная > Debian/Ubuntu > Что такое Zeroconf и с чем его едят

Что такое 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.

Debian/Ubuntu , , , , , , ,

DeliciousFacebookDiggRSS FeedStumbleUponTwitter
  1. Flycat
    13 Январь 2009 в 09:11 | #1

    Большое спасибо, я как прочитал, что такое avahi, так cразу пошёл и сделал
    /etc/init.d/avahi-daemon stop
    chkconfig avahi-daemon off
    :-)

  2. smartly
    13 Январь 2009 в 12:19 | #2

    А я сделал наоборот.

  3. Dr.AKULAvich
    13 Январь 2009 в 15:58 | #3

    Спасибо за ликбез :-) До этого только в общих чертах представлял.
    avahi — пример того, как должна взаимодействовать периферия. Как говорится, включил и пользуйся.
    У меня он «на лету» подхватил сетевой принтер со второй ubuntu-машины. Использую также апплет padevchooser, чтобы перенаправить звук с ноута на акустику. Удобно :)

  4. savagex
    13 Январь 2009 в 18:45 | #4

    Flycat, ничего страшного, я до недавнего времени делал так же :)

    Dr.AKULAvich, да-да, про принтеры я забыл упомянуть.

  5. Anonymous
    13 Январь 2009 в 22:41 | #5

    спасибо за статью. стало хоть понятно, что это такое.

  6. Mikhail
    20 Январь 2009 в 19:16 | #6

    поправьте ссылку на голосование, ваша ведет на дубликат идеи поэтому там голосование заблокировано, вот ссылка на эту идею, там со мной :) уже 296 голосов!
    http://brainstorm.ubuntu.com/idea/456/

  7. 21 Январь 2009 в 12:25 | #7

    @Mikhail
    Исправил, спасибо.

  8. Саша
    3 Март 2009 в 15:45 | #8

    Я так понимаю, что «IPv4 Link-Local или IPv4LL» нужны в отсутствие DHCP в сети?

  9. 3 Март 2009 в 18:43 | #9

    Саша
    Как бы да. Но есть принципиальное различие между DHCP и IPv4LL: IPv4LL — децентрализованная технология, а DHCP — централизованная.

  10. tmp
    12 Июль 2009 в 21:00 | #10

    Поправочка: опция ipv4ll в interfaces доступна только на Ubuntu. В том же Debian её нет. https://wiki.ubuntu.com/ZeroConfNetworking

  11. 13 Июль 2009 в 03:06 | #11

    tmp
    Похоже на то. man interfaces на debian ничего не выдает про такую опцию.

  12. dmig
    23 Ноябрь 2009 в 12:28 | #12

    Pidgin тоже умеет использовать avahi, причём давно. Просто надо ручками создать учётную запись типа Bonjour

  13. !
    9 Февраль 2010 в 09:41 | #13

    Выкорчевал эту дрянь из системы Ubuntu 9.10 и сразу стало легче как мне, так и системе.

  1. Пока что нет уведомлений.