Un point sur: Avahi, Bonjour et ZeroConf

Portrait de fira

Dans certains environement, on peut être tenté de permettre l'auto-détection des services, par exemple:
- Car l'environement n'est pas stable ou doit être indépendant
- Car on est dans l'optique d'une application peer-to-peer locale sans serveur central
- Car ca évite à l'utilisateur d'entrer une addresse/ip et est plus convivial

Adressage automatique

On attribue typiquement des addresses sur un réseau local par serveur DHCP, ou statiquement dans un environement serveur.
Lorsqu'on a pas de serveur DHCP, comment faire ?

Il faut savoir que les standards IP définissent une plage d'addressage "lien-local", c'est à dire qu'elle n'est valable que sur le réseau local et non routée.
- IPv4 utilise les addresses 169.254.0.0 sur un subnet /16
- IPv6 utilise les addresses fe80:: en /10

Lorsqu'on ne dispose pas d'un serveur DHCP sur le segment, la plus part des implémentations des clients DHCP supportant ZeroConf va sélectionner une addresse dans cette plage automatiquement pour IPv4. Sous IPv6 c'est inhérent au protocol, et supporté directement par le système d'exploitation.
En ayant des IPs sur ces blocs, les différents clients vont pouvoir communiquer malgré l'absence de routeur ou serveur DHCP.

La découverte d'hôtes

Les clients disposent d'une IP, mais maintenant, comment les obtenir ?
On a généralement besoin d'utiliser des noms DNS pour accéder aux services, mais comment faire sans serveur DNS ?
Là, ZeroConf définit l'utilisation du domaine ".local" automatiquement. Ainsi, la machine "plopix" sera toujours accessible aux autres via "plopix.local".
Pour fonctionner sans serveur central, on utilise alors du DNS Multicast (mDNS) : les requêtes sont envoyées à toutes les machines locales.

La découverte de services

Si vous avez déjà utilisé des softs type Mumble, ou dans certains jeux, ils proposent une fonctionnalité assez sympa qui est la découverte de serveurs.
L'utilisateur n'a qu'a faire une recherche sur le réseau local, et hop ! Tous les serveurs répondent à l'appel.

C'est possible par une combinaison du mDNS et d'enregistrements DNS SRV.
Ces enregistrements sont utilisés sur Internet généralement pour la découverte de port -- nottament dans le cas des serveurs VoIP ou Jeu.
En faisant une requête sur _service._tcp.domaine.fr, on peut ainsi obtenir des infos sur "service"...

En combinant les deux, on peut faire une requête multicast sur un service, et obtenir tous les serveurs locaux le proposant.

Un exemple avec l'implémentation Avahi

Les implémentations les plus connues sont Avahi, Bonjour (chez Apple), celle de Microsoft, et NSD sous Android.
Il faut savoir que ce sont de simples implémentations de ZeroConf, et elles sont donc inter-compatibles!
En activant les fonctionnalités Avahi sur des services courants tels SSH, PulseAudio ou MPD on peut les découvrir via la commande "avahi-browse" sous debian :

fira@magnifix:~$ avahi-browse -a
+   eth0 IPv6 magnifix                                      Remote Disk Management local
+   eth0 IPv4 magnifix [00:1c:c4:9b:ca:9c]                  Workstation          local
...
+   eth0 IPv4 pulse@crunchix                                PulseAudio Sound Server local
+   eth0 IPv6 pulse@crunchix: Built-in Audio Analog Stereo  PulseAudio Sound Source local
...
+   eth0 IPv4 pulse@crunchix: Built-in Audio Analog Stereo  PulseAudio Sound Sink local
+   eth0 IPv6 Music Player                                  Music Player Daemon  local
+   eth0 IPv6 pulse@crunchix                                PulseAudio Sound Server local
+   eth0 IPv6 crunchix                                      SSH Remote Terminal  local
+   eth0 IPv6 crunchix                                      SFTP File Transfer   local

A noter ici est qu'Avahi affiche les services séparément pour IPv4 et IPv6 : c'est le cas car les deux piles de protocole sont indépendantes, et les deux sont donc traitées séparément.

Admettons maintenant que je veuille chercher le serveur MPD et obtenir son IP/Port:

fira@magnifix:~$ avahi-browse -r _mpd._tcp
+   eth0 IPv6 Music Player                                  Music Player Daemon  local
+   eth0 IPv4 Music Player                                  Music Player Daemon  local
=   eth0 IPv6 Music Player                                  Music Player Daemon  local
   hostname = [crunchix.local]
   address = [fe80::5054:ff:fed9:77df]
   port = [6600]
   txt = []
=   eth0 IPv4 Music Player                                  Music Player Daemon  local
   hostname = [crunchix.local]
   address = [10.81.3.214]
   port = [6600]
   txt = []

Avahi nous permet d'obtenir les addresses et ports des serveurs MPD, de façon indépendante d'un serveur central.
A noter qu'un serveur mDNS pourrait aussi publier des services offerts par d'autres serveurs (c'est à dire gérer la partie DNS).

Conclusion

Pour la facilité d'utilisation où dans des environements assez particuliers, ZeroConf permet la découverte d'hôtes et services sur un réseau local.
Un point important à garder à l'esprit est qu'il fonctionne en utilisant du DNS Multicast: donc seulement sur un segment réseau local, sans routage, hors configuration spécifique.
La majorité des plateformes, mobiles comme statiques, disposent de leur propres implémentations, mais toutes se conforment à ZeroConf et sont en principe intéropérables!
La présence de librairies systèmes l'implémentant sous ces plateformes permet aussi d'ajouter de l'auto-découverte à des applications assez rapidement.

Liens et resources

Page de ZeroConf sur Wikipedia
Introduction à NSD (implémentation Android)
Introduction à Bonjour (implémentation Apple)
L'implémentation utilsée dans Mumble
Un apercu de l'implémentation dans MPD