Порядок пошуку 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.

Чи призначена така поведінка? Це має сенс? І найголовніше, як я можу повернутися до старої поведінки.


12
Дуже корисне запитання - сюрприз, сюрприз закрито як не в темі
Себастьян Паттен

Принаймні вони не видаляли нитку .. поки. Це врятувало мій бекон. Я змінив усіх хостів з X.local на X.lhost, і проблема зникла. На замітку я великий шанувальник xip.io, наприклад foo.127.0.0.1.xip.io
Тім,

Відповіді:


78

Я думаю, що справа в тому, що Lion по-різному обробляє .local TLD, оскільки він зарезервований для деяких функцій багатоадресного DNS (використовується Bonjour). Єдиний спосіб, який я знайшов, щоб вирішити цю проблему, - використання іншого TLD для хостів розробки (тобто .dev). Для мене це прекрасно працює, сподіваюся, це буде корисно для інших!


Дякую. Насправді дуже корисно.
Кейд,

5
Моя перша думка була "кульгавий". Однак тоді я натрапив на інший пост стека і змінив свою позицію: serverfault.com/questions/17255/…
Метт Бекман,

Одне зауваження - якщо ви використовуєте хром для розробки, нестандартні домени верхнього рівня будуть інтерпретовані як пошук. Можливо, вам доведеться зробити щось на зразок .dev.com, щоб зробити його реальним пошуком домену. Я не знаю, як це зробити елегантно.
bbrame

5
@bbrame: Ви можете ввести свій локальний домен зі схемою URL: http://foo.dev/; Після цього Chrome зрозуміє, що foo.devце домен, а не запит.
знаряддя

Ви також можете скористатися інструментом dscl, щоб додати виняток.
Артур Бодера

51

Що стосується перевизначення доменів у файлі hosts, я виявив, що за деяких обставин Lion запитує адресу IPv6 для домену, якщо відчуває, що домен недоступний через мережу IPv4.

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

Рішенням цього є a

::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
Велике спасибі за це. Очікування 10-30 секунд, щоб перевірити зміни мого коду, зводило мене з розуму, і ви врятували мені багато часу, не встигаючи розібратися в цьому сам.
Zack Angelo

1
У мене була та сама проблема, і це негайно вирішило мою проблему! Приємно.
cstrat

1
+1 Це чудовий шматочок для тих, хто шукає "чому мої файли хостів не працюють". Я можу задати це запитання тут лише для того, щоб ви могли туди ж відповісти і полегшити пошук через пошукову систему!
мис1232

Не повинно бути помітного збільшення вводу-виводу диска від читання /etc/hosts- ОС буде кешувати файл, якщо він часто використовується.
Ден Приттс,

Користувачі, чиї локальні мережі підтримують IPv6 (зрештою, це майже 2016 рік), стикатимуться з цією проблемою відтепер, доки повністю не зникне IPv4 .... або поки Apple не вирішить проблему та не вирішить її внутрішньо! Також слід врахувати відповідь Жана Батіста (тобто використовувати .dev замість .local для середовищ розробників).
неперевершені

17

Проблема полягала в тому, що я символічно зв’язав файл / etc / hosts. Якщо / etc / hosts є простим файлом, все нормально.


1
У мене така сама проблема. Однак мій файл / etc / hosts - це звичайний файл. Будь-яка допомога щодо цього буде вдячна.
мат

4
Здається, це теж було моє питання. У моїй папці "dropbox" у мене було посилання на файл, який працював і який я вважав сильно розумним. Здавалося б, Apple більше не вважає цього розумним. Я також зробив повний реальний перезапуск за допомогою Option-restart після переміщення його із символічного посилання на реальний файл. Зараз все здається щасливим.
Том С.

2
Записи у файлі хостів із символічними посиланнями справні, якщо їх неможливо вирішити інакше, це вказує на те, що файл із символічними посиланнями хостів перевіряється лише тоді, коли адреса не може бути вирішена інакше. Коли файл hosts - це звичайний файл, він перевіряється перед будь-якою іншою формою дозволу. Отже, якщо вам потрібно замінити домени, які насправді мають дійсні записи DNS, файл хостів повинен бути файлом, а не символічним посиланням.
cerberos

1
Для запису, це все ще має місце в Mavericks (10.9), було б корисно, якби хтось міг підтвердити те, що робить Йосеміті…
William Turrell

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-адрес, які часто зустрічаються в середовищах розробників. Відповідь @guns, наведена нижче, буде правильним рішенням для більшості людей, які знаходять це питання в пошуку; хоча Жан-Батіст-МОНІН теж має відповідь по суті.
неперевершені

Це може вирішити проблему незмінених змін у / etc / hosts.
Dan Pritts

Я використовую високу Сьєрру, і ця відповідь вирішує проблему псевдонімів, дякую
Absolutkarlos

4

Я мав цю проблему деякий час, оскільки, працюючи з командою розробників, стало необхідним фактично використовувати .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 IPAddress 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' через інші залежності.

У Terminal я запустив таку команду і розмежував свій результат з кількома іншими користувачами в офісі.

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. Якщо я вимкнув wifi, emacs запустився би миттєво, як очікувалося.)

Моє рішення: мій ноутбук має ім'я "термінатор". (Так, його блискучий алюмінієвий зовнішній вигляд змусив мене задуматися про персонажа Арнольда Шварценеггера.) Мені просто потрібно було додати записи до / etc / hosts для назви самої машини:

127.0.0.1   terminator
::1         terminator

Я знайшов ім'я свого хоста, виконавши просту команду в терміналі:

hostname

... який повернувся з виходом: "термінатор". Змінивши / etc / hosts на ці два записи, emacs тепер може швидко визначити ім'я мого ноутбука.

Сподіваюся, це комусь допомагає.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.