Erzwingen Sie Weiterleitungs-DNS-Anforderungen in den TCP-Modus


9

Ich habe einen DNS-Server auf SLES10 (derzeit Bindung 9.6) auf einem Multi-Homed-Server eingerichtet. Dieser Server kann von allen internen Netzwerken abgefragt werden und liefert Antworten für alle internen Netzwerke. Wir haben zwei separate DNS "Master" -Zonen. Jede dieser Zonen wird von einer Reihe autorisierender Windows-DNS-Server bedient.

Jetzt ist mein Linux-Server ein sekundärer DNS-Server für eine dieser Zonen (private interne Zone) und fungiert als Weiterleitung für die andere Zone (öffentliche interne Zone).

Bis vor kurzem funktionierte dieses Setup ohne Probleme. Jetzt erhalte ich - beim Abfragen der öffentlichen internen Zone (zB durch den hostBefehl auf einem Linux-Client) die Fehlermeldung

;; Abgeschnitten, erneuter Versuch im TCP-Modus

Ein Wireshark-Dump hat die Ursache dafür aufgedeckt: Die erste Abfrage wird im UDP-Modus ausgeführt, die Antwort passt nicht in UDP (aufgrund der längeren Liste autorisierender NS), dann wird sie im TCP-Modus wiederholt und liefert die richtige Antwort.

Nun die Frage: Kann ich meine Bindung so konfigurieren, dass die Weiterleitungen im TCP-Modus abgefragt werden, ohne zuerst UDP zu versuchen?

Update: Ich versuche mich an ASCII-Kunst ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+

Ein kleines Diagramm davon wäre nützlich - ich habe Mühe, anhand Ihrer Beschreibung herauszufinden, welcher Server welcher ist.
— Alnitak

etwas besser, obwohl immer noch unklar ist, zwischen welchen Hosts Sie diesen hostBefehl ausführen und welche Abfrage gesendet wird.
— Alnitak

Die Clients fordern über SLES10 die Einträge von der Zone public internal an. Die Zone privat intern leidet nicht - da dort nur 2 NS-Einträge vorhanden sind.
— Nils

und die Kunden sind einfach nur Stub-Resolver?
— Alnitak

Schlagen Sie vor, dass Sie minimal-responses: yesder BIND-Konfiguration auf SLES 10 hinzufügen - dies kann die Antwortgröße verringern. In jedem Fall überschreiten die meisten normalen Abfragen nicht das 512-Byte-Limit.
— Alnitak

Antworten:


8

Erstens würde ich das nicht als Fehler bezeichnen, sondern nur als Informationsnachricht.

Zweitens beantworten DNS-Server immer UDP-Abfragen (zumindest BIND, ich kann keine Optionen zum Deaktivieren von UDP finden), und Clients versuchen immer (?), Zuerst eine UDP-Abfrage zu senden (zum Beispiel gibt es in resolv.conf keine Optionen, um dies zu ändern noch in der JVM) - wenn sie in ein UDP-Paket passen (Anforderungen normalerweise)

Wenn Sie einen bestimmten Anwendungsfall haben, können Sie die Verwendung von TCP angeben, z. B. im Shell-Skript 'dig + tcp' oder 'host -T' zur Auflösung verwenden, und Sie können Systemaufrufe 'sethostent / gethostbyname / endhostent' verwenden (siehe man Seite), um TCP in anderen Fällen zu erzwingen.

Wenn Sie wirklich versuchen möchten, UDP zu blockieren, kann ich nur eine iptable-Regel sehen, aber ich bin nicht sicher, ob diese Einrichtung funktionieren würde. Ich gehe davon aus, dass die DNS-Auflösung einfach fehlschlagen würde.


Es ist nominell ein Leistungsvorteil, wenn Sie a priori wissen, dass die UDP-Abfrage fehlschlägt, und zuerst TCP ausprobieren. Siehe RFC 5966 für eine Diskussion darüber.
— Alnitak

@Alnitak und ich möchten diesen Vorteil erhalten.
— Nils

1
@Nils also müssen wir herausfinden, warum EDNS anscheinend nicht funktioniert ...
— Alnitak

Ich habe keinen speziellen Anwendungsfall - die Clients verwenden ihre Resolver-Bibliothek - aber jede Anfrage und jede Antwort wird zweimal über das Netzwerk gesendet - das gefällt mir nicht.
— Nils

@Nils, das Problem ist, dass der Client UDP / TCP entscheidet, der Server jedoch die Größe der Antwort kennt.
— Dan Andreatta

4

Ihr BIND-Server sollte EDNS verwenden (siehe RFC 2671), um UDP-Pakete zuzulassen, die länger als 512 Byte sind.

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

Dies sollte ermöglichen, dass Ihr großer NS-Satz über UDP abgerufen werden kann, ohne dass für andere kleinere Abfragen der Overhead einer TCP-Verbindung erforderlich ist.

Beachten Sie jedoch, dass dies tatsächlich die Standardwerte sind. Wenn EDNS nicht verwendet wird, blockiert es entweder etwas oder die Server, die die EDNS-Optionen erhalten, unterstützen es nicht.

Beachten Sie auch, dass hostEDNS nicht unterstützt wird. Es ist durchaus möglich, dass Ihre Weiterleitung -> Serverabfragen bereits EDNS verwenden, und Sie können es einfach nicht sehen, wenn Sie es mit Ihrem lokalen Client versuchen.

Versuchen Sie es dig +bufsize=4096 @server hostname Aanstatt zu verwenden host.


Wer sollte das benutzen? Vermutlich sowohl mein Server als auch meine Spediteure aus der Zone "public internal"?
— Nils

Was bedeutet es überhaupt, die vollständige Liste der NS in der Antwort zu senden?
— Nils

@Nils das DNS-Protokoll erfordert, dass der vollständige Satz von Einträgen, die mit demselben Tupel (QNAME, QTYPE und QCLASS) übereinstimmen, unteilbar ist (auch bekannt als "RRset")
— Alnitak

Können Sie mich bitte bezüglich dieses RRset auf den RFC hinweisen?
— Nils

1
Actaully Host verwendet die Standard-Resolver-Bibliothek und unterstützt auf meiner Workstation EDNS0. Um zu testen, ob die Anforderungen EDNS0 angeben, führen Sie 'tcpdump -x port 53' aus, und der Hex-Dump sollte (gegen Ende im zusätzlichen Abschnitt) die Sequenz 0029 1000 0000 8000 0000 enthalten, die die binäre Darstellung der OPT RR ist.
— Dan Andreatta
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.