Настройка 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
Это необходимо, потому что:
- Перезапускаются все сетевые службы
- Обновляются кэши DNS
- Применяются все изменения в конфигурации сети
- Гарантируется корректная инициализация виртуальной сети 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 настроен и стабильно работает после перезагрузки системы.
Преимущества решения
- Автоматизация: Не нужно редактировать файл hosts для каждого нового поддомена
- Стабильность: Настройки сохраняются после перезагрузок
- Гибкость: Легко изменить целевой IP-адрес
- Производительность: Локальный DNS-сервер работает быстро
- Совместимость: Работает со всеми приложениями и инструментами разработки
Заключение
Настройка wildcard DNS с использованием dnsmasq и libvirt — надежное решение для локальной среды разработки. Ключевой момент — не забыть выполнить полную перезагрузку системы после настройки, чтобы гарантировать корректное применение всех изменений конфигурации сети. Использование метода net-define вместо net-edit позволяет избежать проблем с сохранением пользовательских настроек dnsmasq в XML-конфигурации сети libvirt.
-
Создано 15.01.2026 15:15:39
-
Roman Sakhno

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