Bootstrap

Настройка Wildcard DNS для локальной разработки: dnsmasq + libvirt

Настройка Wildcard DNS для локальной разработки: dnsmasq + libvirt

Настройка Wildcard DNS в локальной среде разработки с использованием dnsmasq и libvirt

Проблема

В процессе настройки локальной среды разработки возникла необходимость организовать wildcard DNS, чтобы все поддомены определенного домена (например, *.dix.lan) резолвились на один IP-адрес. Это типичная задача для разработчиков, работающих с множеством микросервисов или тестовых сред.

Решение

Была использована связка dnsmasq и libvirt для создания локального DNS-сервера с wildcard-записями.

Шаг 1: Настройка сети libvirt

Основная сложность заключалась в том, что libvirt при сохранении конфигурации сети (virsh net-edit) удалял пользовательские настройки dnsmasq, если они были неправильно оформлены.

Ключевые моменты:

  • Объявление namespace dnsmasq должно находиться в корневом элементе <network>
  • Блок с настройками должен идти после определения IP-адресации

Рабочая конфигурация:

Terminal:

<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
  <name>default</name>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
  
  <dnsmasq:options>
    <dnsmasq:option value='local=/lan/'/>
    <dnsmasq:option value='local=/dix.lan/'/>
    <dnsmasq:option value='address=/dix.lan/192.168.122.76'/>
  </dnsmasq:options>
</network>

Альтернативный метод через net-define (если virsh net-edit не сохраняет изменения):

Если после выполнения virsh net-edit настройки dnsmasq:options пропадают, используйте более надежный метод:

Terminal:

# 1. Сохрани текущую конфигурацию
sudo virsh net-dumpxml default > /tmp/default-modified.xml

# 2. Отредактируй /tmp/default-modified.xml руками 
#    (добавь namespace и dnsmasq:options как показано выше)

# 3. Удали старую сеть полностью
sudo virsh net-destroy default
sudo virsh net-undefine default

# 4. Создай заново из модифицированного файла
sudo virsh net-define /tmp/default-modified.xml
sudo virsh net-start default

Этот метод гарантированно сохраняет все пользовательские настройки, так как сеть создается заново из предварительно подготовленного XML-файла.

Шаг 2: Настройка DNS на хостовой машине

Чтобы локальная система использовала созданный DNS-сервер, была настроена конфигурация resolvconf:

Terminal:

# /etc/resolvconf/resolv.conf.d/head
nameserver 192.168.122.1
search dix.lan lan

После чего:

Terminal:

sudo resolvconf -u

Шаг 3: Перезагрузка системы

Важный момент! Для того чтобы все изменения вступили в силу и система начала корректно использовать настроенный DNS-сервер, требуется полная перезагрузка:

Terminal:

sudo reboot

Это необходимо, потому что:

  1. Перезапускаются все сетевые службы
  2. Обновляются кэши DNS
  3. Применяются все изменения в конфигурации сети
  4. Гарантируется корректная инициализация виртуальной сети libvirt

Шаг 4: Проверка работоспособности после перезагрузки

После перезагрузки системы выполните проверки:

Terminal:

# Проверка конфигурации сети
sudo virsh net-dumpxml default | grep -A 8 dnsmasq

# Проверка конфигурации dnsmasq
sudo grep -E 'local=|address=' /var/lib/libvirt/dnsmasq/default.conf

# Тестирование резолвинга
dig @192.168.122.1 dix.lan +short          # → 192.168.122.76
dig @192.168.122.1 test.dix.lan +short     # → 192.168.122.76
dig @192.168.122.1 any.dix.lan +short      # → 192.168.122.76

# Проверка через системный резолвер (после перезагрузки)
ping dd.dix.lan

Архитектура решения

Terminal:

Хостовая машина → DNS-запрос → 192.168.122.1 (dnsmasq/libvirt)
                                      │
                                      ├─ *.dix.lan → 192.168.122.76 (ВМ)
                                      └─ Остальные запросы → Upstream DNS

Важно: Адрес 192.168.122.1 — это не адрес виртуальной машины, а IP-адрес самого хоста внутри виртуальной сети libvirt, на котором работает DNS-сервер dnsmasq.

Результат

После полной перезагрузки системы все поддомены *.dix.lan автоматически резолвятся на указанный IP-адрес (192.168.122.76), что подтверждается тестами:

Terminal:

$ ping dd.dix.lan
PING dd.dix.lan (192.168.122.76) 56(84) bytes of data.
64 bytes from debian (192.168.122.76): icmp_seq=1 ttl=64 time=0.235 ms
64 bytes from debian (192.168.122.76): icmp_seq=2 ttl=64 time=0.404 ms
64 bytes from debian (192.168.122.76): icmp_seq=3 ttl=64 time=0.335 ms

Успех! Wildcard DNS настроен и стабильно работает после перезагрузки системы.

Преимущества решения

  1. Автоматизация: Не нужно редактировать файл hosts для каждого нового поддомена
  2. Стабильность: Настройки сохраняются после перезагрузок
  3. Гибкость: Легко изменить целевой IP-адрес
  4. Производительность: Локальный DNS-сервер работает быстро
  5. Совместимость: Работает со всеми приложениями и инструментами разработки

Заключение

Настройка wildcard DNS с использованием dnsmasq и libvirt — надежное решение для локальной среды разработки. Ключевой момент — не забыть выполнить полную перезагрузку системы после настройки, чтобы гарантировать корректное применение всех изменений конфигурации сети. Использование метода net-define вместо net-edit позволяет избежать проблем с сохранением пользовательских настроек dnsmasq в XML-конфигурации сети libvirt.

Копирование материалов разрешается только с указанием автора Roman Sakhno и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.