Auflösen eines CNAME - wer sucht nach einem A-Datensatz - Resolver oder Server?

8

Wenn ein Resolver einen CNAME nachschlägt, sendet der Resolver anscheinend zuerst eine A-Eintragsanforderung an den DNS-Server. Soll der DNS-Server herausfinden, dass es sich bei der Anforderung tatsächlich um einen CNAME handelt, oder soll der Resolver die Anforderung erneut versuchen, jedoch für einen CNAME-Typ? Ich frage, weil - und hier ist die Wendung - wir eine "interne" Top-Level-Domain haben, die wir in unserem internen LAN verwenden. Nennen wir sie "Domain1", und der DNS-Server, den ich abfrage, ist der autorisierende Server für "Domain1" (und ist für alles andere rekursiv.) Was mein Host (Centos 6.8) tatsächlich sendet, ist eine Anfrage nach einem A-Datensatz:

16:15:45.837525 IP (tos 0x0, ttl 64, id 36911, offset 0, flags [none], proto UDP (17), length 62)
myhost.domain1.40684 > dnsserver.domain1.domain: 15355+ A? cfengine.domain1. (34)
Reply - a servfail:
16:15:45.837762 IP (tos 0x0, ttl 64, id 49982, offset 0, flags [DF], proto UDP (17), length 62)
dnsserver.domain1.domain > myhost.domain1.40684: 15355 ServFail 0/0/0 (34)

Wenn ich nach einem CNAME-Typ suche, erhalte ich den richtigen CNAME-Datensatz (obwohl A rec nicht als ZUSÄTZLICHE Daten zurückgegeben wird):

cfengine.domain1.   3600    IN  CNAME   helm02.domain2.

Ja, ich weiß, dass es keine gute Praxis ist, autorisierende und rekursive Funktionen in einem einzigen DNS-Server zu kombinieren, aber ich habe keine Kontrolle über dieses DNS-Setup.

Wenn autorisierende und rekursive Funktionen zu einem einzigen Server kombiniert werden und Sie eine gewünschte Rekursionsabfrage für einen CNAME an den Server senden, für den der Server autorisierend ist - soll er überhaupt funktionieren?

Angenommen, es soll funktionieren. Wer ist dafür verantwortlich, dass meine Anfrage tatsächlich für einen CNAME-Datensatz und nicht für einen A-Datensatz gilt? Der DNS-Server oder mein Resolver?

wsanders
quelle
UPDATE: Diese Frage ist sehr ähnlich zu serverfault.com/questions/111430/… . In unserem Fall ist der autorisierende DNS-Server außerdem PowerDNS (ugh again). Es scheint also, dass PowerDNS immer noch einen Servfail sendet, wenn eine CNAME-Abfrage für eine Zone gesendet wird, für die es autorisiert ist, und die RHS des CNAME-Datensatzes außerhalb der Zone zeigt. Die Problemumgehung besteht darin, PowerDNS nicht in einem gemischten autorisierenden / rekursiven Setup zu verwenden.
Wsanders
Dies hat nichts spezielles mit PowerDNS zu tun.
Andrew B

Antworten:

3

Wenn ein Server für einen bestimmten Namen autorisierend ist und einen CNAMEDatensatz für diesen Namen hat, muss er mit diesem Datensatz auf Abfragen für alle Datensatztypen antworten.

Wenn ein Server eine Rekursion ausführt, nach einem Datensatztyp fragt, der dies nicht ist CNAME, aber eine CNAMEAntwort erhält , sollte er die Abfrage mit dem Namen aus dem CNAMEDatensatz neu starten , die Antwort aus der neu gestarteten Abfrage mit der CNAMEAntwort zusammenführen und die kombinierte Antwort zurückgeben für wen auch immer es die Rekursion machte.

Anders ausgedrückt, der autorisierende Server ist dafür verantwortlich, zu wissen, dass ein Name ein hat, CNAMEund damit auf alle Anfragen zu antworten, und der Rekorder ist dafür verantwortlich, zu bemerken, dass er eine CNAMERückmeldung erhalten hat, wenn er nach etwas anderem fragt, und entsprechend zu handeln. Wenn Sie speziell nach einem Datensatz fragenCNAME , umgehen Sie diese zusätzliche Magie und der Rekorder gibt Ihnen nur die CNAMEAntwort, wie sie ist, ohne zu versuchen, dem Namen zu folgen.

Calle Dybedahl
quelle
1

Das SERVFAILsollte verschwinden, wenn Sie diese Abfrage erneut mit versuchen +norecurse. dig geht davon aus, dass standardmäßig eine Rekursion gewünscht wird, und SERVFAIList die richtige Antwort auf die Rückgabe, wenn eine Rekursion angefordert wurde und das Ziel eines Alias ​​nicht aufgelöst werden konnte.

Rekursive Server, die Ihren autorisierenden Server abfragen, sollten die Anforderung nicht mit RD=1gesetztem Flag für die gewünschte Rekursion ( ) stellen. Kurz gesagt, Sie sollten dieses Problem nur in den folgenden zwei Szenarien sehen:

  1. Sie führen diese Transaktion von Hand aus und vergessen, die Rekursion zu deaktivieren.
  2. Jemand hat eine (schlechte) Implementierung eines rekursiven Nameservers geschrieben, und der Autor hat es versäumt, das gewünschte Rekursionsflag zu deaktivieren, wenn autorisierende Suchvorgänge durchgeführt werden. Ein rekursiver Nameserver sollte autorisierende Server nicht auffordern, in seinem Namen eine Rekursion durchzuführen.
Andrew B.
quelle
Ich habe auf meinem lokalen Host einen rekursiven BIND-Namen eingerichtet, der wie folgt an die autorisierenden Nameserver für Domäne1 weitergeleitet wird: Zone "Domäne1". IN {Typ vorwärts; Spediteure {10.7.53.26; 10.7.53.128; 10.7.53.131; }; }; Aber ein dig @localhost für cfengine.domain1. an diesen lokalen Nameserver führt weiterhin dazu, dass named eine Anforderung für einen A-Datensatz mit rd auf den autorisierenden Nameserver sendet. Gibt es eine Zonendateioption, die ich noch nicht gefunden habe und die meinem lokalen Namen mitteilt, dass der Spediteur für die Zone maßgeblich ist?
Wsanders
Eine Problemumgehung besteht darin, den rekursiven Namen als Slave für Domäne1 einzurichten. Es scheint, dass ein Spediteur immer das rd-Flag setzt.
Wsanders
Hmm, ich werde morgen das Verhalten der Spediteure überprüfen. Ich hatte den Eindruck, dass Spediteure nicht eingestellt haben RD=1, aber ich habe dieses Verhalten möglicherweise mit Stichzonen verwechselt.
Andrew B