Main > Abyss > Ubuntu редирект всех доменов зоны .lan на localhost

Ubuntu редирект всех доменов зоны .lan на localhost

25.08.2026 0 comments »

Надоело прописывать вручную dev домены в hosts файл, чтобы было удобно открывать их во время разработки. Решил завернуть всю зону, в моем случае .lan на свою тачку. Т.е. чтобы любой домен с окончанием .lan всегд резолвился в 127.0.0.1

Для того, чтобы это сделать нам понадобиться dnsmasq, поэтому ставим его

sudo apt install dnsmasq

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

sudo nano /etc/dnsmasq.d/dev-zones.conf

Я прописываю для этого примера две зоны .lan и зону .test, вы можете оставить только одну

# Слушать только локалхост и нестандартный порт, чтобы не конфликтовать с systemd
listen-address=127.0.0.1
port=5354
bind-interfaces

# Заворачиваем абсолютно всё в зоне .lan и .test на 127.0.0.1
address=/.lan/127.0.0.1
address=/.test/127.0.0.1

Перезапускаем dnsmasq

sudo systemctl restart dnsmasq

Далее у нас есть два пути

Вариант 1. Заворачиваем только наши зоны из systemd-resolved в dnsmasq

Учим systemd-resolved ходить за нашими зонами в dnsmasq

Создаем файл конфига

sudo mkdir -p /etc/systemd/resolved.conf.d/
sudo nano /etc/systemd/resolved.conf.d/dev-lan.conf

с таким конфигом

[Resolve]
DNS=127.0.0.1:5354
Domains=~lan ~test

Символ ~ означает маршрутизацию - только запросы к .lan и .test пойдут на 127.0.0.1:5354, остальной интернет пойдет через обычные DNS

Применяем настройки

sudo systemctl restart systemd-resolved

Вот и все, тестим и забываем про ручные правки в /etc/hosts

$ ping any-domain.lan
PING any-domain.lan (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.011 ms

$ resolvectl query app.lan
app.lan: 127.0.0.1

-- Information acquired via protocol DNS in 11.4ms.
-- Data is authenticated: no; Data was acquired via local or encrypted transport: no
-- Data from: network

Вариант 2. Переходим полностью на dnsmasq

В этом случае мы завернем весь резолвинг в dnsmasq, для этого отключаем DNSStubListener

sudo nano /etc/systemd/resolved.conf

и добавляем или убираем комментирование

DNSStubListener=no

перезапускаем resolved

sudo systemctl restart systemd-resolved

Теперь 53 порт свободен, меняем конфиг dnsmasq

# Слушать только локалхост и нестандартный порт, чтобы не конфликтовать с systemd
listen-address=127.0.0.1
port=53
bind-interfaces

# Заворачиваем абсолютно всё в зоне .lan и .test на 127.0.0.1
address=/.lan/127.0.0.1
address=/.test/127.0.0.1

# Внешние апстримы
server=1.1.1.1
server=8.8.8.8

Перезапускаем dnsmasq

sudo systemctl restart dnsmasq

Заметка про зону ".local"

Зону .local лучше не использовать, тк практически все ОС, ее не резолвят через DNS, а сразу отправляют широковещательный мультикаст-пакет на адрес 224.0.0.251:5353 с вопросом у кого имя компа mysite.local. В итоге, если вы захотите заюзать эту зону в dnsmasq, то у вас всего скорее будут те или иные проблемы с резолвингом.

Однако в этом еще есть и плюс, если вы работаете над 1 проектом и вам не нужны множественные server name / virtual host, или вас устраивает вешать каждый свой проект на отдельный порт, то вы можете стучаться из своей локалки (например с телефона) по имени хоста компа, вообще без каких-либо настроек (кроме веб-сервера, который надо повесить на внешний интерфейс вместо локального).

Например, если мой комп в сети с именем homenet111, nginx у меня висит на ip локлаьной сети 192.168.0.100:80, то я просто подключаю свой телефон в ту же сеть через wifi и могу заходить на homenet111.local, ниче дополнительно ставить не надо.

Author: | Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *

Allowed HTML-tags: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>