Использование Dnsmasq для локальной разработки на OS X

dnmasq logo

Большинство веб-разработчиков знакомы с процессом редактирования файла /etc/hosts для того, чтобы направить трафик по адресу coolproject.dev на 127.0.0.1. Многие также хорошо знают сложности данного подхода: необходимость изменять настройки каждый раз при добавлении или удалении проекта и необходимость доступа с правами администратора для каждого изменения.

Установка локального DNS-сервера, такого как Dnsmasq, и настройка системы так, чтобы она использовала этот сервер избавляет от этих сложностей.

Далее в статье:

  • установка Dnsmasq в OS X;
  • настройка Dnsmasq так, чтобы он на все запросы адресов в доменной зоне .dev отвечал 127.0.0.1;
  • настройка OS X для отправки всех запросов .dev в Dnsmasq;

ВАЖНО: инструкция ниже предполагает установку нового системного ПО и изменение настроек операционной системы — не делайте того, что не понимаете или не можете отменить изменения!

Установка Dnsmasq

Dnsmasq — лекговесный, простой в настройке сервер DNS и DHCP [...] ориентированный на домашние сети.

Цитата с сайта проекта Dnsmasq:

Есть много способов установить Dnsmasq, но мой любимый (на OS X) — это установка при помощи менеджера пакетов Homebrew. Установка самого Homebrew очень проста, но выходит за пределы этой статьи.

Имея установленный Homebrew, установить с его помощью Dnsmasq очень просто:

  1. Обновляем Homebrew:

    brew up
    
  2. Устанавливаем Dnsmasq:

    brew install dnsmasq
    

Процесс установки покажет несколько команд, с помощью которых можно настроить автозапуск Dnsmasq c настройками по-умолчнию. Я предпочитаю команды, представленные ниже, но это не мешает использовать другие варианты:

  1. Копируем конфигурационный файл по-умолчанию:

    cp $(brew list dnsmasq | grep /dnsmasq.conf.example$) /usr/local/etc/dnsmasq.conf
    
  2. Копируем файл настроек демона в соответствующий каталог:

    sudo cp $(brew list dnsmasq | grep /homebrew.mxcl.dnsmasq.plist$) /Library/LaunchDaemons/
    
  3. Включаем автозапуск Dnsmasq:

    sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
    

Настройка Dnsmasq

После установки и запуска Dnsmasq самое время настроить его!

Конфигурационный файл по-умолчанию — /usr/local/etc/dnsmasq.conf, открываем его в любимом редакторе

Среди множества вещей, которые может делать Dnsmasq, есть сравнение DNS-запросов с базой паттернов и использование его для формирования корректного ответа. Я использую этот функционал для обработки всех запросов, которые оканчиваются на .dev, чтобы ответ сервера в данном случае всегда был один: 127.0.0.1. Строка в файле конфигурации, описывающая это крайне проста:

address=/dev/127.0.0.1

Добавляем её в файл /usr/local/etc/dnsmasq.conf и сохраняем файл.

После этого необходим перезапустить Dnsmasq, чтобы это сделать надо выполнить две команды launchd:

sudo launchctl stop homebrew.mxcl.dnsmasq
sudo launchctl start homebrew.mxcl.dnsmasq

Можно протестировать работу Dnsmasq, послав запрос при помощи команды dig. Указываем доменное имя, заканчивающееся на .dev и с помощью dig запрашиваем наш новый DNS-сервер:

dig testing.testing.one.two.three.dev @127.0.0.1

Ответ должен выглядеть примерно так:

;; ANSWER SECTION:
testing.testing.one.two.three.dev. 0 IN A   127.0.0.1

Настройка OS X

Теперь, имея работающий DNS-сервер, необходимо настроить операционную систему на его использование. Есть два пути использования сервера:

  • посылать все DNS-запросы в Dnsmasq;
  • посылать только запросы, оканчивающиеся на .dev.

Первый вариант проще — надо всего-лишь поменять настройки DNS в Системных настройках, но этот вариант, возможно, не будет правильно работать без дополнительной настройки самого Dnsmasq.

Второй слегка сложнее, но не намного. Многие UNIX-подобные операционные системы имеют конфигурационный файл /etc/resolv.conf, который управляет формированием DNS-запросов, включая выбор сервера DNS по-умолчанию для обработки запросов (эта настройка может настраиваться автоматически, когда Вы подключаетесь к сети или меняете DNS-сервер/ы в Системных настройках).

OS X также позволяет настраивать дополнительные резолверы (настройки выбора DNS-серверов) при помощи создания файлов в каталоге /etc/resolver/. Этот каталог может не существовать в системе, поэтому прежде всего необходимо его создать:

sudo mkdir -p /etc/resolver

Теперь необходимо создать новый файл в этом каталоге для каждого резолвера, который вы хотите настроить. Каждый резолвер соответствует (исключительно в нашем случае) домену верхнего уровня, такому, как dev. Есть ряд деталей, которые можно настраивать для каждого резолвера, но я, как правило, ограничиваюсь двумя:

  • имя резолвера (что соответствует определяемому доменному имени);
  • DNS-сервер, который будет для этого использоваться.

Полная информация об этих файлах доступна на man-странице resolver:

man 5 resolver

Создаем новый файл с названием домена верхнего уровня (.dev) в каталоге /etc/resolver/ и добавляем в него сервер `DNS при помощи следующих команд:

sudo tee /etc/resolver/dev >/dev/null <<EOF
nameserver 127.0.0.1
EOF

Теперь на запросы, относящиеся к доменной зоне .dev будут обрабатываться нашим Dnsmasq, находящимся на адресе 127.0.0.1.

После создания этого файла OS X автоматически прочитает его и применит настройки.

Тестирование

Тестирование новой конфигурации просто: при помощи ping надо проверить как резолвятся DNS имена домена .dev.

Проверяем, что DNS работает:

ping -c 1 www.google.com

Результат должен быть примерно таким:

PING www.google.com (77.37.250.227): 56 data bytes
64 bytes from 77.37.250.227: icmp_seq=0 ttl=58 time=4.395 ms

--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.395/4.395/4.395/0.000 ms

Проверяем, что имена .dev name работают:

ping -c 1 this.is.a.test.dev
ping -c 1 iam.the.walrus.dev

Результат выполнения команды должен выглядеть примерно так:

PING iam.the.walrus.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.031 ms

--- iam.the.walrus.dev ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.031/0.031/0.031/0.000 ms

Теперь можно спокойно использовать новые DNS имена в .dev при любой необходимости ничего не настраивая и не меняя. Congratulations!