Wer "rekursiert" tatsächlich in einer rekursiven DNS-Suche?

16

Ich versuche den Unterschied zwischen iterativen und rekursiven DNS-Lookups zu verstehen. Grundsätzlich verstehe ich iterativ so, als würde man ein Kaufhaus anrufen, das nach einem Produkt sucht, und wenn es das nicht gibt, gibt man die Nummer einer anderen Filiale an, die man anrufen kann, und dann ruft man die andere Filiale selbst an. Versus rekursiv, die wie der Aufruf das Kaufhauses ist, und wenn sie nicht haben , was Sie nach, sie rufen Sie den anderen Zweig in Ihrem Namen für das Produkt suchen. Ich bekomme widersprüchliche Ansichten dazu, wenn es um DNS geht. Wenn ich an rekursiv denke, denke ich an etwas, das so aussieht: Alt-Text

Aber während ich Artikel im Web lese und sogar eine Google-Bildsuche nach rekursivem DNS durchführe , sehe ich weit mehr Beispiele, die so aussehen: Alt-Text

Für mich ist dieses zweite Beispiel eher iterativ als rekursiv, da jeder der "anderen DNS-Server" dem "bevorzugten DNS-Server" die Adresse des nächsten zu suchenden Computers mitteilt, anstatt sie im Namen des bevorzugten Computers nachzuschlagen DNS Server. Das einzige rekursive Element, das ich sehe, ist, dass der bevorzugte DNS-Server im Auftrag des DNS-Clients sucht, aber von nun an sieht es sicher iterativ aus.

Ich schätze, meine Frage ist: Bedeutet "rekursives" DNS-Lookup wirklich nur rekursiv im Sinne des bevorzugten DNS-Servers, der etwas im Namen des Clients tut, aber von nun an wirklich iterativ? Die meisten Ergebnisse, die ich in der Google-Bildersuche sehe, lassen mich glauben, dass dies, was dann die Frage aufwirft, das erste Bild in diesem Beitrag einfach falsch ist.

Bryce Thomas
quelle
Schauen Sie sich den unterhaltsamen und informativen Ask Mr DNS-Podcast an, der seit 1989 DNS verwaltet und jedes O'Reily-DNS-Buch usw. verfasst oder mitverfasst. Ask-mrdns.com Erfahren Sie mehr, als Sie jemals wissen wollten.
Ronald Pottol

Antworten:

16

Dein letzter Absatz ist korrekt.

Das vom Client im DNS-Anforderungsheader gesendete RD-Flag (Recursion Desired) (siehe RFC 1035) fragt den Server, ob die Frage vollständig beantwortet werden soll.

Dieser Server fragt dann iterativ die Kette von Nameservern nach der richtigen Antwort. Diese Abfragen sollten selbst kein gesetztes RD-Bit haben.

Letztendlich ist für die Antwort des rekursiven Servers das Flag "Recursion Available" (RA) gesetzt, was darauf hinweist, dass die Antwort tatsächlich vollständig beantwortet wurde. Umgekehrt setzt ein autorisierender Server das RA-Flag nicht.

IMHO, es ist eine schlechte Wahl der Terminologie.

Das erste Diagramm, das Sie gefunden haben, ist grundsätzlich falsch. Die Stammserver führen keine Abfragen an andere Server durch, sondern geben nur Verweise an andere Server aus.

Alnitak
quelle
4

Soweit ich es verstehe, ist "rekursives Nachschlagen" ausschließlich aus der Sicht des ursprünglichen Abfragers. Wenn es also einen DNS-Server fragt und eine vollständig aufgelöste Antwort zurückerhält, handelt es sich um eine "rekursive Abfrage". Wenn dieser Server seinerseits rekursive oder iterative Suchvorgänge durchführt, muss sich der ursprüngliche Abfrager nicht darum kümmern.

Vatine
quelle
1

Das erste der beiden Diagramme in Ihrer Frage ist falsch. Root-Server senden keine Anfragen an andere Server. Wenn die Stammserver tatsächlich Abfragen wie in diesem Diagramm weiterleiten würden, wäre das DNS-System für DoS-Angriffe viel anfälliger als es tatsächlich ist.

Das zweite Diagramm ist größtenteils korrekt, aber zu vereinfacht, um die rekursive Natur von Nachschlägen zu veranschaulichen. Das Diagramm ist jedoch immer noch so detailliert, dass wir darauf hinweisen können, wo eine Rekursion stattfindet.

Der DNS-Server neben der angegebenen Nummer ist 12der Server, auf dem die Preferred DNS serverRekursion stattfindet. Der Begriff Bevorzugter DNS-Server ist keine Standardterminologie. Dieser Server wird normalerweise als Caching-DNS-Recursor oder als Abkürzung dafür bezeichnet.

Wenn man den Netzwerkverkehr betrachtet, sieht er tatsächlich iterativ aus. Die Rekursion erfolgt vollständig intern im DNS-Recursor. Wenn Sie sich die Implementierung eines DNS-Recursors ansehen, werden Sie eine rekursive Struktur in der Behandlung von Anforderungen finden.

Die Rekursion ist möglicherweise leicht zu erkennen, wenn die Implementierung einen Thread pro Anforderung verwendet und die Lookups mithilfe von rekursiven Funktionsaufrufen implementiert werden. Effizientere Entwürfe verwenden jedoch keinen Thread pro Anforderung. Stattdessen befindet sich die Rekursion in den Datenstrukturen, die vom DNS-Recursor verwendet werden.

Der Grund dafür, dass eine Rekursion erforderlich ist, liegt darin, wie die Verweise zwischen den autorisierenden DNS-Servern implementiert werden. Dies lässt sich am besten anhand eines Beispiels veranschaulichen. Im Diagramm sehen Sie den autorisierenden DNS-Server, für den Sie auf den autorisierenden DNS-Server microsoft.comverweisen example.microsoft.com. Dies geschieht mit einem NSDatensatz, der auf einen Hostnamen zeigt. So könnte beispielsweise der autorisierende Server für microsoft.comden DNS-Recursor mitteilen, für den er autorisierend ms.example.netist example.microsoft.com.

Zu diesem Zeitpunkt müsste der DNS-Recursor aufgelöst werden, ms.example.netbevor er mit der Auflösung von fortfahren kann example.microsoft.com.

Um einen Hostnamen aufzulösen, muss zuerst ein anderer Hostname aufgelöst werden. Das ist Rekursion. Damit dies nicht zu einer unendlichen Rekursion führt, verfügt DNS über Leimdatensätze, die NSin bestimmten Fällen zusammen mit Datensätzen gesendet werden.

Kasperd
quelle
Darin liegen viele Fehler. Die Verwendung des Begriffs "Rekursion" hat nichts damit zu tun, ob "rekursive Funktionsaufrufe" verwendet werden - Vatines Antwort ist näher - Rekursion ist nur ein (schlecht gewählter) Name, wenn ein Client einen Server nach einer vollständig aufgelösten Antwort fragt . Der von den sogenannten "rekursiven Servern" verwendete Mechanismus wird tatsächlich als Iteration bezeichnet . Kleben Sie auch Datensätze zusammen und verhindern Sie nicht die "unendliche Rekursion" - sie verhindern das Problem "Huhn und Ei", wie Sie die Adresse der Nameserver finden, wenn sich diese Server im Bereich der delegierten Domäne befinden .
Alnitak
@Alnitak DNS-Auflösung ist von Natur aus rekursiv. Jeder rekursive Algorithmus kann iterativ werden, indem der Ausführungsstapel in eine andere Datenstruktur umgewandelt wird. Diese Möglichkeit ist in meiner Antwort bereits erwähnt. Und das von Ihnen erwähnte Problem der zyklischen Abhängigkeit unterscheidet sich nicht von einer unendlichen Rekursion. Die beiden sind wirklich dasselbe. Wenn Sie einen naiven rekursiven Algorithmus anwenden, ohne zu bemerken, dass die zugrunde liegende Aufgabe unter einer zyklischen Abhängigkeit leidet, ist das Ergebnis eine unendliche Rekursion.
Kasperd
@Alnitak Sie können den Rekursionsstapel nicht entfernen und die DNS-Auflösung nicht iterativ ausführen, indem Sie nur eine konstante Anzahl von DNS-Namen gleichzeitig verfolgen. Sie können den Rekursionsstapel mit einer anders aussehenden Datenstruktur darstellen, diese bleibt jedoch inhärent rekursiv. Es ist möglich, einen Domainnamen so zu konfigurieren, dass die Rekursionstiefe nur eins beträgt. Aber nicht alle Domainnamen sind so konfiguriert.
Kasperd
Ich zitiere RFC 1034 - "" Die beiden allgemeinen Lösungsansätze für dieses Problem sind "rekursiv", wobei der erste Server die Abfrage für den Client auf einem anderen Server ausführt, und "iterativ", wobei der Server den Client auf einen anderen verweist Server und lässt den Client die Abfrage verfolgen . "" Es hat nichts mit "Stacks" oder "Datenstrukturen" zu tun.
Alnitak
@Alnitak Dieser Absatz bezieht sich auf eine andere Art von Rekursion als meine Antwort. Die in meiner Antwort erwähnte Rekursion ist (wie in meiner Antwort klar angegeben) für einen bestimmten DNS-Server intern. Wenn Sie tatsächlich versuchen würden, die DNS-Rekursion vollständig iterativ zu implementieren, würde dies niemals funktionieren. Sobald Sie eine Antwort mit einem NS-Datensatz ohne zugehörigen Klebstoff erhalten, müssen Sie die IP-Adresse des Hostnamens ermitteln, auf den dieser NS-Datensatz verweist, bevor Sie mit der ursprünglichen Auflösung fortfahren können.
Kasperd