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

96

После обновления до 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, вы больше не сможете достичь своего localhost.

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

Meik
источник
12
Супер полезный вопрос - сюрприз, сюрприз, он закрыт как не по теме
Себастьян Паттен
По крайней мере, они не удалили ветку .. пока. Это спасло мой бекон. Я изменил все свои хосты с X.local на X.lhost, и проблема исчезла. Кстати, я большой поклонник xip.io, например foo.127.0.0.1.xip.io
Тим

Ответы:

78

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

Жан-Батист МОНИН
источник
Спасибо. Действительно очень полезно.
Cade
5
Моя первая мысль была «хромой». Однако затем я наткнулся на этот другой пост в стеке и изменил свою позицию: serverfault.com/questions/17255/…
Мэтт Бекман,
Одно замечание - если вы используете хром для разработки, нестандартные домены верхнего уровня будут интерпретироваться как поиск. Возможно, вам потребуется сделать что-то вроде .dev.com, чтобы он действительно выполнял поиск домена. Я не знаю, как это сделать элегантно.
bbrame
5
@bbrame: Вы можете ввести свой локальный домен со схемой URL: http://foo.dev/; После этого Chrome поймет, что foo.devэто домен, а не запрос.
guns
В качестве альтернативы вы можете использовать инструмент dscl, чтобы добавить исключение.
Артур Бодера 05
51

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

Я обнаружил это, когда заметил рекламу, которую никогда раньше не видел на Snow Leopard, потому что перенаправил рекламные домены на 127.0.0.1. Я запустил wirehark и заметил 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

пушки
источник
3
Большое спасибо за это. Ожидание 10-30 секунд, чтобы проверить изменения в моем коде, сводило меня с ума, и вы сэкономили мне массу времени, поскольку мне не приходилось разбираться в этом самому.
Зак Анджело
1
У меня была такая же проблема, и это сразу устранило мою проблему! Ницца.
cstrat
1
+1 Это отличный лакомый кусочек для тех, кто ищет «почему не работает мой файл hosts». Я могу задать этот вопрос здесь, чтобы вы могли дать тот же ответ и облегчить поиск через поисковую систему!
cape1232
Не должно быть заметного увеличения количества операций ввода-вывода на диск из-за чтения /etc/hosts- ОС будет кэшировать файл, если он используется часто.
Дэн Приттс,
Пользователи, чьи локальные сети поддерживают IPv6 (в конце концов, это почти 2016 год!), Будут сталкиваться с этой проблемой с этого момента, пока IPv4 полностью не исчезнет ... или пока Apple не обнаружит проблему и не решит ее самостоятельно! Следует также учитывать ответ Жана-Батиста (т. Е. Используйте .dev вместо .local для вашей среды разработки).
непревзойденные
17

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

Meik
источник
1
У меня такая же проблема. Однако мой файл / etc / hosts - это обычный файл. Любая помощь по этому поводу будет оценена.
Matt
4
Похоже, это было моей проблемой. У меня была символическая ссылка на файл в моей папке Dropbox, который раньше работал и который я считал очень умным. Похоже, Apple больше не считает это умным. Я также выполнил полный реальный перезапуск с помощью Option-restart после перемещения его из символической ссылки в реальный файл. Теперь все кажется счастливым.
Том С.
2
Записи в файле с символической связью допустимы, если они не могут быть разрешены иным образом. Это означает, что файл с символической ссылкой проверяется только тогда, когда адрес не может быть разрешен другим способом. Когда файл hosts является обычным файлом, он проверяется перед любой другой формой разрешения. Поэтому, если вам нужно переопределить домены, которые действительно имеют действительные записи DNS, ваш файл hosts должен быть файлом, а не символической ссылкой.
cerberos
1
Для справки, это все еще имеет место в Mavericks (10.9), было бы полезно, если бы кто-нибудь мог подтвердить, что делает Йосемити…
Уильям Туррелл
1
Йосемити тоже это делает, только что столкнулся с этой проблемой. Это очень странное поведение.
Витаутас Гимбутас
14

Обновление (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

Дэн Приттс
источник
Это может решить проблему с отказавшим демоном распознавателя DNS, но не решает проблему преобразования хостов в IP-адреса LAN, которые часто встречаются в средах разработки. Ответ @guns, приведенный ниже, будет правильным решением для большинства людей, которые найдут этот вопрос в поиске; хотя у Жана-Батиста-МОНИНА тоже есть достойный ответ.
непревзойденные
Это может решить проблему незаметных изменений в / etc / hosts.
Дэн Приттс,
Я использую high sierra, и этот ответ решает проблему с псевдонимом, спасибо
Absolutkarlos
4

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

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

В итоге;

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

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

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

127.0.0.1 foo.bar.local

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

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

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

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

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

Натан Лонг
источник
У меня ничего не работало, но это сработало в одно мгновение - спасибо, Натан!
foiseworth
3

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

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

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

scutil --dns

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

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

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

Пол Дж. Мартинес
источник
1

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

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

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

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

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

127.0.0.1   terminator
::1         terminator

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

hostname

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

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

pohl
источник
1
похоже, это сработало для меня только сейчас. Посмотрим, так ли это. Я ВОЛНОВЕН, что вы это поняли, потому что время от времени я замечал, что эта проблема возникает без предупреждения.
Джереми Карлсон
Стрелять. Для меня это не постоянное решение. Проблема вернулась. Имейте в виду, пока я перечитываю это, моя проблема не ваша ...
Джереми Карлсон,
0

У меня были проблемы со скоростью при использовании 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 
Эдди Б.
источник
0

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

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

томасафин
источник