В прошлой части DNS работал как часы: три перехода, ответ, кэш. На практике с ним связана добрая половина вопросов «почему у меня открывается, а у коллеги нет». Почти всегда виноват не сбой, а кэш, запись «на всё» или зона, которую забыли создать. Разберём на примерах, каждый можно повторить у себя.

Это третья часть цикла «Что происходит, когда открываешь сайт».

«Сменил адрес, а открывается старый сервер»

Ответ с TTL 300 резолвер держит 5 минут — но отсчёт у каждого резолвера свой, с того момента, когда он спросил. Видно, как таймер тикает:

$ dig alekseychikun.ru A +noall +answer @8.8.8.8
alekseychikun.ru.   300  IN  A  203.0.113.22
$ sleep 3; dig alekseychikun.ru A +noall +answer @8.8.8.8
alekseychikun.ru.   297  IN  A  203.0.113.22

Кэшей на пути несколько, и каждый живёт по своим правилам:

  • резолвер провайдера или публичный — по TTL, но некоторые провайдеры держат дольше, чем просят;
  • операционная система — в Windows смотреть ipconfig /displaydns, сбросить ipconfig /flushdns;
  • браузер — у Chrome свой кэш, сбросить на странице chrome://net-internals/#dns;
  • уже открытые соединения — браузер не спрашивает DNS снова, пока жив keep-alive к старому адресу.

Поэтому «у меня уже новый сайт, а у коллеги старый» в первые минуты после переключения — нормальная картина. Если не хочется ждать, проверяйте не браузером, а прямым вопросом к серверам домена: dig example.ru A @ns1.ваш-dns. Они отвечают без кэша.

TTL уменьшают заранее. Поменяли TTL с суток на 5 минут и сразу адрес — у тех, кто спросил до этого, старый ответ проживёт ещё сутки. Сначала уменьшить TTL, подождать старое значение, потом менять адрес.

Отрицательный ответ тоже кэшируется

Спросите несуществующее имя — придёт NXDOMAIN, «такого нет». К нему приложена запись SOA зоны, и её последнее поле говорит, сколько помнить отказ:

$ dig net-takogo-domena-31337.ru A @1.1.1.1
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN
ru.  3600  IN  SOA  a.dns.ripn.net. hostmaster.ripn.net. 4070741 86400 14400 2592000 3600

Грабля отсюда: проверили адрес поддомена до того, как завели запись, получили «нет такого», завели запись — а резолвер ещё час отвечает «нет такого». Новую запись лучше проверять прямо у серверов домена, а не через публичный резолвер, которому вы только что задали этот вопрос.

NOERROR, но пустой: запись нужного типа отсутствует

$ dig alekseychikun.ru AAAA @1.1.1.1
;; ->>HEADER<<- opcode: QUERY, status: NOERROR
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1

Имя есть, IPv6-адреса нет — это нормально. Опасна обратная ситуация: при переезде поменяли запись A, а про AAAA забыли. У посетителей с IPv6 браузер пойдёт по старому адресу на старый сервер, и вы будете искать ошибку, которая воспроизводится «только у некоторых». Переезжая, смотрите все записи имени, а не одну.

Запись «на всё»: любое имя — ваш сервер

Запись *.example.ru отвечает на любое имя, для которого нет своей записи. Удобно: новый поддомен заводится без похода в DNS. Проверяем на этом сайте случайным именем:

$ dig zzz-proverka-12024.alekseychikun.ru A +noall +answer @1.1.1.1
zzz-proverka-12024.alekseychikun.ru. 300 IN A 203.0.113.22

Обратную сторону мы увидели в Search Console на этой неделе. Отчёт «Страницы не проиндексированы» показал адреса вида www.test1… и даже blog.blog.test1… — поддомены, которые когда-то были тестовыми копиями. Записи «на всё» хватило, чтобы любое имя, найденное поисковиком в старой ссылке, доходило до сервера. Страшного ничего: сервер отдавал на них запрет индексации, а теперь — 404. Но если сервер на любое имя отдаёт ваш сайт, поисковик увидит дубли на бесконечном числе поддоменов.

Используете запись «на всё» — настройте сервер так, чтобы неизвестные имена получали 404 или переадресацию на основной домен, а не копию сайта.

SERVFAIL: домен оплачен, а не резолвится

SERVFAIL означает, что резолвер не смог получить ответ вообще. Реальный случай: домен куплен, у регистратора указаны DNS-серверы хостинга, а саму зону на этих серверах никто не создал. Зона ru честно отправляет к ним, они отвечают «не знаем такой зоны», резолвер сдаётся. Сайт не открывается ни у кого, а Let’s Encrypt каждый день пытается продлить сертификат для этого имени и пишет в журнал прокси ошибку с тем же SERVFAIL. Лечится созданием зоны и записи A на стороне хостинга DNS.

# у кого делегирован домен
dig +trace +nodnssec example.ru NS | tail -4
# отвечает ли каждый из них за зону (должен быть флаг aa и запись A)
dig example.ru A @ns1.hosting-dns.example

DNS поверх HTTPS: браузер может спрашивать в обход системы

Современные браузеры умеют отправлять DNS-запросы не на системный резолвер, а по HTTPS на свой (DoH). Выглядит это как обычный запрос к веб-серверу:

$ curl -s -H 'accept: application/dns-json' \
    'https://cloudflare-dns.com/dns-query?name=alekseychikun.ru&type=A'
{"Status":0, …, "Answer":[{"name":"alekseychikun.ru","type":1,"TTL":300,"data":"203.0.113.22"}]}

Для приватности это хорошо: провайдер не видит, какие имена вы спрашиваете. Для отладки — ловушка. Прописали адрес в файл hosts или подняли свой DNS для тестового стенда, а браузер с включённым DoH их не видит: curl открывает тестовый сервер, браузер — боевой. Проверьте настройку «Использовать безопасный DNS», прежде чем искать ошибку на сервере.

Короткая шпаргалка

СимптомСкорее всегоПроверка
у одних новый сайт, у других старыйкэш на пути, TTLdig @сервер-домена против dig @8.8.8.8
новый поддомен «не существует» ещё часзакэширован NXDOMAINSOA зоны, последнее поле
ошибка только у некоторыхзабытая AAAAdig AAAA
поисковик нашёл странные поддоменызапись «на всё»случайное имя через dig
не открывается ни у кого, SERVFAILзона не создана у хостинга DNSdig +trace, затем прямой вопрос к NS
curl открывает одно, браузер другоеDoH мимо hostsнастройка безопасного DNS в браузере

Не понимаете, почему сайт у кого-то не открывается?

Пришлите имя домена — проверю цепочку DNS от корня до записей и найду, где расходится.

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

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

Комментарии

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

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