Bug 26301 - Konfiguration des root-zone-type per UCR
Konfiguration des root-zone-type per UCR
Status: CLOSED FIXED
Product: UCS
Classification: Unclassified
Component: DNS
UCS 3.0
Other Linux
: P5 enhancement (vote)
: UCS 3.0-2
Assigned To: Jürgen Kahrs
Philipp Hahn
: interim-2
Depends on:
Blocks: 32791
  Show dependency treegraph
 
Reported: 2012-03-01 09:36 CET by Ingo Steuwer
Modified: 2013-10-02 13:09 CEST (History)
1 user (show)

See Also:
What kind of report is it?: ---
What type of bug is this?: ---
Who will be affected by this bug?: ---
How will those affected feel about the bug?: ---
User Pain:
Enterprise Customer affected?:
School Customer affected?:
ISV affected?:
Waiting Support:
Flags outvoted (downgraded) after PO Review:
Ticket number:
Bug group (optional):
Max CVSS v3 score:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ingo Steuwer univentionstaff 2012-03-01 09:36:02 CET
In einer Kundenumgebung musste die root-Zone "." von "forward" auf "hint" umkonfiguriert werden (die root-Server sind nicht erreichbar, es gibt keinen forwarder).

Das sollte per UCR möglich sein.
Comment 1 Jürgen Kahrs univentionstaff 2012-06-04 11:19:52 CEST
Die Änderungen sind als Python-Code einzufügen in den Dateien
  dev/branches/ucs-3.0/ucs/services/univention-bind/conffiles/etc/bind/named.conf.samba4
  dev/branches/ucs-3.0/ucs/services/univention-bind/conffiles/etc/bind/named.conf.proxy

Zur Laufzeit liegen die Dateien unter
  /etc/univention/templates/files/etc/bind/named.conf.samba4
  /etc/univention/templates/files/etc/bind/named.conf.proxy
und UCR erzeugt daraus die Dateien
  /etc/bind/named.conf.samba4 
  /etc/bind/named.conf.proxy

Wie teste ich, ob die Lösung funktioniert ? Mit UCR einen Wert setzen (was genau, das muss noch spezifiziert werden) und prüfen, ob dieser Wert auch in den generierten Dateien ankommt. Funktionales Testen muss darüber hinausgehen.

Doku zun BIND9 und "hint" findet sich unter
  http://www.zytrax.com/books/dns/ch7/
Mit dieser Info muss geklärt werden, wie die Implementierung genau aussehen soll und was im ucr davon sichtbar wird.
Comment 2 Jürgen Kahrs univentionstaff 2012-06-04 13:03:01 CEST
Aktuell funktioniert der Umgang mit der zone "." bei uns so:
  - Falls im UCR mindestens ein forwarder definiert ist, wird eine zone "." ("type forward") angelegt und darin sämtliche definierten forwarder genannt
  - Andernfalls wird geprüft, ob im UCR dns/fakeroot gesetzt ist eine zone "." ("type master") angelegt, die aus der leeren Datei /etc/bind/db.root.fake besteht, also nichts tut
  - Anderfalls wird keine zone "." angelegt

Eine Lösung für diesen Bug könnte nun so aussehen:
  - Lösche aus dem UCR alle Variablen dns/forwarder und 
    lösche auch die Variable dns/fakeroot
  - Nun schreibt UCR keine zone "." mehr in die Dateien
  - Seit Version 9 von bind erkennt der bind die Situation (keine zone "." definiert) und benutzt seine vordefinierte default zone "." ("type hint")

Dieses Verhalten ist in zwei Quellen beschrieben und sollte funktionieren:
  - http://www.zytrax.com/books/dns/ch7/
    If you are running an internal name service on a closed network you do not need the root.servers file or 'hint' zone. Even if the hint zone is not defined BIND 9 has a internal list which it uses.
  - http://www.linupedia.org/opensuse/Bind
    Die hint-Zone [..] muss seit bind9 nicht mehr eingebaut sein, da sie von bind automatisch eingelesen wird.

Wenn wir diesen Weg gehen, dann muss am Quellkode nichts geändert werden. Wir müssen dann nur dokumentieren, wie mit den vorhandenen UCR-Variablen umzugehen ist.

Stefan ist das Ok so ? Können wir diese "Lösung über Doku" nehmen ?
Comment 3 Stefan Gohmann univentionstaff 2012-06-04 20:02:24 CEST
Bitte auch (In reply to comment #2)
>   - Anderfalls wird keine zone "." angelegt

Wenn dadurch das gleiche erreicht wird, dann könnte das in dem else-Zweig auch einfach geschrieben werden. Dann ist es verständlicher.

Bitte auch die Variablenbeschreibung für dns/fakeroot entsprechend anpassen. Das reicht dann als Dokumentation.
Comment 4 Jürgen Kahrs univentionstaff 2012-06-05 15:48:35 CEST
Ok, ich hab das script named.conf.proxy testweise mal geändert und es geht.

Die Variablenbeschreibung für dns/fakeroot im Quellpaket dev/ucs-3.0/ucs/services/univention-bind in der Datei debian/univention-bind.univention-config-registry-variables habe ich so geändert, aber noch nicht eingecheckt.

Keine dieser Änderungen habe ich eingecheckt, review steht noch aus.

Beim Testen und beim Schreiben der Variablenbeschreibung fiel auf, dass noch einige Widersprüche oder Bugs in der Implementierung von dns/fakeroot sind. Da müssen wir noch einiges klären, bevor ich es einchecke.

  - Wenn ucr dns/fakeroot undefiniert ist (also z.B. mit "ucr unset" gelöscht wurde), dann wird trotzdem vorgegangen, als sei es auf "True" gesetzt
  - Grundsätzlich scheint das ucr script den Fall einer undefinierten Variable nicht zu berücksichtigen ("ucr get dns/fakeroot" müsste im return value melden, wenn die Variable gar nicht existiert)
  - der aktuelle Lösungsansatz funktioniert nur für Samba 3; für Samba 4 muss er noch erweitert werden, weil Samba 4 wohl einen eigenen bind service hat, dem wir auf andere Weise beibringen müssen, dass er eine "zone . type hint ; file file /etc/bind/db.root" beachten soll
  - dieser Lösungsansatz muss noch mal mit Ingo besprochen werden, weil Ingo das ursprüngliche Problem aus Kundensicht besser kennt
Comment 5 Jürgen Kahrs univentionstaff 2012-06-06 13:53:04 CEST
Die Variablenbeschreibung für dns/fakeroot habe ich eingebaut und nach Installation des neuen Pakets überprüft.

Wenn ucr dns/fakeroot undefiniert ist, dann wird trotzdem vorgegangen, als sei es auf "True" gesetzt und das ist auch absolut gewünscht so, sagt Stefan. Beim allerersten Installieren kann das auftreten und wir brauchen in so einem Fall praktikables Verhalten des DNS service.

Das Problem mit der undefinierten Variable ("ucr get dns/fakeroot" müsste im return value melden,wenn die Variable gar nicht existiert) habe ich in den neuen 
Bug #27465 verschoben.

Die implementierte Lösung funktioniert doch mit Samba 3 und auch mit Samba 4. Da war wohl ein Missverständnis bei mir. Ich hab beide Fälle mehrfach getestet und es funktionierte mit beiden richtig. In sämtlichen Varianten lieferte der folgende Befehl die IP Adresse des eigenen Rechners:

  host $(hostname)

Ingo war einverstanden mit der neuen Semantik von dns/fakeroot=False, auch wenn diese Lösung aus Kundensicht nicht ganz intuitiv nachvollziehbar ist. Im Handbuch ist dns/fakeroot nach wie vor nicht sichtbar (die Variablenbeschreibung ist allerdings problemlos sichtbar und das sollte erst mal reichen).
Comment 6 Jürgen Kahrs univentionstaff 2012-06-08 10:49:33 CEST
Nach Rücksprache mit Stefan habe ich den changelog im Handbuch doch ergänzt (weil hier Quellkode verändert wurde).
Comment 7 Philipp Hahn univentionstaff 2012-07-02 15:01:05 CEST
FAIL: ChangeLog: svn13386
> \item The new \ucsUCRV{dns/fakeroot} has been added

Wenn ich den Bug richtig verstanden habe, gab es die Variable schon länger. Neu ist lediglich die Dokumentation.
→ Documentation for \ucsUCRV{dns/fakeroot} was added (\ucsBug{26301}).

> This new boolean variable is effective only if no \ucsUCRV{dns/forwarder} is set,

Das stimmt so nicht, denn es gibt mehrere dns/forwarderX-Variablen.
→ This boolean variable is effective only when no \ucsUCRV{dns/forwarder}s variables are set,

> allowing a proper DNS service under rare circumstances when no local forwarder is available.

Das ist sehr schwammig und hat mich jetzt selber erstmal einige Zeit gekostet, um die genauen Unterschiede herauszuarbeiten::
→ allowing proper DNS service in environments where the standard DNS root servers are unreachable.


FAIL: univention-bind, svn33442
> Description[de]=Nur wirksam falls kein dns/forwarder gesetzt ist.
> Falls auf True gesetzt, löst Bind nur noch den Namen des eigenen Rechners auf.

Nein: Der DNS-Server kann nur noch Namen aus den lokal definierten Zonen auflösen (wozu dann auch sein eigener Name gehört.) Was nicht mehr geht ist dann z.B. das Auflösen von "univention.de", weil dafür wird Zugriff auf mindestens einen der DNS-root-Server benötigt (oder einen Forwarder).

> Falls auf False gesetzt, so werden die wohlbekannten DNS-Server des Internets benutzt.

Hier fehlt das Wörtchen "root", denn um die "Root-Nameserver" geht es hier. Der DNS-Server des Providers ist nämlich auch (lokal) bekannt, aber der gehört eben nach dns/forwarderX.

> (Standard: nicht gesetzt)

Nein: Die Variable ist zwar nicht gesetzt, aber der Standardwert ist eben True, was dazu führt, daß eben dann wohlbekannte Internet-Namen nicht aufgelöst werden können. Erst durch das explizite Setzen auf False funktioniert die Namensauflösung, wenn kein Forwarder angegeben ist.

> Description[en]=Effective only if no dns/forwarder is set.
→ forwarders are set.

> If set to True then bind service resolves only the name of the host itself.

→ then _the_ DNS server ... only resolves local domain names.
("BIND" ist ein Eigenname und wird i.d.R. groß geschrieben, alternativ "named". Die Software erbringt den Domain Name Service (DNS))

> If set to False then the well-known DNS root servers are used.

Hier richtig.

> (Default: not set)

s.o.


Notizen
-------
1. Nach "ucr set" unbedingt "sv restart univention-bind-proxy"
2. Forwarder: Anfrage wird top-down an diesen Server weitergereicht
3. root-hint: Namen selber bottom-up auflösen
4. dig @localhost -p 53 +trace univention.de # iterativ
5. dig @localhost -p 53 +recurse univention.de # recursive


Anmerkungen
-----------
Noch zwei Anmerkung für die Zukunft zu services/univention-bind/conffiles/etc/bind/named.conf.proxy:
>        if configRegistry['dns/forwarder1']:

Unsere derzeitige UCR-Implementierung verletzt zwar den Python-Kontrakt für Dictionaries <http://docs.python.org/library/stdtypes.html#dict>, aber falls eine zukünftige Version dannn irgendwann doch mal ein erwarteten KeyError wirft, sollte hier explizit dict.get(key) verwendet werden.

> +               print '\t\t%s;' % configRegistry['dns/forwarder1']

Bei dem Beispiel ist es wegen nur einer UCR-Variablen noch übersichtlich, aber übersichtlicher kann auch folgende Schreibweise sein:
    print '\t\t%(dns/forwarder1)s;' % configRegistry
Comment 8 Jürgen Kahrs univentionstaff 2012-07-03 10:19:30 CEST
Ja, stimmt. Das ist ein kniffliger Bug. Ich hab alle vorgeschlagenen Änderungen in den Text eingefügt. Die Stelle in debian/univention-bind.univention-config-registry-variables sieht nun so aus:

Description[de]=Nur wirksam falls keine dns/forwarder gesetzt sind. Falls auf True gesetzt, löst Bind nur noch Namen aus den lokal definierten Zonen auf (darunter den Namen des eigenen Rechners). Falls auf False gesetzt, so werden die wohlbekannten root-DNS-Server des Internets benutzt. (Standard: yes)
Description[en]=Effective only if no forwarders are set. If set to True then the DNS server resolves only the names of the locally defined zones (among them the host itself). If set to False then the well-known DNS root servers are used. (Default: yes)

Im changelog des Handbuchs hab ich analog dazu die Änderungen vorgenommen.
Comment 9 Philipp Hahn univentionstaff 2012-07-03 16:10:19 CEST
OK: ChangeLog svn13735
FAIL: univention_bind-6.0.41-1.155.201207031013 svn33929

Mir fällt da gerad noch auf, daß dort nur das Verhalten für die beiden Werte beschrieben wird, aber eine allgemeine Beschreibung fehlt.
Etwas unglücklich ist auch das im Text von "True" und "False" die Rede ist, als Standard dann aber "yes" angegeben wird.

Diese Einstellung kontrolliert die Namensauflösung für nicht lokal definierten DNS-Zonen und ist nur relevant, sofern keine DNS-Forwarder gesetzt sind. Bei "no" wird auf die wohlbekannten root-DNS-Server zurückgegriffen. Bei "yes" werden keine externen Server verwendet, so daß nur noch Namen aus den lokalen Zonen aufgelöst werden können. (Standard: no)
Comment 10 Jürgen Kahrs univentionstaff 2012-07-04 09:14:55 CEST
Ich hab die Änderungen (wie von Philipp vorgeschlagen) in die Datei univention-bind.univention-config-registry-variables eingetragen. Nach dem Bauen des Pakets waren die Änderungen auch auf dem Zielsystem sichtbar (ucr search fakeroot).

[dns/fakeroot]
Description[de]=Diese Einstellung kontrolliert die Namensauflösung für nicht lokal definierte DNS-Zonen und ist nur relevant, sofern keine DNS-Forwarder gesetzt sind. Bei "no" wird auf die wohlbekannten root-DNS-Server zurückgegriffen. Bei "yes" werden keine externen Server verwendet, so dass nur noch Namen aus den lokalen Zonen (darunter der Name des eigenen Rechners) aufgelöst werden können. (Standard: no)
Description[en]=This setting controls name resoltion for non-locally defined DNS zones and is relevant only if no DNS forwarder has been set. If set to "no" then the well-known DNS root servers are used for name resolution. If set to "yes" then no external servers will be used, so that only names from the local zones (among them the host itself) can be resolved. (Default: no)
Comment 11 Philipp Hahn univentionstaff 2012-07-04 10:16:59 CEST
OK: svn33948, univention-bind_6.0.41-2.156.201207040905

Bei Gelegenheit sollte man noch folgendes Ändern, damit DE und EN synchron sind:
- if no DNS forwarder has been set.
+ if no DNS forwarders have been set.
Comment 12 Philipp Hahn univentionstaff 2012-07-04 11:30:53 CEST
(In reply to comment #11)
> Bei Gelegenheit sollte man noch folgendes Ändern, damit DE und EN synchron
> sind:
> - if no DNS forwarder has been set.
> + if no DNS forwarders have been set.

svn33951
Comment 13 Stefan Gohmann univentionstaff 2012-07-20 15:25:38 CEST
UCS 3.0-2 has been released: 
  http://forum.univention.de/viewtopic.php?f=54&t=1905

If this error occurs again, please use "Clone This Bug".