Порядок поиска DNS в Mac OSX Lion [закрыт]

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

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

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


person Meik    schedule 27.07.2011    source источник
comment
Суперполезный вопрос - сюрприз, сюрприз закрыт как не по теме   -  person Sebastian Patten    schedule 13.09.2013
comment
По крайней мере, они не удалили тему.. еще. Это спасло мой бекон. Я изменил все свои хосты с X.local на X.lhost, и проблема исчезла. Кстати, я большой поклонник xip.io, например. foo.127.0.0.1.xip.io   -  person Tim    schedule 19.03.2014


Ответы (10)


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

person Jean-Baptiste MONIN    schedule 28.07.2011
comment
Спасибо. Действительно очень полезно. - person Cade; 01.08.2011
comment
Моя первая мысль была хромой. Однако затем я наткнулся на этот другой пост в стеке и изменил свою позицию: serverfault.com/questions/17255/ - person Matt Beckman; 26.08.2011
comment
Одно замечание — если вы используете хром для разработки, нестандартные домены верхнего уровня будут интерпретироваться как поиск. Возможно, вам придется сделать что-то вроде .dev.com, чтобы он выполнял фактический поиск домена. Я не уверен, как сделать это элегантно. - person bbrame; 15.12.2011
comment
@bbrame: вы можете ввести свой локальный домен со схемой URL-адресов: http://foo.dev/ ; После этого Chrome поймет, что foo.dev — это домен, а не запрос. - person guns; 02.05.2012
comment
В качестве альтернативы вы можете использовать инструмент dscl добавить исключение. - person Artur Bodera; 05.02.2013
comment
.local никогда не был медленным для меня до двух недель назад. Однако переход на .dev сработал потрясающе!! У меня был Lion на этом ноутбуке уже почти два года ... так что странно, что он внезапно просто перестал работать (особенно учитывая, что это старая проблема) - person Graham Robertson; 11.06.2013

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

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

Решение этой проблемы есть

::1 mydomain.com

запись для каждого

127.0.0.1 mydomain.com

запись в вашем файле hosts.

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


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

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

person guns    schedule 09.08.2011
comment
Большое спасибо за это. Ожидание 10-30 секунд, чтобы проверить изменения в моем коде, сводило меня с ума, и вы сэкономили мне массу времени, потому что мне не пришлось разбираться в этом самому. - person Zack Angelo; 13.08.2011
comment
У меня была такая же проблема, и это немедленно решило мою проблему! Хороший. - person cstrat; 13.09.2012
comment
+1 Это отличный лакомый кусочек для тех, кто ищет, почему мой файл hosts не работает. Я могу задать этот вопрос здесь, чтобы вы могли указать тот же ответ и упростить поиск через поисковую систему! - person cape1232; 15.05.2014
comment
Не должно быть заметного увеличения дискового ввода-вывода при чтении /etc/hosts — ОС будет кэшировать файл, если он часто используется. - person Dan Pritts; 29.08.2015
comment
Пользователи, чьи локальные сети поддерживают IPv6 (в конце концов, уже почти 2016 год!), будут сталкиваться с этой проблемой до тех пор, пока IPv4 полностью не исчезнет… или пока Apple не подхватит проблему и не решит ее внутри компании! Следует также учитывать ответ Жана-Батиста (т. е. использовать .dev вместо .local для среды разработки). - person unrivaledcreations; 04.09.2015

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

person Meik    schedule 27.07.2011
comment
У меня такая же проблема. Однако мой файл /etc/hosts — это обычный файл. Любая помощь в этом будет оценена по достоинству. - person matt; 28.07.2011
comment
Похоже, это была и моя проблема. У меня была символическая ссылка на файл в папке Dropbox, которая раньше работала и казалась мне очень умной. Похоже, что Apple больше не считает это умным. Я также сделал полный реальный перезапуск с помощью Option-restart после перемещения его из символической ссылки в реальный файл. Сейчас все кажется счастливым. - person Tom S.; 12.08.2011
comment
@Scott: Вы сможете комментировать произвольные ответы после того, как наберете 50 очков репутации. - person Paŭlo Ebermann; 13.08.2011
comment
это именно моя проблема, но я не понимаю, почему это может быть проблемой, симлинки были в порядке в снежном барсе. Очень расстраивает. - person cerberos; 20.03.2012
comment
Записи в файле хостов с символическими ссылками допустимы, если они не могут быть разрешены иным образом. Это указывает на то, что файл хостов с символическими ссылками проверяется только тогда, когда адрес не может быть разрешен иначе. Когда файл hosts является обычным файлом, он проверяется перед любой другой формой разрешения. Поэтому, если вам нужно переопределить домены, которые действительно имеют действительные записи DNS, ваш файл hosts должен быть файлом, а не символической ссылкой. - person cerberos; 21.03.2012
comment
Для справки, это все еще имеет место в Mavericks (10.9), было бы полезно, если бы кто-то мог подтвердить, что делает Yosemite… - person William Turrell; 13.01.2015
comment
Yosemite тоже так делает, просто столкнулся с этой проблемой. Это крайне странное поведение. - person Vytautas Gimbutas; 31.05.2015
comment
Это все еще поведение в High Sierra. - person Burhan Ali; 05.02.2018

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

Обновление: OSX 10.10 Yosemite заменил mDNSResponder на «discoveryd». Я не обновлялся, поэтому я не уверен в обнаруженном поведении с поиском DNS и /etc/hosts.

Системный преобразователь DNS в Lion — это процесс mDNSResponder.

Вы можете подумать: «Но mDNSResponder — это многоадресный 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

person Dan Pritts    schedule 13.02.2012
comment
Это может решить проблему со сбоем демона преобразователя DNS, но не решает проблему преобразования хостов в IP-адреса локальной сети, часто возникающие в средах разработки. Ответ @guns ниже будет правильным решением для большинства людей, которые найдут этот вопрос в поиске; хотя у Жана-Батиста-МОНЕНА тоже есть достойный ответ. - person unrivaledcreations; 04.09.2015
comment
Это может решить проблему незаметных изменений в /etc/hosts. - person Dan Pritts; 09.09.2015
comment
Я использую high sierra, и этот ответ решает проблему с псевдонимом, спасибо - person absolutkarlos; 25.01.2018

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

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

В итоге;

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

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, но это лучшая альтернатива переименованию всех наших серверов .local.

person Opentuned    schedule 16.02.2012
comment
При добавлении имени хоста таким образом, похоже, ничего не происходит. Не удается пропинговать адрес. Пример: sudo dscl localhost -create /Local/Default/Hosts/test1 IP-адрес 127.0.0.1 ping test1 ping: невозможно разрешить test1: неизвестный хост - person oligofren; 13.03.2013

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

127.0.0.1 foo.bar.local

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

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

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

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

Очевидно, это добавляет адреса IPv6? Я не совсем понимаю, правда, но это работает.

person Nathan Long    schedule 31.05.2012
comment
Ничто другое не сработало для меня, но это сработало в одно мгновение - спасибо, Натан! - person foiseworth; 27.02.2013

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

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

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

scutil --dns

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

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

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

person Paul J. Martinez    schedule 14.02.2013

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

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

В отличие от других, я не использовал /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

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

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

person pohl    schedule 04.03.2012
comment
это, кажется, сработало для меня только сейчас. Посмотрим, выдержит ли это. Я в восторге от того, что вы это поняли, потому что я периодически видел, как эта проблема возникает без предупреждения. - person Jeremy Carlson; 12.05.2015
comment
Стрелять. Это не постоянное решение для меня. Проблема обратно. Имейте в виду, когда я перечитываю это, моя проблема не ваша... - person Jeremy Carlson; 14.05.2015

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

sudo networksetup -setv6off Ethernet

/etc/хост...

127.0.0.1    localhost
127.0.0.1    dev.aliasdomain.com
... 
::1          localhost6 
person Edward J Beckett    schedule 27.07.2012

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

В любом случае кажется, что с 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

person thomasafine    schedule 06.03.2013