Wie ist es möglich, dass ich einen Host-Lookup durchführen kann, aber keinen Curl?


20

Hat das schon mal jemand gesehen? Beachten Sie, dass dies nicht nur bei google.com geschieht, sondern bei jeder Domain, die ich versuche. Es ist eine drahtlose Verbindung (WEP), aber ich bin nicht sicher, wie das relevant wäre:

$ curl -v google.com
# This takes about 60s to return
* getaddrinfo(3) failed for google.com:80
* Couldn't resolve host 'google.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'google.com'

$ wget google.com
--2011-11-28 14:44:08--  http://google.com/
Resolving google.com... failed: Name or service not known.
wget: unable to resolve host address `google.com'

$ ping google.com
PING google.com (209.85.148.147) 56(84) bytes of data.
64 bytes from fra07s07-in-f147.1e100.net (209.85.148.147): icmp_req=2 ttl=54 time=136 ms
64 bytes from fra07s07-in-f147.1e100.net (209.85.148.147): icmp_req=3 ttl=54 time=34.0 ms
64 bytes from fra07s07-in-f147.1e100.net (209.85.148.147): icmp_req=4 ttl=54 time=34.3 ms
64 bytes from fra07s07-in-f147.1e100.net (209.85.148.147): icmp_req=5 ttl=54 time=42.5 ms
64 bytes from fra07s07-in-f147.1e100.net (209.85.148.147): icmp_req=6 ttl=54 time=44.7 ms
64 bytes from fra07s07-in-f147.1e100.net (209.85.148.147): icmp_req=7 ttl=54 time=34.5 ms
^C
--- google.com ping statistics ---
8 packets transmitted, 6 received, 25% packet loss, time 7007ms
rtt min/avg/max/mdev = 34.063/54.376/136.026/36.758 ms


$ host google.com
google.com has address 209.85.148.106
google.com has address 209.85.148.147
google.com has address 209.85.148.99
google.com has address 209.85.148.103
google.com has address 209.85.148.104
google.com has address 209.85.148.105
google.com mail is handled by 30 alt2.aspmx.l.google.com.
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.

$ host google.com 192.168.1.201
Using domain server:
Name: 192.168.1.201
Address: 192.168.1.201#53
Aliases: 

google.com has address 209.85.148.103
google.com has address 209.85.148.104
google.com has address 209.85.148.105
google.com has address 209.85.148.106
google.com has address 209.85.148.147
google.com has address 209.85.148.99
google.com mail is handled by 40 alt3.aspmx.l.google.com.
google.com mail is handled by 50 alt4.aspmx.l.google.com.
google.com mail is handled by 10 aspmx.l.google.com.
google.com mail is handled by 20 alt1.aspmx.l.google.com.
google.com mail is handled by 30 alt2.aspmx.l.google.com.

$ cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.1.201

$ cat /etc/hosts
127.0.0.1       localhost
::1             localhost

$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.254   0.0.0.0         UG        0 0          0 wlan0
127.0.0.0       127.0.0.1       255.0.0.0       UG        0 0          0 lo
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 wlan0

Grundsätzlich kann keine Anwendung, einschließlich Firefox, Namenssuchen durchführen. Außerdem ist alles in Ordnung, wenn ich das WLAN offline schalte und ein Ethernet-Kabel einstecke.


1
Vielleicht noch ein paar Infos hinzufügen - ist es nur Locken? Was ist mit wget, Browsern, Ping usw.?
Sandman4

Ich sehe, dass Sie eine Antwort markiert haben, aber was genau war das Problem und die Lösung? War es ein SELinux-Problem?
Belmin Fernandez

Die "Lösung" war nur, dass das Netzwerk anscheinend richtig kaputt ist. Ich betreibe kein SELinux auf dem Laptop und das "Netzwerk" wird nur von einem beschissenen, im Laden gekauften WLAN-Router verwaltet. Diese Antwort half mir herauszufinden, dass ich überall Pakete fallen ließ, also dachte ich, dass es etwas war, das ich nicht lösen konnte, und gab diesem Kerl die Ehre. Warum hast du eine bessere Idee?
Daniel Quinn

pingruft getaddrinfo mit leicht abweichenden Parametern auf github.com/iputils/iputils/blob/master/ping/ping.c#L574 ai_protocol = IPPROTO_UDP vielleicht verwirrt das getaddrinfo irgendwie anders? Es scheint, dass der hostBefehl auch nicht immer verwendet wird: unix.stackexchange.com/a/553438/8337
rogerdpack

Antworten:


8

Vielleicht haben Sie einige sehr seltsame und restriktive SELinux-Regeln (oder Sicherheitsregeln ...)?

Wenn nicht, versuchen Sie strace -o /tmp/wtf -fF curl -v google.com, aus der /tmp/wtfAusgabedatei herauszufinden, was los ist.


1
Sieht aus wie es die WLAN-Verbindung selbst ist. Die Ausgabedatei ist voll von Sachen wie 9344 poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
Daniel Quinn

@ Daniel Quinn, können Sie die Ausgabe von posten /tmp/wtf?
Sachin Divekar

Hier ist die Ausgabe: pastebin.com/1y5Z48NK
Daniel Quinn

Hmm, sieht so aus, als würde die Abfrage auf 192.168.1.201 ausgeführt. Können Sie "google.com 192.168.1.201 hosten" für geistige Gesundheit tun? Grundsätzlich richtet sich die DNS-Suche speziell an Ihren DNS-Server.
cjc

Fertig (zur Frage hinzugefügt). Und das funktioniert einwandfrei - was Sinn macht, da die Ausgabe von Hosts ohne Serverargument ebenfalls korrekt funktioniert. Es sieht so aus, als wären es auch nur tatsächliche HTTP-Aufrufe, da ICMP (meistens wird der erste Ping verworfen) funktioniert.
Daniel Quinn

8

Verwenden Sie dazu: https://www.centos.org/modules/newbb/viewtopic.php?topic_id=39343

Ich habe einen Tastaturbefehl gefunden, der mir bei der Fehlerbehebung geholfen hat:

[root @ localhost ~] # wget -6 URL fehlgeschlagen

[root @ localhost ~] # wget -4 URL funktioniert

Dies hat etwas mit dem Standard-IPv6-Stack zu tun, der bei bestimmten Utils Probleme verursacht. Deaktivieren Sie ipv6 zum Auflösen.


5

Überprüfen Sie Ihre /etc/nsswitch.conf. Wenn in der hostsZeile so etwas steht

hosts:      files dns

Ich bin so verwirrt wie du. Aber wenn es so aussagt

hosts:      files

Dann hosthilft die Tatsache, dass DNS funktioniert (siehe Ausgabe des Befehls), nicht beim Einrollen, da die Namensauflösung über die Standard-Betriebssystembibliotheken erfolgt, die angewiesen wurden, das DNS nicht zu verwenden.


Hmm. Ich hatte nicht daran gedacht, aber ich habe es nur überprüft und es steht, files dnsalso denke ich, dass es nicht so ist :-(
Daniel Quinn

1
In meiner gab es viel mehr Zeug auf der Hosts-Linie. "dns" wurde nach "[NOTFOUND = return]" aufgeführt, was meines Wissens dazu führt, dass das System nicht gefunden wird, bevor nicht einmal die konfigurierten DNS-Server überprüft wurden! Das Verschieben von "dns" nach, bevor das nicht gefundene Problem mein System reparierte (musste neu gestartet werden).
Trebormf

3

Ich hatte das gleiche Problem - Host, Nslookup löst ok, Curl - kann nicht auf den gleichen Hostnamen.

Nach tcpdumping-Kommunikation stellte ich fest, dass curl versucht, eine TCP-Verbindung (zusätzlich zu UDP) zum DNS-Port herzustellen, der in meinem Router geschlossen wurde. Nachdem TCP-Port 53 aktiviert wurde, begann Curl einwandfrei zu funktionieren.

Eine andere seltsame Sache ist, dass dieses Problem nicht auftritt, wenn der DNS-Server eine reguläre Bindungsinstallation durchführt. Wenn ich in Router eingebetteten DNS-Server verwende, versucht curl plötzlich, TCP-Ports zu verwenden, auch wenn er bereits vor 2ms (!) Eine Antwort über UDP erhalten hat. Ich vermute, das ist ein Fehler.


1

Ich hatte heute dasselbe Problem mit meinem VE (läuft auf meinem Laptop) und fand es ziemlich überraschend. Dig und NSlookup funktionieren, aber Curl schlägt fehl.

Also zum Beispiel:

# curl -v google.com
* getaddrinfo(3) failed for google.com:80
* Couldn't resolve host 'google.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'google.com'

Aber als ich den Beitrag von David T hier sah, beschloss ich, es mit Locken zu versuchen. Während dies fehlschlägt:

# curl  google.com -6
curl: (6) Couldn't resolve host 'google.com'

Das gelingt:

# curl  google.com -4
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Die -6 gibt an, dass Curl IPv6 verwendet, und die -4, um IPv4 zu verwenden. Ich bekomme die gleichen Fehler bei der Verwendung von wget, also definitiv einige Probleme mit dem IPv6-Stack auf dem Host.

Alle anderen Änderungen an der Datei nsswitch.conf und anderen BIND conf-Dateien haben nicht geholfen, da das Problem nicht bei diesen Dienstprogrammen liegt.


1

Wenn dies bei Personen auftritt, die versuchen, DNS für eine AWS EC2-Instanz einzurichten, müssen Sie auch die IPv6-Regeln (:: / 0) für HTTP und HTTPS in der von dieser Instanz verwendeten Sicherheitsgruppe aktivieren.


0

War Ihre Curl-Installation reibungslos? Versuchen Sie nach Möglichkeit, curl erneut zu installieren.

Versuchen Sie curl -v google.com, eine ausführlichere Ausgabe für das Debuggen zu erhalten.

z.B:

curl -v dnserror.test
* getaddrinfo(3) failed for dnserror.test:80
* Couldn't resolve host 'dnserror.test'
* Closing connection #0
curl: (6) Couldn't resolve host 'dnserror.test'

Erhalten Sie ähnliche Ergebnisse?


Genau das gleiche :-( Ich habe die Frage mit der Ausgabe aktualisiert.
Daniel Quinn

0

Möglicherweise liegt ein Fehler in Ihrer Datei /etc/resolv.conf vor, den nslookup toleriert, Curl jedoch nicht.

Die gestellte Frage lautete: "Wie ist es möglich, dass ich einen Host-Lookup durchführen kann, aber keinen Curl?"

Dies ist möglich, weil curl den FQDN mit getaddrinfo () auflöst, nslookup nicht. Stattdessen, glaube ich, analysiert nslookup /etc/resolv.conf mithilfe einer anderen Funktion oder Bibliothek oder über seinen eigenen benutzerdefinierten Code. Ich habe mir den Quellcode nicht angesehen, um dies zu überprüfen, aber Sie können dies beweisen, indem Sie in /etc/resolv.conf ein Leerzeichen vor dem Nameserver-Token einfügen. nslookup kann dies analysieren, getaddrinfo () jedoch nicht.


Example /etc/resolv.conf
 nameserver 8.8.8.8

Wenn Ihre resolv.conf diesen Fehler aufweist oder andere Fehler, die von nslookup, aber nicht von getaddrinfo () toleriert werden, können Sie einen vollqualifizierten Domänennamen mit nslookup auflösen, aber Sie können Curl für diesen vollqualifizierten Domänennamen nicht verwenden.

Fix: Bearbeiten Sie als root /etc/resolv.conf und entfernen Sie alle führenden Leerzeichen in der Nameserver-Zeile.


In der straceAusgabe werden DNS-Abfragen angezeigt, die gesendet werden, ohne Antworten zu erhalten. Das stützt die Hypothese eines Parsing-Fehlers nicht weiter /etc/resolv.conf. Es ist jedoch möglich, dass der Rekorder fehlerhaft ist, und die Verwendung eines anderen Rekorders könnte Abhilfe schaffen.
Kasperd
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.