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.conf
Aussehen sieht also so aus:
search my-domain.com
nameserver 8.8.4.4
nameserver 8.8.8.8
Mein nsswitch.conf
hat die Linie:
hosts: files dns
und meine /etc/hosts
enthä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 ltrace
Ausgabe [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, tcpdump
dass der Nameserver sofort geantwortet hat und erst bei der zweiten Antwort die telnet
Blockierung 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.conf
damit ich in die addrinfo
Struktur sehen kann.
Antworten:
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()
undgethostbyname()
besteht darin, dass ersteres sowohl IPv4 als auch IPv6 unterstützt, während letzteres nur IPv4 unterstützt. Also , wenn Sie anrufengetaddrinfo()
mitai_family
auf 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
tcpdump
Ausgaben 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 abertelnet ifconfig.me
fast sofort dieTrying <IP_address_here>...
Zeile gedruckt (was bedeutet, dass der Name bis dahin bereits behoben ist).quelle
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
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:
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.
quelle