DNS-Lookups schlagen zB mit `ping` fehl, funktionieren aber mit` host`

35

Ich verwende pfSense 2.0rc3 und habe es als DNS-Weiterleitung eingerichtet und "DHCP-Leases in DNS-Weiterleitung registrieren" aktiviert. Ich verstehe, dass dies alle geeigneten Einstellungen sind, um den DNS-Server für lokale Suchvorgänge abzurufen.

Es funktioniert wie erwartet mit Linux und insbesondere kann ich host abcund ping abc(und andere Anwendungen) ausführen und sie funktionieren alle wie erwartet.

In Mac OS X Lion 10.7 funktioniert dies jedoch nicht wie erwartet. Insbesondere hostscheinen nur Lookups mit dem Befehl zu funktionieren, d. H

$ ping abc
ping: cannot resolve abc: Unknown host

$ host abc
abc.local has address 192.168.1.128

$ ping abc.local
ping: cannot resolve abc.local: Unknown host

$ host abc.local
abc.local has address 192.168.1.128

Warum funktioniert die Suche abcbei Verwendung des hostBefehls, schlägt jedoch bei ping(und anderen Anwendungen) fehl ?

Danke fürs Lesen.

Brian M. Hunt
quelle
Ich hatte die gleiche Situation auf einem neuen Yosemite (10.10) MBP. Nach langem Suchen und Konfigurieren ist hier die Antwort, die funktioniert hat: apple.stackexchange.com/a/152892 Für den Datensatz, der keine --AlwaysAppendSearchDomains-Konfiguration hat
Stan Kurdziel

Antworten:

26

Warum sie diese Änderung vorgenommen haben, weiß ich nicht, aber es hat mich für eine Weile verrückt gemacht.

Ich weiß nicht , warum die Dinge für Host funktionieren, aber nicht für Ping, aber ich denke , das hängt mit der Art dieser beiden Dienstprogramme zusammen. Ping ist ein einfaches (wenn auch sehr hilfreiches) Diagnosedienstprogramm zum Verwerfen von Paketen, die an Sie zurückgesendet werden sollen. Die Suchfunktion für Hostnamen ist nur ein Nebeneffekt des Jobs und wird an den rekursiven Resolver des Systems weitergeleitet (ich glaube - ich habe keine Überprüfung durch Überprüfen verknüpfter Bibliotheken oder ähnlicher Elemente durchgeführt). Die Hauptaufgabe des Hosts besteht in der DNS-Namensauflösung. Daher wird ein eigener rekursiver Resolver implementiert.

Apples rekursiver Resolver ist mDNSResponder. Aus irgendeinem Grund benötigt die Version von mDNSResponder in Lion die Befehlszeilenoption "-AlwaysAppendSearchDomains", um sich wie in Snow Leopard zu verhalten (mindestens).

Hier ist ein schneller Weg, um das Problem zu beheben:

sudo sed -i .orig '/ProgramArguments/,/<\/array>/ {
s/\(<string>-launchd<\/string>\)/\1\
                <string>-AlwaysAppendSearchDomains<\/string>/
}' /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

(Am Anfang der vorletzten Zeile sollten zwei Tabulatorzeichen stehen, aber ich konnte nicht herausfinden, wie dieser kleine Editor Tabulatoren einfügt. Deshalb habe ich 16 Leerzeichen hinzugefügt. Entweder sollte funktionieren, aber die Tabulatoren Passen Sie den Abstand der Originaldatei besser an.)

Dadurch wird das Argument "-AlwaysAppendSearchDomains" zur Start-Plist-Datei von mDNSResponder hinzugefügt (und eine Sicherungskopie gespeichert). Da dies jedoch von launchd gesteuert wird, muss das System angewiesen werden, mDNSResponder neu zu starten.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist

Wenn Sie nun überprüfen, ob der mDNSResponder-Prozess ausgeführt wird, sollte er mit Ihrem neuen Argument ausgeführt werden:

ps auxww | grep mDNSResponder

(Siehe http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html und http://kavassalis.com/2011/07/wtf-bug -in-os-x-10-7 / , wo ich meine Antworten auf dieses Problem gefunden habe.)

Sigsegv
quelle
Dieses Update funktioniert auch für Mountain Lion (10.8). Ich habe es gerade auf meinem Laptop angewendet.
Sigsegv
Cool! Froh, dass ich helfen konnte.
Sigsegv
1
Zu Ihrer Information: Das hat unter Yosemite nicht funktioniert. Wenn Sie AlwaysAppendSearchDomains für Yosemite benötigen, versuchen Sie Folgendes: apple.stackexchange.com/a/157017/65787 Das hat das lokale Problem für mich bei Yosemite NICHT gelöst, aber dies hat =) apple.stackexchange.com/a/152892
Stan Kurdziel
Ich arbeite nicht in El Captain. Und einfacher Weg zu tun scheintsudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ProgramArguments -array-add "–AlwaysAppendSearchDomains"
Dmitry Verkhoturov
9

Aus der Manpage des Hosts (1):

Mac OS X HINWEIS

Der Befehl host verwendet weder die Auflösung von Hostnamen und -adressen noch die DNS-Abfragerouting-Mechanismen, die von anderen unter Mac OS X ausgeführten Prozessen verwendet werden. Die Ergebnisse von Namens- oder Adressabfragen, die vom Host gedruckt werden, unterscheiden sich möglicherweise von denen anderer Prozesse, die den Mac verwenden Mechanismen zur Auflösung von Namen und Adressen unter OS X. Die Ergebnisse von DNS-Abfragen können sich auch von Abfragen unterscheiden, die die DNS-Routing-Bibliothek von Mac OS X verwenden.

Leider gibt es keine Informationen darüber, wie genau der Host-Befehl Host-Namen auflöst. Dieses Verhalten macht es für das Debuggen etwas nutzlos, IMHO.

Kiezpro
quelle
6

Grundlegender Verlauf ... nslookup war der Befehl, aber es hatte eine eigene Implementierung aller seiner Resolver-Routinen. Was passierte, war, dass Systemauflöser auf verschiedenen Plattformen anders arbeiteten als nslookup. Manchmal führte dies zu ziemlich unterschiedlichen Ergebnissen.

Die Befehle host und dig wurden als "rewrite" für nslookup erstellt. Sie binden statisch die Funktionen des System-Resolvers ein. Der System-Resolver ist eine Sammlung von Funktionen in der Standard-C-Bibliothek eines UNIX- oder UNIX-ähnlichen Systems (unter Mac OS X sind diese Funktionen Teil der netdb-Bibliothek). Auf diese Weise funktionieren die Befehle host und dig immer auf dieselbe Weise wie der System-Resolver für jedes Betriebssystem, für das sie erstellt wurden, sie sind jedoch nicht darauf angewiesen. Auf diese Weise sind sie ausgezeichnete Diagnosewerkzeuge für Fälle, in denen der System-Resolver nicht ordnungsgemäß funktioniert.

HINWEIS: Host und Dig lesen beide die Nameserver-Liste aus /etc/resolv.conf, es sei denn, sie erhalten einen bestimmten Nameserver, mit dem sie sprechen können. Nur der Befehl host verwendet die Suchliste in der Datei /etc/resolv.conf. dig nicht, weshalb man dig immer FQDN geben muss, um irgendetwas aufzulösen. Beide Befehle sind ansonsten völlig autark; Beispielsweise ist die Datei /etc/resolv.conf das einzige, was nicht in der von ihnen verwendeten Binärdatei enthalten ist.

mDNSresponder ist Bonjour. Ich habe mich nicht zu sehr damit befasst, aber ich vermute, dass diese Konfigurationseinstellung dies nicht behebt oder zumindest nicht direkt. Ich habe gerade dasselbe Problem unter Mac OS X 10.9.1 erlebt und es für mich behoben, indem ich mDNSresponder einfach neu gestartet habe. Ich habe dieses Problem noch nie bei 10.5 -> 10.8 / 10.9 auf einem anderen System gesehen. Auch GUI-Anwendungen waren davon nicht betroffen, es waren nur Befehlszeilentools wie Ping und SSH, die kaputt gingen.

Wenn ich etwas mehr Zeit finde, um in der Bibliothek zu stöbern, werde ich sehen, ob ich eine vollständigere Erklärung finde.

Lamont Peterson
quelle
4

Ich habe ein Shell-Skript zusammengestellt, um das Update zu automatisieren (und ein Deinstallationsprogramm, falls Sie es später benötigen):

https://github.com/michthom/AlwaysAppendSearchDomains

Dies sollte weniger technischen Anwendern bei der Arbeit helfen, die sich möglicherweise davor scheuen, Systemdateien manuell zu bearbeiten.

Mike Thomson
quelle
4

.local ist für Multicast reserviert. mDNS- und DNS-Server im selben Netzwerk, die .local verwenden, können problematisch sein.

Jim
quelle
1
Ich würde mich über eine Erklärung oder einen Link zu einer Dokumentation freuen. Danke für den Leckerbissen!
bmike
3

Der Host hängt das lokale DNS-Suffix an. Ping ist nicht. Wenn Sie dies als störend empfinden, können Sie .local als Standardsuffix in den Systemeinstellungen des Netzwerks hinzufügen, und das System fügt dies hinzu, wenn Sie versuchen, Hostnamen aufzulösen.

bmike
quelle
Es ist ein guter Punkt, und es tut mir leid, dass ich das in der Frage nicht gesagt habe, aber es ping abc.localfunktioniert auch nicht (obwohl host abc.local). Ich habe die Frage behoben. pfSense fügt die lokale Domäne automatisch als Suchdomäne hinzu, wenn eine DHCP-Lease gesendet wird, sodass dies nicht das Problem ist.
Brian M. Hunt
Wow - komisch. Was passiert, wenn Sie sich mit einem Trailing voll qualifizieren? ? ping abc.local.
bmike
1
Gleiches Ergebnis. Offensichtlich gibt es im Mac zwei Suchmechanismen. Warum sie sich unterscheiden, ist schwer vorstellbar.
Brian M. Hunt
Ich bin nicht so sicher, dass diese Antwort auf Yosemite und anderen neueren Betriebssystemen funktioniert. Vielleicht können wir eine bessere Antwort bekommen ?
bmike
Es gibt eine Warnung der Dokumentation, dass die Datei / etc / hosts nur im Einzelbenutzermodus verwendet wird. Nicht wahr. Ich verhindere den versehentlichen Zugriff auf viele böse Jungs, indem ich ihre Namen in / etc / hosts schreibe und auf 127.0.0.1 weitergebe. Ich glaube nicht, dass dies für diese Frage von Bedeutung ist, obwohl es sicher zeigt, dass Apple ein paar Kuriositäten hat. Ich bemerkte auch, dass OS X meine resolv.conf häufig änderte, so dass ich einen Cron-Job einstellte, um ihn alle zehn Minuten auf den gewünschten Wert wiederherzustellen.
WGroleau
2

Für den Fall , Sie versucht, alle oben und nichts funktioniert , dann können Sie Ihre hinzufügen Name - Server und suchen Wege zuSystem Preferences>Network>Advance(bottom right of the window)>DNS tab Bildbeschreibung hier eingeben

Diese Updates /etc/resolv.conf und ping sollten jetzt funktionieren. Das Aktualisieren des Suchpfads durch Bearbeiten von /etc/resolv.conf funktioniert nicht wirklich, aber aus irgendeinem Grund.

AKTUALISIEREN:

Das Bearbeiten von /etc/resolv.conf funktioniert nicht, da das Betriebssystem die Datei basierend auf der Systemeinstellung neu schreibt.

KETALTHEDON
quelle
1
"Das Bearbeiten von /etc/resolv.conf funktioniert nicht wirklich", da das Betriebssystem es basierend auf dem Einstellungsfenster neu schreibt.
WGroleau
1
Das hat mir im Gegensatz zur akzeptierten Antwort wirklich geholfen.
Artem Pyanykh
1

Mir fehlt der Ruf, Lamont Petersons Post zu kommentieren . Das Neustarten von mDNSresponder funktionierte für mich unter Mac OS X 10.7 (Lion). Im Gegensatz zu Lamont Peterson verursachte dieses Problem bei mir Probleme mit einer GUI-Anwendung - Safari konnte öffentliche oder private Hostnamen nicht auflösen. Hier sind die konkreten Schritte, die ich ausgeführt habe und die Lamont Peterson vermutlich auch ausgeführt hat:

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSresponder.plist

Der unloadmDNSresponder wird heruntergefahren und neu gestartet load.

Dies löste das Problem sofort; kein Neustart erforderlich.

Sie können überprüfen, ob der Neustart erfolgreich war, indem Sie den folgenden listBefehl ausführen:

$ sudo launchctl list | grep '^PID\|mDNSResponder'
PID     Status  Label
708     -       com.apple.mDNSResponder
-       0       com.apple.mDNSResponderHelper

Das Vorhandensein einer Prozess-ID (PID) bedeutet, dass sie ausgeführt wird. 708wird variieren, wie es vom Betriebssystem zugewiesen wird. Wenn der Status einen anderen als einen Bindestrich oder eine Null anzeigt, ist ein Fehler aufgetreten.

Ich weiß nicht , wie mDNSResponderHelperwirkt mit mDNSResponder; Ich musste immer nur neu starten mDNSResponder.

Setaa
quelle
1

In einer Zeile:

sudo kill $(ps ax | grep mDNSResponder | grep -v grep | grep -v Helper | awk '{ print $1 }')
Leon Waldman
quelle
0

Bitte beachten Sie, dass OSX-Namen nicht dem Standard entsprechen können.

  • FQDN sind pingfähig
  • Namen in "Hosts" -Dateien sind pingfähig

Mac-Namen sind im Allgemeinen NICHT: Es müssen zwei Korrekturen vorgenommen werden: a) Ändern Sie die Leerzeichen in "-"

Also zum Beispiel mein Mac: Ingcontis MacBook Pro

wird pingbar sein unter: ingcontis-MacBook-Pro.local

Und die Eröffnungspräferenzen können Sie sehen:

Bildbeschreibung hier eingeben

ingconti
quelle