Домашняя сеть редко обходится без двух ролей: разрешения имён и выдачи адресов. Роутер справляется с ними, но часто медленно, без заметного кэша и без возможности назвать NAS по имени. dnsmasq — маленький демон, который совмещает DNS-кэш, перенаправление запросов и DHCP-сервер в одном конфиге из пары десятков строк. Разберём настройку, после которой устройства получают статические адреса, а имена вида nas.lan работают у всех клиентов сети.
Установка и проверка конфигурации
В дистрибутивах на apt и dnf пакет называется одинаково, ставится он без неожиданных зависимостей:
sudo apt install dnsmasq
sudo dnsmasq --test
sudo systemctl enable --now dnsmasq
Главный файл конфигурации — /etc/dnsmasq.conf, но удобнее выносить свои секции в отдельный каталог /etc/dnsmasq.d/: при обновлении пакета стандартный конфиг может перезаписаться, а ваши правила останутся нетронутыми. Перед каждым перезапуском прогоняйте --test: демон проверит синтаксис и укажет строку с ошибкой, не свалив рабочую службу. Проверить, что демон жив, можно командой systemctl status dnsmasq — там же будет код выхода и первые строки журнала.
Типичные причины, по которым служба не стартует:
- порт 53 уже занят другим резолвером;
- опечатка в имени директивы — демон сообщит номер строки;
- каталог /etc/dnsmasq.d не создан или нечитаем;
- в файрволе не разрешён входящий UDP-трафик на порт 53.
Кэш и перенаправление запросов
Базовый набор для кэширующего резолвера выглядит так:
cache-size=1000
no-resolv
server=1.1.1.1
address=/lan/192.168.1.10
bogus-nxdomain=192.168.1.1
local=/lan/
cache-size задаёт количество хранимых записей; no-resolv запрещает читать серверы из /etc/resolv.conf — иначе вы унаследуете адреса роутера, который может начать отдавать мусор после сбоя. Директива address=/lan/192.168.1.10 означает: любой запрос, оканчивающийся на .lan, разрешается на этот адрес. Так, не трогая настройки роутера, имена вроде nas.lan и printer.lan начинают работать у всех устройств. Строка local=/lan/ запрещает утекать эти запросы наружу провайдеру, а bogus-nxdomain отбрасывает ложные ответы, которыми некоторые провайдеры подменяют результат поиска. Если нужен именно кэш, дополните конфиг строкой cache-min-ttl=300, чтобы результат держался подольше, а log-queries включит запись каждого запроса в журнал для диагностики.
DHCP-сервер для домашних устройств
dhcp-range=192.168.1.50,192.168.1.150,24h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:dns-server,192.168.1.10
dhcp-host=aa:bb:cc:dd:ee:ff,nas,192.168.1.10
dhcp-authoritative
Первая строка задаёт пул адресов и время жизни аренды. Вторая и третья выдают клиентам шлюз и наш DNS-сервер — именно этот пункт заставляет гаджеты спрашивать имена у dnsmasq, а не у провайдера. dhcp-host привязывает MAC-адрес к имени и адресу: NAS всегда будет 192.168.1.10, и проброс портов можно настраивать спокойно, не боясь смены адреса. Директива dhcp-authoritative сообщает демону, что он единственный DHCP в сегменте, поэтому клиенты с устаревшей арендой получают немедленный отказ вместо ожидания таймауста. Добавьте domain=lan, чтобы суффикс подставлялся автоматически.
Конфликт с systemd-resolved и диагностика
Главная «грабля» свежих систем — занятый порт 53. systemd-resolved может слушать его на адресе 127.0.0.53, и тогда dnsmasq завершится с ошибкой «address already in use». Проверяем и решаем конфликт:
ss -ulnp | grep :53
resolvectl status
sudo systemctl disable --now systemd-resolved
После отключения resolved перепишите /etc/resolv.conf на строку nameserver 127.0.0.1, иначе система останется без резолвера. Не забудьте открыть порт 53 в локальном файрволе, если он активен: sudo ufw allow 53/udp и sudo ufw allow 67/udp для DHCP. Для наблюдения за работой включите журнал запросов командой sudo dnsmasq --no-daemon --log-queries или смотрите журнал службы через journalctl -u dnsmasq -f.
Тестирование на реальных устройствах
После перезапуска службы проверьте, что клиенты действительно получают настройки от нового сервера. На Linux-ноутбуке сбросьте аренду командой sudo dhclient -r eth0 && sudo dhclient eth0, затем убедитесь через resolvectl status, что в списке DNS появился адрес 192.168.1.10. На Android достаточно выключить и включить Wi-Fi, на iPhone — забыть сеть и подключиться заново. Если гаджет упрямится и показывает старый роутер в качестве DNS, помогает принудительный renew: у роутера стоит отключить DHCP-сервер, чтобы в сегменте остался единственный источник адресов — с параметром dhcp-authoritative dnsmasq сможет отозвать старые аренды почти мгновенно.
Полезная проверка после настройки: dig @127.0.0.1 nas.lan +short должен вернуть 192.168.1.10, а повторный запрос того же имени отработать мгновенно из кэша. Убедиться, что кэш действительно работает, поможет разница во времени двух последовательных вызовов dig — второй должен отвечать практически мгновенно. Если запрос к внешнему домену не проходит, временно добавьте no-hosts и проверьте, не конфликтует ли файл /etc/hosts с вашими зонами. После всех правок не забудьте выполнить sudo systemctl restart dnsmasq и убедиться, что служба поднялась без ошибок: многие директивы применяются только после перечитывания конфигурации.
Ограничение слушателей и безопасность
Если на машине работает несколько сетевых интерфейсов, dnsmasq по умолчанию слушает их всех. Чтобы отдать DNS только внутреннему сегменту, используйте директивы interface=eth0 и except-interface=wlan0, а для надёжного связывания с интерфейсом, который может получить адрес позже демона, — bind-dynamic. Полезно также запретить рекурсивные запросы извне параметром stop-dns-rebind и отбросить ответы приватными адресами через rebind-localhost-ok. Проверьте, что файл с арендами /var/lib/misc/dnsmasq.leases обновляется: cat этого файла показывает, какие устройства сейчас получили адреса от вашего сервера.
Итог
dnsmasq превращает один старый компьютер или мини-ПК в полноценный центр имен и адресов домашней сети: кэш ускоряет разрешение, директива address даёт локальные имена, а dhcp-host закрепляет за устройствами постоянные адреса. Ключевые моменты настройки — вынос правил в /etc/dnsmasq.d/, обязательная проверка синтаксиса через --test и разбор конфликта порта 53 с systemd-resolved. С десятком строк конфигурации сеть становится предсказуемой, а диагностика — прозрачной для всех устройств в доме. И главное: один демон закрывает задачу, ради которой раньше приходилось настраивать отдельный DNS и отдельный DHCP, и делает это предсказуемо, с журналом и понятными сообщениями об ошибках. Такой сервер не требует дорогого железа: ему хватит старого мини-ПК с двумя гигабайтами памяти, а отказ демона легко диагностируется стандартными средствами журналирования.