Я, как старый линуксоид, когда впервые установил Ubuntu и увидел незнакомое слово avahi, конечно же сразу посмотрел в google. Потыкался в несколько ссылок, увидел другие непонятные слова, типа zeroconf, multicast dns, bonjour. Сразу понял, что это какая то мутная технология от Apple и нафиг мне ненужная.
Однако, с ростом локальной сети внутри моей квартиры, подумал, что неплохо бы было полюбопытствовать, как можно приспособить zeroconf, чтобы облегчить себе жизнь.
Давайте разберемся с терминологией:
- Zeroconf — это протокол, разработанный Apple и призванный решать следующие проблемы:
- выбор сетевого адреса для устройства;
- нахождение компьютеров по имени;
- обнаружение сервисов, например принтеров.
- Avahi — открытая и свободная реализация протокола zeroconf.
- Bonjour — open-source реализация протокола 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? Гораздо проще, чем кажется. Разберем по шагам:
- Поставить пакеты
avahi-daemon
,avahi-autoipd
,libnss-mdns
. Если у вас стоит Ubuntu, то скорее всего эти пакеты уже установлены. - Включить 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
скорее всего никуда не исчезнет). - Разрешить в брандмауэре прохождение 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.
Отсюда: http://habrahabr.ru/post/66020/