DNS-Auflösung schlägt für Ping und Curl fehl, aber nicht für Dig

Ich verwende DNSMasq als lokalen DNS-Server, damit ich auflösen kann *.local.pcfdev.io(wie hier besprochen Using PCF Dev Offline with Mac OS X ). Alles hat funktioniert, als ich die Dinge zum ersten Mal eingerichtet habe.

Ein paar Tage später, nach ein paar Neustarts meines MacBooks, kann ich offline Dinge wie api.local.pcfdev.iodie Verwendung von curloder nicht mehr lösen ping. Tut digjedoch das Richtige.

$ dig api.local.pcfdev.io

; <<>> DiG 9.8.3-P1 <<>> api.local.pcfdev.io
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46877
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;api.local.pcfdev.io.       IN      A

;; ANSWER SECTION:
api.local.pcfdev.io.    0       IN      A       192.168.11.11

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Sep  6 10:17:44 2016
;; MSG SIZE  rcvd: 53

$ curl api.local.pcfdev.io
curl: (6) Could not resolve host: api.local.pcfdev.io

Ich habe versucht, -AlwaysAppendSearchDomainsals Argument zu /usr/sbin/mDNSResponderin hinzuzufügen /System/Library/LaunchDaemons/com.apple.mDNSResponder.plistund den mDNSResponder mit neu zu starten launchctl, aber ohne Erfolg.


AKTUALISIERUNG 1

Auf der richtigen lokalen IP ist definitiv etwas zu hören:

$ nslookup api.local.pcfdev.io
Server:     127.0.0.1
Address:        127.0.0.1#53

Name:   api.local.pcfdev.io
Address: 192.168.11.11

$ ping api.local.pcfdev.io
ping: cannot resolve api.local.pcfdev.io: Unknown host

$ telnet 192.168.11.11 80
Trying 192.168.11.11...
Connected to 192.168.11.11.
Escape character is '^]'.

HTTP/1.1 400 Bad Request

Connection closed by foreign host.

AKTUALISIERUNG 2

Nachdem ich den unten stehenden Vorschlag ausprobiert habe, alle DNS-Server aus den Netzwerkeinstellungen zu entfernen, außer 127.0.0.1, kann ich nichts lösen. Ich habe es geschafft, einige Debug-Abmeldungen zu erhalten mDNSResponder:

mDNSResponder[91]:  74: DNSServiceCreateConnection START PID[32612](ping)
mDNSResponder[91]:  74: Error socket 75 created 00000000 00000001
mDNSResponder[91]:  74: DNSServiceQueryRecord(15000, 0, api.local.pcfdev.io., Addr) START PID[32612]()
mDNSResponder[91]:  74: Error socket 75 closed  00000000 00000001 (0)
mDNSResponder[91]:  74: DNSServiceQueryRecord(api.local.pcfdev.io., Addr) ADD    0 api.local.pcfdev.io. Addr
mDNSResponder[91]:  74: Cancel 00000000 00000001
mDNSResponder[91]:  74: DNSServiceQueryRecord(api.local.pcfdev.io., Addr) STOP PID[32612]()
mDNSResponder[91]:  74: DNSServiceCreateConnection STOP PID[32612](ping)

Ich habe das auch beobachtet, wie in der vorgeschlagenen Antwort erläutert, nslookupund es wird dignichts von protokolliert mDNSResponder, aber andere Tools ( ping, curl) tun es.

Es scheint also, als ob es aus irgendeinem Grund entweder dnsmasqnicht funktioniert (ich kann eine TCP-Verbindung zu herstellen 127.0.0.1:53) oder mDNSResponderes nicht verwendet.


AKTUALISIERUNG 3

etc/resolve.confverschwindet, wenn mein WLAN-Adapter aktiv ist, ich aber nicht mit einem Netzwerk verbunden bin. Könnte dies der Grund sein, warum CLI-Tools den lokalen dnsmasqServer nicht verwenden?

Ist Ihr Netzwerkadapter zufällig ausgefallen? Wenn Sie in den Systemeinstellungen zu „Netzwerk“ gehen, befindet sich neben dem Adapter, für den dnsmasq konfiguriert ist, ein grüner Punkt?
Nun, ich bin in einem Zug ohne Wi-Fi, also vermutlich.
Insbesondere ist der WLAN-Adapter ausgeschaltet? Wenn dies der Fall ist, versuchen Sie es bitte erneut mit eingeschaltetem WLAN-Adapter (auch wenn dieser möglicherweise nicht mit dem Internet verbunden ist). Damit die Einrichtung funktioniert, muss dnsmasq ein DNS-Server auf der verwendeten Netzwerkschnittstelle sein .
Danke, dass du versucht hast, das aufzuspüren. Ich kämpfe auch damit, verstehe nicht, warum "curl foo:8989" den Host nicht finden kann, aber "dig foo" kann. Ja, "curl 172.20.0.17:8989" funktioniert einwandfrei. Wie Sie habe ich das DNS des Wi-Fi-Netzwerks auf 127.0.0.1 eingestellt (ein dnsmasq, der in einem Docker-Container ausgeführt wird). FWIW In meiner aktuellen Situation ist das Problem spezifisch für das WLAN-Netzwerk, mit dem ich mich verbinde – funktioniert gut auf meinem persönlichen Hotspot, das Problem liegt in einem Coffeeshop-WLAN.
Ich habe die fraglichen Programme nicht zurückentwickelt, aber ich gehe davon aus, dass sie völlig unterschiedliche Codebasen für die DNS-Auflösung aufrufen, und deshalb sehen Sie einen Bruch - einige zeigen lokal, andere nicht. Ich würde wahrscheinlich in Instrumente / Profiler / Debugger eintauchen curloder wgetsie abrufen und sehen, was wirklich passiert, um den Fehler zu verursachen, der nicht behoben werden konnte.

Antworten (3)

Hatte das gleiche Problem. Ich denke, der lokale DNS-Cache hatte schlechte Daten von meinen vorherigen Tests. Es wurde schnell behoben von:

sudo killall -HUP mDNSResponder
Ich habe das bemerkt pingund digmanchmal unterschiedliche IP-Adressen zurückgegeben (normalerweise mit Split-Horizon-DNS), und dieser Befehl behebt das Problem. Was die eigentliche Ursache ist, bin ich mir leider nicht sicher.

dig einerseits und curl/ping andererseits rufen Daten von verschiedenen Hosts ab:

dig fragt einen DNS-Server – in Ihrem Fall Ihren localhost (127.0.0.1) – nach einem Datenbankeintrag ab: die IP-Adresse bezogen auf den FQDN api.local.pcfdev.io. Der Host selbst muss nicht ausgeführt werden oder überhaupt existieren.

curl/ping versuchen, eine IP-Adresse mit mDNSResponder oder auf andere Weise aufzulösen und schließlich auf dem Remote-Host zu arbeiten/mit ihm zu interagieren. Wenn der Host 192.168.11.11 nicht läuft oder gar nicht existiert, schlagen beide fehl.

Nun ist entweder der DNS-Eintrag falsch (api.local.pcfdev.io hat eine andere IP als 192.168.11.11) oder der DNS-Eintrag ist richtig, aber der Host 192.168.11.11 läuft nicht.


Das Hinzufügen von -AlwaysAppendSearchDomains als Argument zu /usr/sbin/mDNSResponder in /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist wird nicht empfohlen. Stattdessen sollten Sie es zu /Library/Preferences/com.apple.mDNSResponder.plist hinzufügen (Quelle: man mDNSResponder):

Damit mDNSResponder beim Start unter OS X 10.11 (El Capitan) und höher mit diesen optionalen Argumenten ausgeführt wird, setzen Sie die booleschen Schlüssel AlwaysAppendSearchDomains oder NoMulticastAdvertisements in /Library/Preferences/com.apple.mDNSResponder.plist auf true und starten Sie neu.

In Ihrem Fall ist es überhaupt nicht erforderlich, diesen Schlüssel zu setzen, da dies nicht die Ursache Ihres Problems ist.


Nachdem ich mich mit VirtualBox, PCF Dev (das wiederholt mit einigen "falschen Anmeldeinformationen" beim Versuch, sich bei der VM anzumelden, fehlgeschlagen sind) und dnsmasq beschäftigt habe, empfehle ich, DNS-Abfragen nur auf dnsmasq zu übertragen:

  • Entfernen Sie in Systemeinstellungen > Netzwerk > Schnittstelle > DNS-Server alle DNS-Server außer 127.0.0.1 und übernehmen Sie die Änderungen. Sie können auch einen zweiten Standort mit einem reinen 127.0.0.1-Setup konfigurieren und Ihren aktuellen DNS-Server in der anderen Konfiguration behalten.
  • fügen Sie eine Datei /usr/local/etc/resolv.dnsmasq.conf mit dem Inhalt hinzu

    #use your preferred DNS servers here. In the example I use some Google name servers
    nameserver 8.8.8.8
    nameserver 8.8.4.4
    
  • fügen Sie resolv-file=/usr/local/etc/resolv.dnsmasq.confin Zeile ~46 von /usr/local/etc/dnsmasq.conf hinzu
  • address=/.local.pcfdev.io/192.168.11.11Fügen Sie Zeile ~80 von /usr/local/etc/dnsmasq.conf hinzu oder verschieben Sie sie
  • Neustart von dnsmasq mit:

    sudo launchctl stop homebrew.mxcl.dnsmasq
    sudo launchctl start homebrew.mxcl.dnsmasq
    
Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten. Da ist definitiv was zu hören 192.168.11.11; Der eigentliche öffentliche DNS-Eintrag *.local.pcfdev.ioverweist immer auf dieselbe lokale IP. Sobald ich mich also mit den Infowebs verbinde, curlmuss ich eine Antwort von diesem DNS-Server erhalten und herausfinden, welche IP-Adresse verwendet werden soll.
Es sieht so aus, als ob curl, ping, und die anderen Binärdateien, die ich auf dieses Ding treffen möchte, ein Mittel zum Nachschlagen von DNS-Einträgen verwenden (das nicht den dnsmasqServer auf localhost verwendet), und nslookupein diganderes Mittel verwenden. Ich denke, ich muss mehr über mDNSResponder erfahren!
@EngineerBetter Haben Sie andere Einträge in Systemeinstellungen> Netzwerk> Schnittstelle> DNS als 127.0.0.1? - Ich werde die gesamte Suite (VBox, PCF Dev etc.) installieren und dies überprüfen ... Irgendeine spezielle Konfiguration?
Nochmals vielen Dank, dass Sie sich die Zeit genommen haben, mir dabei zu helfen. Frage wurde aktualisiert, immer noch kein Glück.

Ich habe viel länger gebraucht, um das zu lösen, als es hätte tun sollen. Nach dem Neustart von mDNSResolver dutzende Male, wie in anderen Threads empfohlen:

sudo killall -HUP mDNSResponder

Ich habe endlich mal was anderes probiert. Ich habe Wi-Fi deaktiviert und alle meine bevorzugten Netzwerke gelöscht. Dann habe ich die Wi-Fi-Verbindung wiederhergestellt und alles funktionierte gut:

  1. Apple-Menü -> Systemeinstellungen -> WLAN (links)
  2. „WLAN ausschalten“ und dann „Erweitert“ auswählen
  3. Löschen Sie die WLAN-Verbindung, mit der Sie Probleme haben (oder alle, wenn Sie möchten). Wählen Sie dazu das Wi-Fi-Netzwerk aus, das Sie löschen möchten, und drücken Sie "-".
  4. Klicken Sie auf „Übernehmen“ und „OK“.
  5. Schalten Sie WLAN wieder ein.
  6. Wählen Sie Ihr WLAN-Netzwerk aus und melden Sie sich erneut an.

YMMV, aber das hat endlich für mich funktioniert. Es hätte wahrscheinlich das erste sein sollen, was ich probiert habe.