Порядок поиска Mac OSX Lion DNS

После перехода на Mac OSX Lion я понял, что /etc/hosts больше не ищут первое место для разрешения имен. Это приводит к некоторым побочным эффектам:

  • Записи в /etc/hosts разрешены с болью медленными
  • Вы не можете переопределить существующие домены, например. 127.0.0.1 www.google.com
  • Если вы получаете поисковые записи в домене от DHCP, скажем,.lan, а какой-то смешной парень настроил localhost.lan на что-то еще, а затем 127.0.0.1 в локальном DNS вы больше не можете связаться с вашим локальным хостом.

Предполагается ли это поведение? Это имеет смысл? И самое главное, как я могу вернуться к старому поведению.

Ответ 1

Я думаю, что он имеет значение, так как Lion обрабатывает .local TLD по-разному, потому что он зарезервирован для некоторых функций многоадресной DNS (используется Bonjour). Единственный способ решить эту проблему - использовать другой TLD для хостов разработки (например:.dev). Он отлично работает для меня, надеюсь, что он будет полезен другим!

Ответ 2

Что касается переопределения доменов в файле hosts, я обнаружил, что в некоторых случаях Lion запрашивает адрес IPv6 для домена, если он считает, что домен недоступен в сети IPv4.

Я обнаружил это, когда заметил некоторые объявления, которые я никогда раньше не видел на Snow Leopard, потому что перенаправил домены объявлений на 127.0.0.1. Я запустил wirehark и заметил запросы AAAA (IPv6 DNS-записи) по запросам IPv4 A (IPv4). На серверах объявлений действительно есть IPv6-аддиссы и они могли обслуживать меня своим контентом.

Решение этого вопроса имеет

::1 mydomain.com

для каждого

127.0.0.1 mydomain.com

в файле ваших хостов.

Интересно, что если у вас есть локальный веб-сервер, работающий на 127.0.0.1:80, и ваш браузер получает ответ от веб-сервера (ошибка или иначе), не выдается запрос AAAA, так как кажется, что TCP соединение было как минимум возможно.


В соответствующей заметке, если вы сильно используете файл hosts (для блокировки рекламы, локальной веб-разработки и т.д.), вам может понадобиться запустить собственный локальный DNS-преобразователь. Существует значительный дисковый/процессорный удар, связанный с необходимостью читать /etc/hosts по каждому запросу, поэтому в ваших интересах держать этот файл очень легким.

Одно из преимуществ локального использования dnsmasq локально (помимо значительного повышения производительности) заключается в том, что вы можете перенаправить целые области верхнего уровня обратно на локальную машину. Это позволяет вам иметь полное пространство имен *.dev для разработки (например), без необходимости индивидуально вводить каждый домен, который вы хотите локализовать, в /etc/hosts

Ответ 3

Проблема заключалась в том, что я symlinked файл /etc/hosts. Если/etc/hosts - это простой файл, все в порядке.

Ответ 4

Обновление (2): OSX 10.10.5 возвращает mDNSResponder.

Обновление: OSX 10.10 Yosemite заменил mDNSResponder на "discoveryd". Я не обновлялся, поэтому не уверен в том, что поведение findyd/r/t DNS будет найдено и /etc/hosts.

Системным DNS-резольвером на Lion является процесс mDNSResponder.

Возможно, вы думаете: "но mDNSResponder - ответчик multicast dns". Ты прав; для чего он был первоначально, и он все еще выполняет эту функцию. Тем не менее, в новых версиях MacOS он также выполняет стандартные проверки хостов.

В Lion он не кажется, что автоматически перечитывает /etc/hosts, когда он изменяется, по крайней мере, не всегда. Убийство mDNSResponder (и позволяющее ему автоматически перезапускаться), похоже, устраняет проблему.

sudo killall mDNSResponder

должен сделать трюк.

ниже мой первоначальный ответ для потомков. По-моему, это может быть проблемой в некоторых случаях.

Убедитесь, что ваш файл /etc/hosts является текстовым файлом в стиле unix, а переводы строк - как окончание, а не cr.

Редактирование с помощью TextWrangler или текстового редактора unix должно сохранять файл.

Если ваш файл уже испорчен, попробуйте исправить

tr '\015' '\012' < /etc/hosts > /tmp/hosts.$$
mv /etc/hosts /etc/hosts.bad
mv /tmp/hosts.$$ /etc/hosts
# fix up permissions while we are at it
chown root:wheel /etc/hosts
chmod 644 /etc/hosts

кредит для этого исправления:

http://techpatio.com/2011/guides-how-to/fixed-mac-osx-lion-etc-hosts-bugs-dns

Ответ 5

У меня была эта проблема некоторое время, так как я работала с командой разработчиков, чтобы было действительно использовать .local, а не .dev или .localhost, я нашел эту статью очень полезной.

iTand.me - Ложные локальные домены и другие хосты..

В заключение;

Но если вам нужно использовать .local, самым изящным решением, которое я нашел, является утилита dscl. Использование его очень просто. Чтобы добавить хост с именем mydev.local и указать его на localhost, просто выполните следующее:

sudo dscl localhost -create /Local/Default/Hosts/mydev.local IPAddress 127.0.0.1

Чтобы просмотреть все текущие хосты и их IP-адреса

sudo dscl localhost -list /Local/Default/Hosts IPAddress

И удалить хост:

sudo dscl localhost -delete /Local/Default/Hosts/mydev.local

В целом, довольно просто и хорошо работает. Я все же предпочел бы иметь возможность редактировать /etc/hosts вместо этого, но это лучшая альтернатива переименованию всех наших локальных серверов.

Ответ 6

До перехода от Snow Leopard к Lion у меня было несколько записей для приложения в /etc/hosts, например:

127.0.0.1 foo.bar.local

После обновления загрузка моих локальных приложений была ОЧЕНЬ медленной. Я заметил, что задержка произошла до того, как запрос появился в файле журнала, и что, как только это произошло, само приложение было таким же быстрым, как обычно.

Теперь у меня есть две строки для каждого приложения, например:

127.0.0.1 foo.bar.local
::1       foo.bar.local

... и все снова быстро.

По-видимому, это добавляет адреса IPv6? Я не совсем понял это, но он работает.

Ответ 7

Моя ситуация была похожа, но задержки ровно на 5 секунд произошли только для URL-адресов, заканчивающихся на ".local". При просмотре сайтов, закончившихся в '.dev', не было задержки.

Некоторые из других разработчиков в моем офисе имели эту проблему, а некоторые - нет. Я надеялся на простое исправление, и я не хотел переименовывать сайт в ".local" из-за других зависимостей.

Я запускал следующую команду в терминале и менял свой вывод с несколькими другими пользователями в офисе.

scutil --dns

Этот раздел был единственным отличием:

resolver #2
  domain   : 00000000.members.btmm.icloud.com
  options  : pdns
  timeout  : 5
  order    : 150000

Мой Mac был связан с моей учетной записью iCloud, и я включил Back To My Mac. Как только я отключил Back To My Mac, дополнительный распознаватель исчез и 5-секундная задержка исчезла.

Ответ 8

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

И я понял, почему.

В отличие от других, я не использовал /etc/hosts для настройки локальных доменов. Мой файл /etc/hosts был запасом, содержащим только записи, необходимые для интерфейса loopback и широковещательного узла. Более того, это был правильно кодированный unix файл, так как я такой человек, который только редактировал бы это из командной строки с помощью emacs. И, слава богу, мне не пришлось прибегать к запуску моего собственного DNS-сервера, такого как DNSmasq, чтобы обойти эту проблему.

(Чтобы быть ясным, симптом, который привел меня к этой проблеме, состоял в том, что emacs занял около 10 секунд, но только когда я был на Wi-Fi. Если бы я отключил Wi-Fi, emacs запустился бы мгновенно, как ожидалось.)

Мое решение: у моего ноутбука есть имя, "терминатор". (Да, его блестящая алюминиевая внешность заставила меня задуматься о характере Арнольда Шварценеггера.) Мне просто нужно было добавить записи в /etc/hosts для имени самой машины:

127.0.0.1   terminator
::1         terminator

Я нашел имя моего хоста, выполнив простую команду в терминале:

hostname

..., который вернулся с выходом: "terminator". После изменения /etc/hosts, чтобы содержать эти две записи, emacs теперь может быстро решить имя моего ноутбука.

Я надеюсь, что это поможет кому-то.

Ответ 9

У меня были проблемы с быстродействием с использованием OSX Lion в качестве веб-разработки... Используя комбинацию предложений, я прибегал к отключению сети ipv6 и маршрутизации ipv6 на localhost6... вещи ускорялись совсем немного...

sudo networksetup -setv6off Ethernet

/etc/hosts...

127.0.0.1    localhost
127.0.0.1    dev.aliasdomain.com
... 
::1          localhost6 

Ответ 10

Я думаю, что были некоторые исправления ошибок. Я видел много проблем, упомянутых выше, и ни один из них, похоже, не применяется в настоящее время (например, добавление нескольких псевдонимов в одну строку теперь отлично подходит для меня).

В любом случае кажется, что с Lion Apple внесла некоторые серьезные изменения в mDNSResponder, который обрабатывает все запросы DNS, и (по крайней мере, с Lion) также обрабатывает кеширование /etc/hosts. Для меня теперь работают и поисковые запросы. Но обратные запросы (например, поиск 1.2.3.4 вместо google.com) не работают.

После большой боли, похоже, что mDNSResponder преобразует этот поиск в файл 4.3.2.1.in-addr.arpa и выполняет поиск по имени. Это может быть так, как DNS предпочитает работать, но он вообще не работает с /etc/hosts.

Если, конечно, вы не добавите псевдоним 4.3.2.1.in-addr.arpa для каждого хоста, где 4.3.2.1 - это IP-адрес в обратном порядке, из которого вы привыкли его видеть. Это исправляет все для меня. Вот пример записи /etc/hosts:

1.2.3.4 foo foo.example.com alias.example.com 4.3.2.1.in-addr.arpa