Когда сайты живут дома, 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, обычный DNS46 мсвернонет ответа
Яндекс, обычный DNS52 мсверноверно
Яндекс, DNS поверх HTTPS90 мс—нет ответа
Google, DNS поверх HTTPS132 мсверноверно
Quad9, DNS поверх HTTPS151 мс—нет ответа
Cloudflare, DNS поверх HTTPS174–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?

Опишите, что не открывается и где, — проверю резолверы, записи на роутере и списки, которые могли зацепить лишнее.

· полезно?
АЧ
Алексей Чикун веб-разработчик, команда TRIOHEAD

Делаю сайты и сервисы целиком: от вёрстки до сервера. Пишу о том, что проверил на своих проектах.

Комментарии

// загружаю комментарии…

Комментарии публикуются после проверки. Ссылки и HTML не принимаются.