В 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 ответа

Решение

Во-первых, использование 127.0.0.1 И назначенный DHCP DNS-сервер не будет работать. Если в OS X сконфигурировано несколько DNS-серверов, он не пробует их последовательно, он выполняет нечто вроде циклического перебора - отправка разных запросов на разные серверы более или менее случайным образом. Чистый результат: некоторые из запросов, которые вы хотели обработать с помощью 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".

Используя ответ Гордона в качестве отправной точки, я смог решить эту проблему для своих целей, а именно для создания имен хостов для проектов веб-разработки. Это было проверено на 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 работает как положено.

Другие вопросы по тегам