Wyszukiwanie DNS kończy się niepowodzeniem np. Z `ping`, ale działa z` host`

35

Korzystam z pfSense 2.0rc3, skonfigurowałem go jako usługę przesyłania dalej DNS i włączyłem „Zarejestruj dzierżawy DHCP w usłudze przesyłania dalej DNS” i rozumiem, że są to wszystkie odpowiednie ustawienia, aby uzyskać serwer DNS dla lokalnych wyszukiwań.

Działa zgodnie z oczekiwaniami w systemie Linux, w szczególności mogę uruchomić host abci ping abc(i inne aplikacje) i wszystkie działają zgodnie z oczekiwaniami.

Jednak w systemie Mac OS X Lion 10.7 nie działa zgodnie z oczekiwaniami. W szczególności działają tylko wyszukiwania z hostpoleceniem, tj

$ 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

Dlaczego wyszukiwanie abcdziała podczas korzystania z hostpolecenia, ale kończy się niepowodzeniem w przypadku ping(i innych aplikacji)?

Dziękuje za przeczytanie.

Brian M. Hunt
źródło
Ta sama sytuacja zakończyła się na nowym MBP Yosemite (10.10). Po wielu poszukiwaniach i konfiguracji, oto odpowiedź, która się sprawdziła: apple.stackexchange.com/a/152892 Dla rekordu, który nie zawiera żadnej - zawsze konfiguracji
Stan Kurdziel

Odpowiedzi:

26

Dlaczego wprowadzili tę zmianę, nie wiem, ale doprowadziło mnie to do szaleństwa.

Nie wiem, dlaczego rzeczy działają dla hosta, ale nie pingują, ale myślę, że ma to związek z naturą tych dwóch narzędzi. Ping jest prostym (choć bardzo pomocnym) narzędziem diagnostycznym do upuszczania pakietów na drut, które powinny zostać wysłane do ciebie echem. Funkcja wyszukiwania nazwy hosta jest tylko efektem ubocznym zadania i została przekazana rekurencyjnemu resolverowi systemu (wydaje mi się, że nie sprawdziłem, sprawdzając połączone biblioteki lub coś w tym rodzaju). Głównym zadaniem hosta jest rozpoznawanie nazw DNS, więc implementuje on własny rekurencyjny przelicznik.

Program rekurencyjny resolvera firmy Apple to mDNSResponder. Z jakiegoś powodu wersja mDNSResponder w Lionie potrzebuje opcji wiersza poleceń „-AlwaysAppendSearchDomains”, aby zachowywała się tak, jak w Snow Leopard (przynajmniej).

Oto szybki sposób, aby to naprawić:

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

(Powinny istnieć dwa znaki tabulacji na początku od ostatniego do ostatniego wiersza powyżej, ale nie mogłem wymyślić, jak zmusić ten mały edytor do wstawiania tabulatorów, więc dodałem 16 spacji. Obie powinny działać, ale tabulatory lepiej dopasuj odstępy w oryginalnym pliku).

Spowoduje to dodanie argumentu „-AlwaysAppendSearchDomains” do pliku listy startowej mDNSResponder (i zapisanie kopii zapasowej), ale ponieważ jest on kontrolowany przez uruchomienie, system musi zostać poinformowany o konieczności ponownego uruchomienia mDNSResponder.

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

Teraz, jeśli sprawdzisz działający proces mDNSResponder, powinieneś zobaczyć, że działa on z nowym argumentem:

ps auxww | grep mDNSResponder

(Propozycje do http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html i http://kavassalis.com/2011/07/wtf-bug -in-os-x-10-7 / , gdzie znalazłem odpowiedzi na ten problem).

Sigsegv
źródło
Ta poprawka działa także dla Mountain Lion (10.8). Właśnie zastosowałem to do mojego laptopa.
Sigsegv
Fajne! Cieszę się, że mogłem pomóc.
Sigsegv,
1
FYI: To nie działało pod Yosemite. Jeśli potrzebujesz AlwaysAppendSearchDomains na Yosemite, spróbuj: apple.stackexchange.com/a/157017/65787 To NIE rozwiązało problemu lokalnego dla mnie na Yosemite, ale to = = apple.stackexchange.com/a/152892
Stan Kurdziel
Nie działa w El Captain. I wydaje się łatwiejszy sposóbsudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ProgramArguments -array-add "–AlwaysAppendSearchDomains"
Dmitrij Verkhoturov
9

Ze strony podręcznika hosta (1):

UWAGA w systemie Mac OS X.

Polecenie hosta nie korzysta z rozpoznawania nazw hostów i adresów ani mechanizmów routingu zapytań DNS używanych przez inne procesy działające w systemie Mac OS X. Wyniki zapytań o nazwy lub adresy drukowane przez hosta mogą różnić się od wyników znalezionych przez inne procesy korzystające z komputera Mac Mechanizmy rozpoznawania nazw i adresów w OS X. Wyniki zapytań DNS mogą również różnić się od zapytań korzystających z biblioteki routingu DNS systemu Mac OS X.

Niestety nie ma informacji o tym, jak dokładnie polecenie hosta rozpoznaje nazwy hostów. To zachowanie czyni go nieco bezużytecznym przy debugowaniu, IMHO.

Kiezpro
źródło
6

Podstawowa historia ... nslookup było poleceniem, ale miało własną implementację wszystkich procedur resolvera. Zaczęło się dziać, że resolwery systemowe na różnych platformach działały inaczej niż nslookup. Czasami daje to całkiem odmienne wyniki.

Polecenia host i dig zostały utworzone jako „przepisz” dla nslookup. Łączą się one statycznie w funkcjach systemowego rozpoznawania nazw. Systemowy resolver to zbiór funkcji w standardowej bibliotece C systemu UNIX lub systemu podobnego do UNIX (w Mac OS X funkcje te są częścią biblioteki netdb). W ten sposób komendy host i dig działają zawsze w taki sam sposób, jak program tłumaczący system dla każdego systemu operacyjnego, dla którego zostały zbudowane, ale nie polegają na tym. W ten sposób są doskonałymi narzędziami diagnostycznymi w przypadkach, gdy resolver systemu działa nieprawidłowo.

UWAGA: Hostuj i kop zarówno czytając listę serwerów nazw z /etc/resolv.conf, chyba że otrzymają konkretny serwer nazw do rozmowy. Tylko polecenie host korzysta z listy wyszukiwania w pliku /etc/resolv.conf; dig nie, dlatego zawsze trzeba podać FQDN dig, aby cokolwiek rozwiązać. Oba polecenia są poza tym w pełni samowystarczalne; np. plik /etc/resolv.conf jest jedyną rzeczą, której nie używają w pliku binarnym.

mDNSresponder to Bonjour. Nie zagłębiłem się w to zbyt głęboko, ale podejrzewam, że to ustawienie konfiguracji nie naprawia tego, a przynajmniej nie bezpośrednio. Właśnie spotkałem ten sam problem w systemie Mac OS X 10.9.1 i po prostu zrestartowałem mDNSresponder, aby go naprawić. Nigdy wcześniej nie widziałem tego problemu na 10.5 -> 10.8 / 10.9 na żadnym innym systemie. Nie wpłynęło to również na aplikacje GUI, zepsuły się tylko narzędzia wiersza poleceń, takie jak ping i ssh.

Jeśli znajdę czas na trochę głębsze przeszukanie biblioteki, zobaczę, czy znajdę pełniejsze wyjaśnienie.

Lamont Peterson
źródło
4

Przygotowałem skrypt powłoki, aby zautomatyzować poprawkę (i deinstalator, jeśli będziesz go później potrzebować), tutaj:

https://github.com/michthom/AlwaysAppendSearchDomains

Miało to dać mniej technicznym użytkownikom w pracy, którzy mogą unikać ręcznej edycji plików systemowych.

Mike Thomson
źródło
4

.local jest zarezerwowany dla multiemisji. Problemem mogą być serwery mDNS i DNS w tej samej sieci korzystające z .local.

Jim
źródło
1
Chciałbym uzyskać więcej wyjaśnień tutaj lub link do dokumentacji. Dzięki za smakołyk!
bmike
3

Host dołącza sufiks .local dns. Ping nie jest. Jeśli okaże się to niepokojące, możesz dodać .local jako domyślny sufiks w preferencjach systemu sieciowego, a system doda to podczas próby rozwiązania nazw hostów.

bmike
źródło
To dobra uwaga i przepraszam, że nie powiedziałem tego w pytaniu, ale ping abc.localteż nie działa (choć host abc.localdziała). Naprawiłem pytanie. pfSense automatycznie dodaje domenę lokalną jako domenę wyszukiwania, gdy wysyła dzierżawę DHCP, więc to nie byłby problem.
Brian M. Hunt
Wow - dziwne. Co się stanie, jeśli w pełni zakwalifikujesz się lokalnie z końcowym. ? ping abc.local.
bmike
1
Ten sam wynik. Oczywiście na Macu są dwa mechanizmy wyszukiwania. Trudno sobie wyobrazić, dlaczego się różnią.
Brian M. Hunt
Nie jestem pewien, czy ta odpowiedź działa na Yosemite i innych nowszych systemach operacyjnych. Może uda nam się uzyskać lepszą odpowiedź ?
bmike
Dokumentacja ostrzega, że ​​plik / etc / hosts jest używany tylko w trybie pojedynczego użytkownika. Nie prawda. Zapobiegam niezamierzonemu dostępowi do wielu złych facetów, umieszczając ich nazwiska w / etc / hosts, kierując do 127.0.0.1 Nie sądzę, że to ma znaczenie w przypadku tego pytania, choć z pewnością pokazuje, że Apple ma kilka dziwactw. Zauważyłem również, że OS X często zmienia mój resolv.conf, więc ustawiłem zadanie crona, aby co dziesięć minut przywracało to, co chciałem.
WGroleau,
2

W przypadku, gdy próbowała wszystko powyższe i nic nie działało wtedy można dodać serwery nazw i szukać drogi doSystem Preferences>Network>Advance(bottom right of the window)>DNS tab wprowadź opis zdjęcia tutaj

Aktualizacje /etc/resolv.conf i ping powinny teraz działać. Aktualizowanie ścieżki wyszukiwania przez edycję /etc/resolv.conf tak naprawdę nie działa, ale z jakiegoś powodu to działa.

AKTUALIZACJA:

Edycja /etc/resolv.conf nie działa, ponieważ system operacyjny przepisuje plik na podstawie ustawienia panelu Preferencje systemowe.

KETALTHEDON
źródło
1
„Edycja /etc/resolv.conf tak naprawdę nie działa”, ponieważ system operacyjny zapisuje go ponownie na podstawie panelu wstępnego.
WGroleau,
1
To naprawdę załatwiło sprawę w przeciwieństwie do przyjętej odpowiedzi.
Artem Pyanykh,
1

Brakuje mi wystarczającej reputacji, aby skomentować post Lamonta Petersona . Ponowne uruchomienie mDNSresponder działało dla mnie w systemie Mac OS X 10.7 (Lion). W przeciwieństwie do Lamonta Petersona ten problem spowodował u mnie problemy z jedną aplikacją GUI - Safari nie mogło rozwiązać publicznych lub prywatnych nazw hostów. Oto konkretne kroki, które zrobiłem i podejrzewam, że zrobił to również Lamont Peterson:

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

Do unloadwyłącza mDNSResponder i loaduruchamia go ponownie.

To natychmiast rozwiązało problem; ponowne uruchomienie nie jest wymagane.

Możesz sprawdzić, czy zrestartował się pomyślnie, używając listpolecenia:

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

Obecność identyfikatora procesu (PID) oznacza, że ​​jest uruchomiony. 708będzie się różnić, ponieważ jest przypisany przez system operacyjny. Jeśli status pokazuje coś innego niż łącznik lub zero, coś poszło nie tak.

Nie wiem, jak mDNSResponderHelperwchodzi w interakcje mDNSResponder; Musiałem tylko ponownie uruchomić mDNSResponder.

Setaa
źródło
1

W jednej linii:

sudo kill $(ps ax | grep mDNSResponder | grep -v grep | grep -v Helper | awk '{ print $1 }')
Leon Waldman
źródło
0

Uwaga: nazwy OSX mogą być niestandardowe, więc dla kompletności:

  • FQDN są pingowane
  • nazwy w plikach „hostów” są pingowane

Nazwy komputerów Mac NIE są ogólnie: należy wprowadzić dwie poprawki: a) zmień spacje na „-” b) dodaj .local

na przykład mój Mac: MacBook Pro ingconti

będzie można pingować pod adresem: ingcontis-MacBook-Pro.local

I otwieranie prefs można zobaczyć:

wprowadź opis zdjęcia tutaj

ingconti
źródło