Howto: Zeroconf mit KDE

Ich bin gestern abend zufällig über Avahi gestolpert, einen DNS-SD over Multicast DNS Daemon samt Tools. Wer sich darunter nichts vorstellen kann, denkt einfach an Apple Bonjour (bzw. Rendezvous) oder auch Zeroconf. Unabhängig von der Namensgebung handelt es sich um ein System zur automatischen Bekanntmachung von Hostnamen und Diensten in Netzwerken ohne zentralen Server. Apple-Benutzer greifen damit etwa via iTunes auf die Musikstücke anderer User im Netz zu, ohne sich um IP-Adressen und Freigaben kümmern zu müssen.

Apples Implementation namens mDNSResponder ist zwar frei verfügbar, unterlag aber einer bösen Lizenz (mittlerweile ist es meines Wissens doch BSD), ich habe allerdings auf Avahi zurückgegriffen, da es von Debian und Ubuntu bereits mitgeliefert wird. Die Installation ist entsprechend einfach, man sollte allerdings den dbus-Dämon neu starten, da dieser avahi-daemon sonst mit der Meldung

“Connection “:x.y” is not allowed to own the service “org.freedesktop.Avahi” due to security policies in the configuration file”

zurückweist. Dies kann bei laufendem X-Server einige Applikationen beenden. Die Standardeinstellungen von Avahi reichen für erste Versuche normalerweise aus, der Hostname wird vom System übernommen und die Domäne ist standardmäßig .local. Damit die Hostnames aufgelöst werden können und nicht in der hosts-Datei festgelegt werden müssen, was recht witzlos wäre, installiert man libnss-mdns und editiert /etc/nsswitch.conf so, dass mdns irgendwo zwischen host: und vor dns steht. Spätestens jetzt sollte man auch sichergestellt haben, dass der eingesetzte Kernel auch wirklich IP Multicasting kann.

Sobald avahi-daemon gestartet ist und erfolgreich mit DBus kommuniziert, kann man sich den Status des Netzwerks mit avahi-discover anzeigen lassen. Viel mehr als einige wenige Einträge unter dem Punkt “Workstation” (Hostname samt MAC) dürfte allerdings nicht zu sehen sein, es sei denn, man hat bereits ein Zeroconf-fähiges Gerät im Netz hängen, etwa einen aktuellen Drucker oder einen Mac. Ein Klick auf einen Eintrag listet neben Hostname, Domäne und Service-Name auch das Interface, die Adresse (Hostname/IP:Port) und einen Textstring auf. Letzterer dient später zur Übergabe verschiedener Daten, etwa Pfaden. Da wir aber Netzwerkdienste finden wollen, geht es nun an die Konfiguration derselbigen.

Avahi erwartet pro Dienstgruppe eine XML-Datei mit der Endung .service in /etc/avahi/services/. Die Syntax ist einfach und in der Manpage avahi.service(5) näher beschrieben. Beispiel für einen OpenSSH-Server mit zwei Diensten, SSH und SFTP (ssh.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>_ssh._tcp</type>
    <port>22</port>
  </service>
  <service>
    <type>_sftp._tcp</type>
    <port>22</port>
  </service>
</service-group>

Vorausschauenderweise sieht der Standard sowohl IPV4 als auch IPv6 vor, in meiner Konfiguration kann der Server auf beide Wege erreicht werden. Der Platzhalter %h im Namen wird durch den Hostnamen ersetzt. Das Feld “Type” legt Dienst (SSH) und Protokoll (TCP) fest, wobei die Vergaberegeln ziemlich einfach sind, ein IMAP-Server würde etwa _imap._tcp heißen. Ein Neustart von avahi-daemon macht die beiden Dienste sofort im Netz bekannt, ein Blick auf avahi-discover sollte innerhalb weniger Sekunden zwei neue Kategorien “SSH Remote Terminal” und “_sftp._tcp” samt Host-Eintrag anzeigen (letztere wird von avahi-discover nicht erkannt, ist aber korrekt).


Ein Netz mit mehreren Diensten in avahi-discover

KDE unterstützt DNS-SD seit Version 3.4 und bietet unter anderem einen KIO-Slave (zeroconf:/) zum Browsen im Cache. Dieser KIO-Slave wird von Kubuntu leider nicht mitgeliefert, Interessierte müssen also auf ihre Distribution hoffen oder kdnssd selbst übersetzen. Daneben gibt es einige Applikation, welche von sich aus Zeroconf nutzen können: Etwa ein Amarok-Script zum senden von Audiostreams, daap:/ zum Auffinden von iTunes-Streams, oder auch die Anbahnung von Mehrspieler-Netzwerkpartien in kbattleship. Es bleibt zu hoffen, dass die Liste länger wird. Hier liegt definitiv ein großes Potential vergraben, wie Apple schon richtig erkannt hat.

Der KIO-Slave von kdnssd kommt leider von Haus aus mit sehr wenigen Service-Definitionen und zeigt unbekannte Dienste nicht an, ich habe daher einige weitere Definitionen erstellt und zur Aufnahme in die KDE-Quellen eingereicht. Bis das geschieht, kann man sie hier herunterladen und nach /usr/share/apps/zeroconf/ entpacken.