Сбой поиска DNS, например, с помощью `ping`, но работа с` host`

35

Я использую pfSense 2.0rc3, и я настроил его в качестве сервера пересылки DNS и включил «Регистрация DHCP-аренды в службе пересылки DNS», и я понимаю, что все соответствующие параметры используются для получения DNS-сервера для локальных поисков.

Он работает, как и ожидалось, с Linux, и в частности я могу запускать host abcи ping abc(и другие приложения), и все они работают как положено.

Однако в Mac OS X Lion 10.7 он работает не так, как ожидалось. В частности, hostкажется, что работают только поиски с командой, т.е.

$ 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

Почему поиск для abcработы при использовании hostкоманды, но не с ping(и другими приложениями)?

Спасибо за чтение.

Брайан М. Хант
источник
Я оказался в такой же ситуации на новом MBP Yosemite (10.10). После долгих поисков и настройки вот ответ, который сработал: apple.stackexchange.com/a/152892 Для записи, которая не имеет никакой конфигурации --AlwaysAppendSearchDomains
Stan Kurdziel

Ответы:

26

Почему они сделали это изменение, я не знаю, но какое-то время это сводило меня с ума.

Я не знаю, почему все работает для хоста, но не для ping, но я думаю, что это связано с природой этих двух утилит. Ping - простая (хотя и очень полезная) диагностическая утилита для отбрасывания пакетов по проводам, которые должны быть возвращены вам. Функциональность поиска имени хоста является лишь побочным эффектом задания и передается рекурсивному распознавателю системы (я полагаю - я не проверял, проверяя связанные библиотеки или что-то в этом роде). Основная задача хоста - выполнять разрешение имен DNS, поэтому он реализует собственный рекурсивный распознаватель.

Рекурсивный распознаватель Apple - это mDNSResponder. По какой-то причине версии mDNSResponder в Lion требуется параметр командной строки -AlwaysAppendSearchDomains, который будет вести себя так же, как в Snow Leopard (по крайней мере).

Вот быстрый способ это исправить:

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

(В начале последней строки должно быть два символа табуляции, но я не мог понять, как заставить этот маленький редактор вставлять вкладки, поэтому я добавил 16 пробелов. Любой из них должен работать, но вкладки лучше подгонять интервал исходного файла.)

Это добавит аргумент «-AlwaysAppendSearchDomains» в файл plist для запуска mDNSResponder (и сохранит резервную копию), но, поскольку это управляется launchd, этой системе необходимо указать перезапустить mDNSResponder.

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

Теперь, если вы проверите запущенный процесс mDNSResponder, вы должны увидеть, что он работает с вашим новым аргументом:

ps auxww | grep mDNSResponder

(Поддерживает http://www.makingitscale.com/2011/fix-for-broken-search-domain-resolution-in-osx-lion.html и http://kavassalis.com/2011/07/wtf-bug -in-os-x-10-7 / , где я нашел свои ответы на эту проблему.)

SIGSEGV
источник
Это исправление также работает для Mountain Lion (10.8). Я только применил это к своему ноутбуку.
Сигсегв
Круто! Рад, что смог помочь.
Sigsegv
1
К вашему сведению: это не сработало при Йосемити. Если вам нужны AlwaysAppendSearchDomains на Yosemite, попробуйте: apple.stackexchange.com/a/157017/65787 Это НЕ решило проблему .local для меня на Yosemite, но это помогло
Стэн Курдзиэль
Не работает в El Captain. И проще сделать видимоsudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist ProgramArguments -array-add "–AlwaysAppendSearchDomains"
Дмитрий Верхотуров
9

С главной страницы хоста (1):

Mac OS X УВЕДОМЛЕНИЕ

Команда host не использует разрешение имени и адреса хоста или механизмы маршрутизации DNS-запросов, используемые другими процессами, работающими в Mac OS X. Результаты запросов имени или адреса, напечатанные хостом, могут отличаться от результатов, найденных другими процессами, использующими Mac. Механизмы разрешения имен и адресов в OS X Результаты DNS-запросов также могут отличаться от запросов, использующих библиотеку маршрутизации DNS Mac OS X.

К сожалению, нет информации о том, как именно команда host разрешает имена хостов. Такое поведение делает его несколько бесполезным для отладки, ИМХО.

Kiezpro
источник
6

Базовая история ... nslookup была командой, но она имела собственную реализацию всех своих процедур распознавателя. Началось то, что системные преобразователи на разных платформах работали не так, как nslookup. Иногда это может привести к довольно разным результатам.

Команды host и dig были созданы как «переписать» для nslookup. Они статически связаны в функциях распознавателя системы. Системный преобразователь - это набор функций в стандартной библиотеке C UNIX или UNIX-подобной системы (в Mac OS X эти функции являются частью библиотеки netdb). Делая это, команды host и dig всегда функционируют так же, как системный распознаватель для любой ОС, для которой они созданы, но они не полагаются на это. Таким образом, они являются отличными инструментами диагностики в тех случаях, когда системный распознаватель работает со сбоями.

ПРИМЕЧАНИЕ. Host и dig читают список серверов имен из /etc/resolv.conf, если им не назначен конкретный сервер имен для общения. Только команда host использует список поиска в файле /etc/resolv.conf; dig не делает, поэтому всегда нужно давать dig FQDN для разрешения чего-либо. В остальном обе команды полностью самодостаточны; например, файл /etc/resolv.conf - это единственное, что не находится в двоичном файле, который они используют.

mDNSresponder - это Bonjour. Я не копался в этом слишком глубоко, но я подозреваю, что этот параметр конфигурации не исправляет это или, по крайней мере, не напрямую. Я только что столкнулся с этой же проблемой в Mac OS X 10.9.1, и простой перезапуск mDNSresponder исправил ее для меня. Я никогда не видел эту проблему раньше на 10,5 -> 10,8 / 10,9 на любой другой системе. Кроме того, приложения GUI не были затронуты этим, это были только инструменты командной строки, такие как ping и ssh.

Если я найду время побольше покопаться в библиотеке, я посмотрю, смогу ли я найти более полное объяснение.

Ламонт Петерсон
источник
4

Я собрал сценарий оболочки для автоматизации исправления (и деинсталлятор, если он понадобится вам позже), здесь:

https://github.com/michthom/AlwaysAppendSearchDomains

Это должно было дать менее техническим пользователям на работе, которые могли бы уклоняться от ручного редактирования системных файлов.

Майк Томсон
источник
4

.local зарезервирован для многоадресной рассылки. Серверы mDNS и DNS в одной сети с использованием .local могут быть проблематичными.

Джим
источник
1
Я хотел бы больше объяснений здесь или ссылки на некоторую документацию. Спасибо за лакомый кусочек!
bmike
3

Хост добавляет суффикс .local dns. Пинга нет. Если вы обнаружите, что это сбивает с толку, вы можете добавить .local в качестве суффикса по умолчанию в настройках сетевой системы, и система добавит его при попытке разрешения имен хостов.

bmike
источник
Это хороший момент, и извините, я не сказал этого в этом вопросе, но ping abc.localтоже не работает (хотя и host abc.localработает). Я исправил вопрос. pfSense автоматически добавляет локальный домен в качестве домена поиска при отправке аренды DHCP, так что это не будет проблемой.
Брайан М. Хант
Вау - странно. Что произойдет, если вы полностью определитесь с местным трейлингом? ? ping abc.local.
bmike
1
Тот же результат. Очевидно, что в Mac есть два механизма поиска. Почему они различаются, трудно представить.
Брайан М. Хант
Я не уверен, что этот ответ работает на Yosemite и других более новых ОС. Возможно, мы сможем получить лучший ответ ?
bmike
В документации есть предупреждение, что файл / etc / hosts используется только в однопользовательском режиме. Не правда. Я предотвращаю непреднамеренный доступ ко многим плохим парням, помещая их имена в / etc / hosts, перенаправляя их на 127.0.0.1. Я не думаю, что это имеет значение для этого вопроса, хотя это определенно показывает, что у Apple есть несколько странностей. Я также отметил, что OS X часто менял мой resolv.conf, поэтому я устанавливал задание cron, чтобы каждые 10 минут восстанавливать то, что я хотел
WGroleau
2

Если вы попробовали все вышеперечисленное и ничего не помогло, вы можете добавить свои серверы имен и пути поиска вSystem Preferences>Network>Advance(bottom right of the window)>DNS tab введите описание изображения здесь

Эти обновления /etc/resolv.conf и ping теперь должны работать. Обновление пути поиска путем редактирования /etc/resolv.conf на самом деле не работает, но это по какой-то причине.

ОБНОВИТЬ:

Редактирование /etc/resolv.conf не работает, поскольку ОС перезаписывает файл в соответствии с настройкой панели «Системные настройки».

KETALTHEDON
источник
1
«редактирование /etc/resolv.conf на самом деле не работает», потому что ОС перезаписывает его на основе панели pref.
WGroleau
1
Это действительно помогло мне, в отличие от принятого ответа.
Артем Пьяных
1

У меня недостаточно репутации, чтобы комментировать пост Ламонта Петерсона . Перезапуск mDNSresponder работал у меня на Mac OS X 10.7 (Lion). В отличие от Ламонта Петерсона, эта проблема вызвала проблемы с одним приложением с графическим интерфейсом - Safari не смог разрешить публичные или частные имена хостов. Вот конкретные шаги, которые я сделал, и я подозреваю, что Ламонт Петерсон также сделал:

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

В unloadвыключается mDNSresponder и loadначинает его снова.

Это решило проблему немедленно; перезагрузка не требуется.

Вы можете проверить, что он успешно перезапущен, с помощью listкоманды:

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

Наличие идентификатора процесса (PID) означает, что он работает. 708будет варьироваться в зависимости от назначения ОС. Если в статусе отображается что-то отличное от дефиса или нуля, значит, что-то пошло не так.

Я не знаю, как mDNSResponderHelperвзаимодействует с mDNSResponder; Я только когда-либо должен был перезагрузить mDNSResponder.

Setaa
источник
1

В одну строку:

sudo kill $(ps ax | grep mDNSResponder | grep -v grep | grep -v Helper | awk '{ print $1 }')
Леон Вальдман
источник
0

Пожалуйста, обратите внимание на имена OSX могут быть нестандартными, поэтому для полноты:

  • Полное доменное имя является pingable
  • имена в файлах "hosts" являются проверяемыми

Имена Mac, как правило, НЕ являются: нужно сделать два исправления: а) заменить пробелы на "-" б) добавить .local

так, например, мой Mac: MacBook Pro от Inconti

будет пинговать по адресу: ingcontis-MacBook-Pro.local

И открывая префы вы можете увидеть:

введите описание изображения здесь

ingconti
источник