Когда сайты живут дома, DNS появляется в двух местах. Снаружи — публичная зона, по которой весь интернет находит белый адрес. Внутри — роутер, который должен отвечать домашним устройствам внутренним адресом сервера, чтобы они не ходили к своим же сайтам через интернет. Плюс вопрос, какой резолвер вообще спрашивать. Здесь три истории: одна запись на всю зону, выбор резолвера замером и ответ-заглушка провайдера, который сломал телевизионную приставку.
Это седьмая часть цикла «Домашняя инфраструктура».
Одна запись на роутере — для всех поддоменов
Сайтов полтора десятка, и почти все — поддомены одного домена. Заводить на роутере запись на каждый не хотелось. В RouterOS есть флаг, который делает запись ответом и для самого имени, и для любого поддомена — включая ещё не созданные:
/ip dns static add name=example.ru match-subdomain=yes address=192.168.88.10 comment="all sites -> server"
Теперь любой новый сайт на сервере сразу открывается дома по внутреннему адресу, без единой правки на роутере. И попутно решилась история из третьей части: домашние устройства больше не гоняют трафик к своим сайтам через белый адрес.
Исключений из такой записи в RouterOS не сделать. Я проверил опытом: точная запись для одного имени не перебивает match-subdomain, как её ни ставь, — и запись по регулярному выражению тоже. Если какому-то поддомену нужен внешний адрес, остаётся файл hosts на компьютере. На телефонах он не работает.
Публичная зона: две записи, а не одна
Снаружи то же сделано записью «на всё»: *.example.ru → белый адрес. Но запись со звёздочкой не отвечает за сам домен, только за поддомены. Поэтому записей две — корень и звёздочка. И помните про уровни: *.example.ru ловит blog.example.ru, но не a.blog.example.ru. Явная запись перебивает звёздочку — так почта и служебные имена продолжают жить своей жизнью.
Находка при аудите зоны: у прежнего хостинга DNS была ещё и TXT-запись со звёздочкой с содержимым SPF. Она отвечала на _dmarc.example.ru и _domainkey.example.ru — то есть почтовые серверы получателей видели вместо политики DMARC запись SPF и считали DMARC невалидным. Записи «на всё» любого типа проверяйте на служебных именах.
Какой резолвер спрашивать — решает замер
Роутер по умолчанию спрашивает DNS провайдера. Это быстро — сервер рядом. Но при проверке выяснилось, что провайдерский резолвер на часть доменов отвечает не настоящим адресом, а адресом своей страницы-заглушки. Решил выбрать резолвер не по отзывам, а замером: пять запросов к каждому плюс проверка, правильный ли ответ.
| Резолвер | Время | Домен А | Домен Б |
|---|---|---|---|
| провайдера | 26 мс | заглушка | верно |
| Google, обычный DNS | 46 мс | верно | нет ответа |
| Яндекс, обычный DNS | 52 мс | верно | верно |
| Яндекс, DNS поверх HTTPS | 90 мс | — | нет ответа |
| Google, DNS поверх HTTPS | 132 мс | верно | верно |
| Quad9, DNS поверх HTTPS | 151 мс | — | нет ответа |
| Cloudflare, DNS поверх HTTPS | 174–214 мс | верно | верно |
Главный вывод не в том, кто победил. Один и тот же Google через обычный DNS и через HTTPS дал разные результаты: открытый DNS-запрос идёт по сети без защиты, и на пути с ним может случиться что угодно. «Лучший резолвер» зависит от транспорта, и проверять надо ровно ту комбинацию, которую собираетесь включить.
DNS поверх HTTPS на MikroTik
- роутеру нужны корневые сертификаты, чтобы проверять сервер DoH. Скачивать их самим роутером с
check-certificate=no— замкнутый круг (проверять нечем, а качаем то, чем проверять). Скачал бандл на компьютер и положил на роутер черезscp -O— у RouterOS нет SFTP, без-Oне работает; - нужны статические записи для самого имени сервера DoH (
dns.google → 8.8.8.8), иначе роутеру надо узнать адрес резолвера, чтобы начать резолвить; use-peer-dns=noна WAN — иначе провайдер подсунет свои серверы обратно.
Время ответа через DoH получилось 60 мс, из кэша — 20 мс. А потом DoH пришлось выключить — из-за приставки.
Заглушка провайдера сломала телевизор
IPTV-приставка от провайдера стала ходить за своими настройками не тем путём, что раньше. Казалось бы, при чём тут DNS. Нить нашлась в списках адресов роутера: у меня есть список, который роутер сам наполняет адресами из DNS-ответов, чтобы применять к ним отдельное правило. Адрес страницы-заглушки провайдера попал туда вместе с ответами для «домена А». А на этом же адресе у провайдера живёт сервер, с которого приставка забирает настройки. Правило, предназначенное для одного сайта, зацепило совершенно другой сервис, потому что у них оказался общий адрес.
# в каких списках сидит адрес — первое, что смотреть при странностях локального сервиса
/ip firewall address-list print where address=203.0.113.50
Лечение — отдельный список исключений, правило «пропустить» для него стоит раньше разметки. А DoH на роутере я выключил совсем: приставке нужен провайдерский DNS, чтобы находить внутренние имена провайдера, которых нет в публичном DNS.
Мелочи RouterOS, на которые уходит время
- правило, ссылающееся на пустой список адресов, висит с флагом
I(invalid) до появления первой записи — это не ошибка; - комментарии пишите латиницей: кириллица в выводе превращается в
D0BE…; - всё сложное — файлом
.rscи/import: кавычки в командах через PowerShell калечатся; - у RB4011 нет батарейки часов. Если NTP выключен, после отключения света время уезжает в 1970 год — у меня так датировался бэкап конфигурации.
Дома или в офисе странно работает DNS?
Опишите, что не открывается и где, — проверю резолверы, записи на роутере и списки, которые могли зацепить лишнее.
// загружаю комментарии…