Wer kennt sie nicht, die gute alte .local Domain. Seit Jahren leistet sie uns gute Dienste bei der Sortierung unserer LAN Hosts. Irgendjemand scheint das jetzt dann doch alles zu reibungslos verlaufen zu sein, deshalb erschuf er mDNS bzw. den avahi-daemon. Eigentlich ein ganz brauchbarer kleiner Dienst der den Zweck hat dafür zu sorgen das sich Rechner innerhalb eines lokalen Netzwerkes anhand ihrer Hostnamen erkennen und ein paar Dienste bereitgestellt werde. Dafür wir auf eine Technik zurückgegriffen die sich mDNS, also Multicast DNS nennt. Zu DNS gehört allerdings auch immer ein Domainname, was glaubt ihr jetzt welcher da bei avahi per default zum Einsatz kommt? Richtig, natürlich .local. Was genau passiert jetzt also wenn der avahi-daemon und ein lokaler DNS-Server mit eingestellter .local Domain aufeinander treffen? In der Theroie exakt gar nichts, da (zumindest bei Debian) die /etc/default/avahi-daemon so aussieht:
# 1 = Try to detect unicast dns servers that serve .local and disable avahi in # that case, 0 = Don't try to detect .local unicast dns servers, can cause # troubles on misconfigured networks AVAHI_DAEMON_DETECT_LOCAL=1
Avahi stellt also den Dienst direkt ein sobald es einen normalen DNS Server findet. Funktioniert das in der Praxis? Meistens. Doch was passiert wenn es einmal nicht klappt?
nslookup und das host command liefern uns die richtige IP zurück, Ping sagt uns das es den Hostnamen nicht auflösen kann. WTF? Wie kommt es zu einem solchen verhalten? Schauen wir doch einmal was in der nsswitch.conf drinnen steht.
:~$ cat /etc/nsswitch.conf # /etc/nsswitch.conf # # Example configuration of GNU Name Service Switch functionality. # If you have the `glibc-doc-reference' and `info' packages installed, try: # `info libc "Name Service Switch"' for information about this file. passwd: compat group: compat shadow: compat hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis
Das ist dann wohl die Erklärung. Wir schauen also erst einmal ob der Hostname in der /etc/hosts vorhanden ist (files). Ist jetzt nicht die schlechteste Idee. Falls nicht fragen wir beim mdns nach, warum jetzt genau erst den mdns4_minimal ist eine gute Frage. So jetzt kommt der Hammer, sollte dieser mdns der Meinung sein das er den Hostnamen nicht kennt und für .local zuständig ist erfolgt ein Abbruch ([NOTFOUND=return]). Unsere Anfrage schafft es also gar nicht bis zum zuständigen DNS Server, der uns die korrekte IP zurückliefern würde.
Warum das so ist, bzw was man sich dabei so gedacht hat gehört zu den Fragen die wohl ewig Unbeantwortet bleiben. Aber alleine schon aufgrund der Tatsache das ich nach diesem Problem einige Zeit suchen musste hat der avahi-deamon bei mir inzwischen einen relativ schlechten Stand und um auch wirklich ganz sicher zu gehen das ich NIEMALS wieder in dieses Problem laufe werde ich meine lokale Domain demnächst auf etwas umstellen das garantiert nie in einem rfc landet.
Bleibt noch zu klären wie es dazu kommen kann das der avahi-daemon trotzdem startet wenn irgendwo im Netz ein DNS ist der .local Domains verteilt. Meine vorläufige Erklärung dafür ist jetzt zunächst einmal das der avahi irgendwie startet bevor es der DNS-Server tut bzw aufgrund irgendwelcher Netzwerk fuckups der DNS mal kurzzeitig nicht erreichbar ist.
Kleines Update:
Besonders viel Freude hat man natürlich auch bei wenn man irgendwie auf die dumme Idee kommen sollte sich erst lange nach dem starten seines Rechners mit einem VPN zu verbinden in dem zufällig ein DNS Server steht der eine .local Domain auflöst. In diesem Fall startet natürlich der Avahi-daemon immer zuerst und damit war es das dann auch mit der Namensauflösung. Ich bleibe dabei das Avahi Zeug hat mir bis jetzt deutlich mehr Probleme verursacht als es mir genutzt hat.