DNS-Suchvorgänge dauern manchmal 5 Sekunden

11

Ich habe eine VM mit Debian Wheezy, auf der einige Hostnamensuchen einige Sekunden dauern, obwohl der Resolver sofort antwortet. Seltsamerweise sind Lookups mit getaddrinfo()betroffen, aber gethostbyname()nicht.

Ich habe zu den Google-Resolvern gewechselt, um die Möglichkeit auszuschließen, dass die lokalen defekt sind. Mein /etc/resolv.confAussehen sieht also so aus:

search my-domain.com
nameserver 8.8.4.4
nameserver 8.8.8.8

Mein nsswitch.confhat die Linie:

hosts: files dns

und meine /etc/hostsenthält nichts ungewöhnliches.

Wenn ich es versuche telnet webserver 80, bleibt es einige Sekunden lang hängen, bevor eine Namensauflösung angezeigt wird. Eine ltraceAusgabe [1] zeigt an, dass sich der Hang in einem getaddrinfo()Anruf befindet:

getaddrinfo("ifconfig.me", "telnet", { AI_CANONNAME, 0, SOCK_STREAM, 0, 0, NULL, '\000', NULL }, 0x7fffb4ffc160) = 0 <5.020621>

Es zeigt sich jedoch, tcpdumpdass der Nameserver sofort geantwortet hat und erst bei der zweiten Antwort die telnetBlockierung aufgehoben hat. Die Antworten sehen identisch aus:

05:52:58.609731 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:52:58.609786 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:52:58.612188 IP 8.8.4.4.53 > 192.168.1.75.43017: 54755 4/0/0 A 219.94.235.40, A 133.242.129.236, A 49.212.149.105, A 49.212.202.172 (93)

[...five second pause...]

05:53:03.613811 IP 192.168.1.75.43017 > 8.8.4.4.53: 54755+ A? ifconfig.me. (29)
05:53:03.616424 IP 8.8.4.4.53 > 192.168.1.75.43017: 54755 4/0/0 A 219.94.235.40, A 133.242.129.236, A 49.212.149.105, A 49.212.202.172 (93)
05:53:03.616547 IP 192.168.1.75.43017 > 8.8.4.4.53: 26090+ AAAA? ifconfig.me. (29)
05:53:03.618907 IP 8.8.4.4.53 > 192.168.1.75.43017: 26090 0/1/0 (76)

Ich habe die Host-Firewall-Protokolle überprüft und nichts an Port 53 wird blockiert.

Was bewirkt, dass die erste DNS-Antwort ignoriert wird?

[1] Ich habe ein paar Zeilen zu meiner hinzugefügt, ltrace.confdamit ich in die addrinfoStruktur sehen kann.

Flup
quelle
Wie ist das NIC-Setup der VM? Überbrückt? NAT?
slm
Es ist NATted. Ich bin mir nicht sicher, wo genau das NAT angewendet wird (ob von ESX oder weiter stromaufwärts). Ich kann herausfinden, ob Sie denken, dass es wichtig sein könnte.
Flup
Ich würde vermuten, dass es die NAT + VM ist, die dies beeinflusst.
slm
Könnte gut sein - siehe meine Kommentare zu Kempnius Antwort unten.
Flup
Es war netzwerkartig, aber nicht speziell NAT, das dies verursachte - siehe meine Antwort unten.
Flup

Antworten:

13

Die erste DNS-Antwort wird nicht ignoriert. getaddrinfo()wurde erst zurückgegeben, als die Antwort auf die erste AAAA-Abfrage (ID: 26090) empfangen wurde. Das eigentliche Problem hierbei ist, dass Ihr Computer die Antwort auf die AAAA-Abfrage nicht sofort erhalten hat, während er die Antwort auf die A-Abfrage erhalten hat (ID: 54755).

Einer der Unterschiede zwischen getaddrinfo()und gethostbyname()besteht darin, dass ersteres sowohl IPv4 als auch IPv6 unterstützt, während letzteres nur IPv4 unterstützt. Also , wenn Sie anrufen getaddrinfo()mit ai_familyauf 0 ( AF_UNSPEC), wird es nicht zurück , bis er eine Antwort bekommt (oder abgeblockt Timeout) für beiden A und AAAA - Abfragen für die Domain - Namen zur Verfügung gestellt. gethostbyname()Nur Abfragen für einen A-Datensatz.

Es ist schwierig, aus der Ferne festzustellen, was Ihr Problem verursachen kann, insbesondere, dass Sie einige tcpdumpAusgaben abgeschnitten haben . Möglicherweise wird der DNS-Verkehr zwischen Ihrer VM und den öffentlichen DNS-Resolvern von Google selektiv gefiltert / gelöscht. Ich habe versucht, Ihr Problem mit einer KVM Debian Wheezy VM zu reproduzieren, habe aber telnet ifconfig.mefast sofort die Trying <IP_address_here>...Zeile gedruckt (was bedeutet, dass der Name bis dahin bereits behoben ist).

Kempniu
quelle
Vielen Dank für Ihre ausführliche Antwort. Ich habe nichts aus dem tcpdump herausgeschnitten, sondern nur eine Zeile eingefügt, um zu verdeutlichen, wo die Pause war. Du hast mir definitiv etwas gegeben, um weiterzumachen; Ich habe den signifikanten Unterschied zwischen den beiden Bibliotheksaufrufen nicht erkannt.
Flup
Wenn keine DNS-bezogenen Pakete mehr auf Ihren Computer gelangen, filtert wahrscheinlich etwas den Datenverkehr (nicht unbedingt absichtlich). Wenn Sie eine Lösung finden, teilen Sie diese bitte hier mit.
Kempniu
1
Ich werde in der Tat. Nachdem ich einen Test-Resolver eingerichtet habe, kann ich schlüssig sehen, dass jedes Mal ein Antwortpaket - das aus meiner Frage - verworfen wird. Ich vermute, dass etwas in oder in der Nähe der VMware-Infrastruktur dies tut, also habe ich meinen Kollegen kontaktiert, der sich um diese Seite kümmert. Wenn ich dem auf den Grund gehe, komme ich zurück und füge Details hinzu. Danke noch einmal!
Flup
Lösung in meiner eigenen Antwort hinzugefügt. Nochmals vielen Dank für Ihre Hilfe.
Flup
9

Dies wurde durch einen zu restriktiven Regelsatz in einer Juniper-Firewall verursacht, die sich vor der VMware-Infrastruktur befindet.

Ich baute einen Test-Resolver, damit ich beide Seiten des Gesprächs sehen konnte, und das fehlende Paket, das Kempniu in seiner ausgezeichneten Antwort identifiziert hatte, wurde tatsächlich irgendwo auf dem Weg abgelegt. Wie in dieser Antwort getaddrinfo()angegeben, wartet keine angegebene Adressfamilie auf Antworten, die sich auf alle unterstützten Familien beziehen, bevor sie zurückkehren (oder in meinem Fall eine Zeitüberschreitung).

Mein Kollege, der das Netzwerk betreibt, hat das bemerkt

Das Standardverhalten in der Juniper-Firewall besteht darin, eine DNS-bezogene Sitzung zu schließen, sobald eine DNS-Antwort empfangen wird, die dieser Sitzung entspricht.

Die Firewall sah also die IPv4-Antwort, stellte fest, dass sie die Abfrage der VM beantwortete, und schloss den eingehenden Pfad für diesen Port. Das folgende IPv6-Antwortpaket wurde daher verworfen. Ich habe keine Ahnung, warum beide Pakete es zum zweiten Mal geschafft haben, aber das Deaktivieren dieser Funktion in der Firewall hat das Problem behoben.

Dies ist ein verwandter Auszug aus der Juniper KB:

Hier ist ein Szenario, in dem DNS-Antwortpakete verworfen werden:

  1. Eine Sitzung für den DNS-Verkehr wird erstellt, wenn das erste DNS-Abfragepaket die Firewall erreicht und eine Berechtigungsrichtlinie konfiguriert ist. Das Standardzeitlimit beträgt 60 Sekunden.
  2. Unmittelbar vor dem Schließen der Sitzung wird eine neue DNS-Abfrage übertragen. Da sie mit einer vorhandenen Sitzung übereinstimmt (da Quell- und Zielport / IP-Paar immer identisch sind), wird sie von der Firewall weitergeleitet. Beachten Sie, dass das Sitzungszeitlimit nicht entsprechend einem neu ankommenden Paket aktualisiert wird.
  3. Die erstellte DNS-Sitzung ist veraltet, wenn die erste DNS-Abfrageantwort (Antwort) das Gerät erreicht, unabhängig davon, wie lange das Zeitlimit noch besteht.
  4. Wenn eine DNS-Antwort durch die Firewall geleitet wird, ist die Sitzung veraltet.
  5. Alle nachfolgenden DNS-Antworten werden von der Firewall gelöscht, da keine Sitzung vorhanden ist.

Wenn Sie daran denken, diese Antwort zu verbessern, stimmen Sie bitte auch die Antwort von Kempniu zu. Ohne sie würde ich immer noch versuchen, ein Konfigurationsproblem auf der VM zu finden.

Flup
quelle
1
Wir haben die gleichen Symptome bei Debian 8.2 erlebt. Unsere waren auf eine andere Ursache zurückzuführen, und die "Lösung" war anders (clientseitig). Ich habe über unser spezifisches Problem und das allgemeinere Problem gebloggt : philippecloutier.com/… Ich möchte Flup und Kempniu danken, da Ihre Frage und Ihre Antworten mich auf den richtigen Weg gebracht haben.
Philippe Cloutier