Изменить порядок поиска DNS на Mac El Capitan

2815
Brick

У меня есть маршрутизатор, который также работает DNS, который содержит имена для машин в моей локальной сети. Он настроен на пересылку запросов, поэтому для любой общедоступной машины он будет обращаться к DNS, предоставленному моим провайдером. Маршрутизатор настроен так, что он является первичным DNS, а DNS провайдера указан в качестве вторичного. У меня есть несколько машин (с записями в моем личном DNS), которые имеют статические IP-адреса. Другие машины, включая Mac, который является предметом этого вопроса, получают свои адреса по DHCP.

Машины с Windows в этой сети работают отлично. Они разрешают частные имена для компьютеров в моей сети, а также имеют доступ к общедоступному Интернету.

Мой единственный ноутбук Mac не работает. Он без проблем получает доступ к общедоступному Интернету, но не получает доступ к моему внутреннему DNS, чтобы получить внутренние имена. Например, если я сделаю пинг к внутренней машине как

ping internal.example.com 

Я получаю пакеты обратно, но он показывает IP-адрес, который соответствует Hover. (Очевидно, Hover создает целевую страницу для любого субдомена, для которого нет общедоступного маршрута.) Если я это сделаю

nslookup internal.example.com 

тем не менее, я получаю правильный (внутренний) IP для машины в моей локальной сети.

Наконец, если я снова пингуюсь, но на этот раз заставляю его использовать мой внутренний DNS (192.168.1.2),

ping internal.example.com 192.168.1.2 

Я получаю ответ от правильной машины в моей локальной сети . Кажется, это указывает на то, что даже «нативный» подход может делать то, что я хочу, если он просто использует правильный DNS.

Я нашел много статей, в которых обсуждается эта проблема, но то, что я на самом деле нашел, либо устарело, либо не является полным решением моей проблемы. То, что я пока собрал вместе:

  • В течение нескольких обновлений ОС Apple меняла свою методологию разрешения DNS, поэтому ответы в Интернете быстро устаревают.
  • Mac имеет (по крайней мере) две схемы разрешения DNS, работающие одновременно с El Capitan. Это связано с получением разных результатов от ping и от nslookup, как отмечено выше. Утилиты командной строки, которые работают в «обычной» системе linux, по крайней мере, документируют это на своих страницах руководства, обычно в разделе, озаглавленном «Mac OS X Notice». К сожалению, неясно, какие именно утилиты используют, не проверяя их одну за другой. (До сих пор похоже, что nslookup и dig используют методологию linux, а ping использует все, что является «родным» для Mac OS.)
  • Это (более или менее) документированная особенность «собственного» метода DNS, которая динамически выбирает, какой DNS использовать. В частности, это означает, что порядок, отображаемый в окнах, таких как панель управления сетью, или порядок, указанный маршрутизатором (в моем случае), не соблюдаются.
  • Я получил некоторую информацию от «родного» инструмента DNS с помощью команды sudo killall -INFO mDNSResponderв командной строке. Это сбрасывает сообщения в /var/log/system.log. Из этого сообщения журнала видно, что DNS моего провайдера указан первым в этой системе. (Еще раз отмечу, что он указан вторым в конфигурации маршрутизатора и на панели управления сетью. Он также указан вторым, если я запускаю scutil.)
  • Я попытался очистить кэш на mDNSResponder с помощью, sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder;но это не помогло.
  • Я попытался отредактировать файл, com.apple.mDNSResponder.plistкак в этой инструкции ( https://www.cnet.com/news/os-x-10-6-3-and-dns-server-priority-changes/ ), но не смог отредактируйте файл. (Только для чтения, даже с sudo vi.) Кроме того, файл в моей системе имеет содержимое, отличное от того, что явно указано в этих инструкциях.

Однако, несмотря на все это, у меня все еще есть Mac, который не работает в сети, полной других компьютеров, которые прекрасно работают. Я мог бы, вероятно, вынуть DNS провайдера на маршрутизаторе, чтобы он даже не предлагался, но это похоже на взлом. Есть ли хорошее решение для этого на El Capitan?

Извините, если на это уже был дан ответ. (Я чувствую, что это должно быть где-то!) Я копался большую часть дня и не нашел решения для El Capitan до сих пор.

3

1 ответ на вопрос

4
Spiff

macOS имеет сложную систему для маршрутизации DNS-запросов («запросов с областями действия»), чтобы обрабатывать такие случаи, как VPN, когда вам может потребоваться, чтобы запросы на доменное имя вашей работы проходили по вашему VPN-туннелю, чтобы вы получали ответы от внутренних DNS-серверов вашей работы., который может иметь больше / другую информацию, чем внешние DNS-серверы вашей работы.

Чтобы увидеть все DNS-серверы, которые использует macOS, и узнать, как настраивается область запросов, используйте:

scutil --dns 

Для запроса DNS, как это делает macOS, используйте:

dns-sd -G v4v6 example.com 

…или же…

dns-sd -q example.com 255 255 

Смотрите справочные страницы для scutil(8)и dns-sd(1)для получения дополнительной информации.

Средства устранения неполадок DNS, такие как nslookup(1), dig(1)и host(1)содержат собственный код распознавателя DNS и не используют системные API-запросы DNS, поэтому они не получают поведение системы. Если вы не укажете, какой DNS-сервер для них использовать, они, вероятно, просто будут использовать один из перечисленных в списке /etc/resolv.conf, который генерируется автоматически и содержит только DNS-серверы по умолчанию для запросов с незаданной областью.

Традиционные инструменты командной строки Unix, которые не являются специфичными для DNS, такие как ping(8), вероятно, вызов традиционных gethostbyname(3)API, которые в macOS используют поведение распознавателя DNS системы.

Чтобы увидеть, что ваш DHCP-сервер сказал вашему Mac использовать, посмотрите domain_name_serverстроку в выводе:

ipconfig getpacket en0 

(замените en0 на правильное имя интерфейса в стиле BSD, как вы могли бы видеть в ifconfig)

Обратите внимание, я уверен, что DNS RFC не требуют реализации DNS для рассмотрения списка серверов, которые должны быть ранжированы по предпочтению. Хотя в реализациях DNS принято относиться к ним таким образом, вероятно, не стоит полагаться на все реализации для реализации таких вещей, если это не указано в соответствующих стандартах.

Кроме того, обратите внимание, что ваш Mac также может получать списки DNS-серверов из объявлений маршрутизатора IPv6 или DHCP6, если они активны в вашей сети. И, конечно, настройки VPN, установленные профили конфигурации, Open Directory, Active Directory и т. Д., Если что-то из этого используется в вашей среде.

Когда я делаю `ifconfig getpacket en0`, мне говорят` ifconfig: интерфейс getpacket не существует`. (Я проверил, и `en0` - правильное имя интерфейса.) Страница man для` ifconfig` также не отображает это как опцию. (Я согласился на это, и, похоже, его нет в документе.) Brick 7 лет назад 0
@ Кирпич `ipconfig`, а не` ifconfig` (`p` не` f`). Spiff 7 лет назад 0
При правильном написании (моя ошибка!) Я получаю информацию от этой команды, но она говорит мне, что я получаю, глядя на панель управления сетью. Сначала указан мой локальный DNS, а затем ISP. Я ценю ваш вклад, но до сих пор я все еще там, где я начал. Новая часть вашего ответа состоит в том, что стандарт может не требовать соблюдения порядка, поэтому я проверю это. Это было не мое понимание, но я вовсе не претендую на звание эксперта. Я ищу способ обойти "сложный" метод. Если это не удастся, я ясно, что мне придется переделать DNS для всех. Brick 7 лет назад 0
Без видимой причины он переключился на мой предпочтительный DNS всего за несколько движений, а затем вернулся. Очень расстраивает ... Brick 7 лет назад 0
Мне +1 в этом ответе, но я оставляю вопрос открытым пока. Я решил свою непосредственную проблему, удалив DNS провайдера в качестве вторичной опции для клиентов DHCP. (Он все еще используется моим маршрутизатором для переадресованных запросов.) Кроме того, для хорошей цели я изменил свои настройки в Hover, чтобы он не предоставлял целевую страницу. Я думаю, что это могло привести к принудительному использованию моего внутреннего DNS, так как Mac не получил бы ответа от публичного сервера, если бы я сделал это первым. Все равно хотел бы узнать, как изменить этот параметр на Mac - если это вообще возможно. Brick 7 лет назад 0
После некоторых дополнительных исследований я пришел к выводу, что даже те системы Windows, которые у меня были, не работали по той причине, о которой я думал. Ключевой частью этого ответа для меня была та часть, которая указала, что стандарты не требуют какого-либо определенного порядка поиска. Спасибо! Brick 7 лет назад 0
@Brick Кстати, от просмотра открытого исходного кода Apple до mDNSResponder из El Capitan, если я правильно понимаю, похоже, что macOS * пытается * выполнить указанный порядок, но если он не получает ответ в своевременно с первого сервера в списке, он может поместить этот сервер в штрафную и ненадолго перейти к следующему серверу. Spiff 7 лет назад 0