Вопрос: В OS X, как я могу добавить 127.0.0.1 в список DNS-серверов, полученных через DHCP?


Я пытаюсь использовать dnsmasq для разрешения определенных известных доменов с использованием его конфигурации, но оставшиеся запросы переходят на обычный DNS-сервер, назначенный DHCP. Я не могу заставить это работать. Когда я устанавливаю DNS до 127.0.0.1 через панель «Сеть», мне приходится жестко кодировать DHCP-серверы DNS для конфигурации dnsmasq. Однако, когда я нахожусь в другой сети, например. на работе, у клиента эти адреса разные. Я должен переконфигурировать в любое время, когда меняю сети.

Как настроить OS X на использование 127.0.0.1 и любых DNS-серверов, назначенных через DHCP?

Если это невозможно, то как я могу сообщить dnsmasq о получении DNS-серверов восходящего потока через DHCP?

Вот что я знаю до сих пор.

  1. /etc/resolv.conf на OS X является динамическим, он изменяется в соответствии с тем, что вы установили в настройках сети, или используя DHCP. Он изменяется при каждом повторном подключении. Он даже удаляется, когда вы переходите в автономный режим. Поэтому, как только я использую 127.0.0.1, это отражено в файле /etc/resolv.conf, и я не знаю, есть ли место, где бывшие DHCP-назначенные DNS-адреса могли быть найдены.

  2. OS X не использует /etc/resolv.conf.head.

  3. OS X не использует /etc/dhclient.conf, где вы можете добавить DNS-серверы в список DHCP.

  4. /etc/resolver/tld.conf не является решением, потому что он пытается использовать DNS-сервер на основе соответствия tld (хорошо, если вы используете .dev или что-то еще).

Редактировать: Снимок экрана настройки сети DNS Вот похоже, что я хочу, но я понятия не имею, как автор этой статьи достиг.


2
2017-11-24 12:20


Источник




Ответы:


Во-первых, используя 127.0.0.1 И DHCP-назначенный DNS-сервер не будет работать. Если в OS X настроено несколько DNS-серверов, он не пытается их последовательно, он делает что-то более похожее на round robin - отправляя разные запросы на разные серверы более или менее наугад. Чистый результат: некоторые поисковые запросы, которые вы хотели обработать dnsmasq, вместо этого перейдут на обычный сервер (и получите неправильный результат), а некоторые, которые вы хотите отправить на обычный сервер, перейдут на dnsmasq (и сбой). Нехорошо.

Выяснить, что dnsmasq использовать DNS-сервер, предоставленный DHCP, возможно, но я не вижу чистого способа сделать это. Вместо этого я бы рекомендовал использовать DNS-конфигурацию, которая переопределяет обычную конфигурацию DNS для доменов, которые вы хотите специально обрабатывать. Для этого есть два варианта:

  1. Пропустите dnsmasq и поместите хосты, которые вы хотите, специально обработанные в / etc / hosts (см. Эта статья, например).
  2. Используйте / etc / resolver / files для прямого запроса для определенных доменов до 127.0.0.1, переопределяя общий (DHCP-поставляемый) DNS-сервер (см. справочная страница для / etc / resolver а также эта статья для Mac OS X Hints, По существу, вы создаете папку / etc / resolver и помещаете в нее файл для каждого домена, который вы хотите переопределить. Например. /etc/resolver/somedomain.com будет содержать «nameserver 127.0.0.1».

5
2017-11-24 22:32



Я понимаю, спасибо. И вы не думаете, что есть способ записать DHCP-серверы в текстовый файл для dnsmasq при подключении к сети? - Michiel van Oosterhout
@michielvoo: Есть, но это было бы грязно. Вам понадобится способ обнаружить, когда сетевая конфигурация изменилась (сложнее), а затем определить, какой сетевой интерфейс был основным (также сложно, я не думаю networksetup имеет способ показать заказ на живую службу; возможно использовать scutil?), затем используйте что-то вроде ipconfig getpacket en1 | grep domain_name_server найти DNS-серверы (это легкая часть) и, наконец, установить dnsmasq (также легко, AIUI). - Gordon Davisson


Используя ответ Гордона в качестве отправной точки, я смог решить это для своих целей, который создает имена хостов для проектов веб-разработки. Это было протестировано на OS X 10.9 (Mavericks).

Я использую .dev суффикс для моих тестовых сайтов (например, project1.dev, project2.dev). Такой подход позволяет мне создавать произвольно много .dev доменов, но не нужно создавать файл для каждого из них в /etc/resolver, Это небольшое улучшение по сравнению с ответом Гордона; вам нужно создать файл только один раз для суффикса.

Это работает независимо от того, работаю ли я в своей рабочей сети, домашней сети или VPN.

  1. На панели «Настройки сети» перейдите в раздел «Дополнительно», «DNS» и удалите все настраиваемые DNS-серверы, поэтому вы просто используете назначенные значения DHCP.
  2. sudo mkdir /etc/resolver/
  3. sudo sh -c 'echo nameserver 127.0.0.1 > /etc/resolver/dev'
  4. Если вы еще этого не сделали, добавьте следующее: /usr/local/etc/dnsmasq.conf (предполагая, что вы установили dnsmasq с homebrew, его местоположение может быть иным)

    address=/dev/127.0.0.1
    

Если вы используете дополнительные суффиксы (например, project1.loc), просто повторите шаги 3 и 4, заменив суффикс для dev в обоих этапах.

Попытка разрешить имя хоста с помощью dig, host, или nslookup не удастся, но имя хоста будет разрешено в веб-браузере или, например, curl, curl http://project1.dev работает, как ожидалось.


1
2017-12-13 16:52



кажется, что этот метод нарушен после обновления до Mac OSX 10.10: когда вы находитесь в автономном режиме, хосты .dev будут «не найдены». - Lenciel