dnsmasq

Когда-то многие из нас занимались разработкой сайтов, и, чтобы локально разрабатывать и тестировать очередной проект, добавляли в /etc/hosts ещё одну запись примерно такого вида:

127.0.0.1       next-project.tld

Если же сайт поддерживал поддомены, например, региональные, /etc/hosts превращался в простыню, которую публиковали в wiki, чтобы передать коллегам, вручную обновляя каждый раз, когда появлялся новый поддомен:

127.0.0.1       next-project.tld
127.0.0.1       msk.next-project.tld
127.0.0.1       spb.next-project.tld
...

Теперь, чаще или постоянно работая с микросервисами, эта проблема частично уходит в прошлое: мы заводим сервис на отдельном порту, обкладываемся моками, разрабатываем и дебажим.

Однако потребность в имитации окружений всё ещё не отпала. Локальное развёртывание всё ещё может требовать наличия доменов и поддоменов для ваших сервисов, например:

svc1.minikube.dmz
svc2.minikube.dmz
svc3.minikube.dmz
...

Поддерживать /etc/hosts довольно неудобно. В нём будут появляться новые домены и терять свою актуальность старые. Также его содержимое будет необходимо передавать вашим коллегам, поддерживая источник правды в актуальном состоянии.

Чтобы полностью автоматизировать работу с локальными доменами и поддоменами, я использую dnsmask. Довольно странно, что редко кто вспоминает о нём, продолжая поддерживать руками /etc/hosts.

Приведу пример настройки на macOS. Настройка на Linux происходит аналогично; учитывайте специфику вашего дистрибутива. В примере мы настроим зону .dmz на локальной машине:

brew install dnsmasq  # тот редкий случай,
                      # когда я рекомендую ставить пакет через brew

sudo mkdir -pv /etc/resolver
sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/dmz'
echo 'address=/.dmz/127.0.0.1' >> $(brew --prefix)/etc/dnsmasq.conf

sudo brew services start dnsmasq

ping -c 2 project.dmz
ping -c 2 another.project.dmz

Теперь все домены в зоне .dmz будут доступны на вашей машине без модификации /etc/hosts. Всё работает довольно прозрачно, менять настройки DNS в параметрах сетевого адаптера вам не потребуется.

Если вам нужно больше зон, добавьте соответствующие конфигурационные файлы по аналогии с именем необходимой вам зоны.

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

Что важно помнить? Доменные зоны .local и .dev существуют в реальности и зарезервированы. Зона .dmz может использоваться в вашей внутренней сети. Поэтому при выборе корневой зоны для локального использования сначала посоветуйтесь с вашими коллегами-сетевиками. Они подскажут, какую зону можно безопасно использовать для локальной разработки.