Перейти к основному содержимому

Руководства / Починка: руководства по ошибкам, которые встречаются на практике

Как очистить кэш DNS в Windows, macOS и Linux

Чтобы очистить DNS, выполните ipconfig /flushdns в Windows, sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder в macOS или resolvectl flush-caches в Linux с systemd-resolved. Точная команда зависит от операционной системы, а в Linux еще и от того, какой резолвер в ней работает.

Что такое DNS-кэш и почему помогает его очистка

Каждый раз, когда устройство разрешает имя хоста в IP-адрес, оно на некоторое время сохраняет ответ вместо того, чтобы спрашивать заново при следующем запросе. Этот сохраненный ответ живет в DNS-кэше операционной системы, и это отдельный кэш от того, что поверх него держит браузер. Именно кэширование делает просмотр сайтов быстрым: без него каждый запрос к каждому ресурсу на странице заново отправлял бы запрос имени.

Кэш становится проблемой в тот момент, когда запись меняется. Если сайт переехал на новый IP-адрес, сменил хостинг-провайдера или обновил CNAME, ваша машина может продолжать отвечать старым значением, пока кэшированная запись не истечет. Резолверы кэшируют и отрицательные ответы, то есть «такого имени не существует», на срок, заданный в SOA-записи домена, так что имя, которое только что заработало, еще несколько минут может отказывать локально. Очистка кэша заставляет следующий запрос уйти заново, а не переиспользовать то, что уже сохранено.

Как очистить DNS в Windows

  1. Откройте командную строку. Собственные инструкции Microsoft по устранению неполадок используют командную строку с повышенными правами (правый клик, Запуск от имени администратора) для команд DNS, так что начните с нее, если обычная ведет себя странно.
  2. Выполните ipconfig /flushdns. По документации Microsoft Learn для этой команды, она «очищает и сбрасывает содержимое кэша DNS-клиента», отбрасывая и отрицательные записи, и все, что было добавлено динамически.
  3. Убедитесь, что сработало, командой ipconfig /displaydns, которая выводит все, что сейчас есть в кэше резолвера. Сразу после очистки список должен быть почти пустым; откройте пару сайтов и выполните команду снова, чтобы увидеть, как в нем появляются свежие записи.

Если старый адрес продолжает возвращаться, вместе с арендой адреса могли закэшироваться и сами DNS-серверы, выданные по DHCP. Освобождение и обновление адаптера подхватывает и то, и другое:

ipconfig /release
ipconfig /renew

Как очистить DNS в macOS

Команда зависит от того, насколько старая версия macOS стоит на машине, и использование не той команды на современном Mac просто ничего не делает.

  • Yosemite 10.10.4 и все версии после нее (это покрывает все актуальные поддерживаемые версии macOS, включая Sequoia, Sonoma, Ventura, Monterey и Big Sur): sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder. Первая команда очищает кэш Directory Service, вторая посылает mDNSResponder сигнал HUP, чтобы он перезапустился и сбросил то, что держал.
  • Только Yosemite с 10.10 по 10.10.3 использовала другой инструмент: sudo discoveryutil mdnsflushcache.
  • Mavericks, Mountain Lion и Lion: хватало одной sudo killall -HUP mDNSResponder.
  • Snow Leopard (с 10.6 по 10.6.8): только sudo dscacheutil -flushcache, без шага с killall.

Если только у вас не Mac настолько старый, что предшествует обновлению Yosemite 2014 года, используйте первую команду. Обе ее части запрашивают пароль вашей учетной записи, и при успехе команда ничего не выводит.

Как очистить DNS в Linux

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

Сначала выполните resolvectl status. Если она вернет настройки DNS по каждому интерфейсу, машина работает на systemd-resolved, который используется по умолчанию в актуальных Ubuntu, Fedora и большинстве других современных дистрибутивов. Если команда не найдена, проверьте два других распространенных сервиса: systemctl status nscd или systemctl status dnsmasq (а если systemd не используется, поищите процесс командой ps aux | grep -E 'nscd|dnsmasq').

  • systemd-resolved (systemd 239 и новее): resolvectl flush-caches. В руководстве systemd это описано как очистка «всех кэшей ресурсных записей DNS, которые сервис хранит локально». Проверить результат можно командой resolvectl statistics, которая показывает текущий размер кэша.
  • systemd-resolved на более старом systemd (до переименования в версии 239): sudo systemd-resolve --flush-caches. Некоторые текущие дистрибутивы до сих пор держат ее как псевдоним для совместимости даже после появления resolvectl, так что стоит попробовать ее, если resolvectl отсутствует, а systemd-resolve есть.
  • nscd: sudo systemctl restart nscd перезапускает весь сервис и вместе с ним очищает кэш. Чтобы сбросить только кэш хостов без перезапуска, на дистрибутивах с такой возможностью работает sudo nscd -i hosts.
  • dnsmasq: отправка сигнала HUP очищает кэш без остановки сервиса, согласно его собственной man-странице: sudo killall -HUP dnsmasq. Обычная sudo systemctl restart dnsmasq тоже работает и дополнительно перечитывает конфигурацию.

Как очистить собственный DNS-кэш браузера

Chrome держит собственный DNS-кэш, отдельный от системного, так что очистки одного только системного кэша часто недостаточно, чтобы изменение вступило в силу. Откройте chrome://net-internals/#dns и нажмите Clear host cache. Браузеры на основе Chromium (Edge, Brave, Opera и другие) открывают ту же страницу по тому же адресу.

Это все еще может не решить проблему полностью. Chrome также держит пул уже открытых соединений со старым IP-адресом и может переиспользовать одно из них вместо нового соединения, даже когда DNS-кэш уже пуст. Откройте chrome://net-internals/#sockets и нажмите Flush socket pools, чтобы закрыть и их тоже. Если сайт все еще открывается в старой версии после обоих шагов, попробуйте приватное окно, поскольку оно стартует вообще без кэшированных соединений.

Почему старый адрес все еще появляется после очистки

Если вы очистили все кэши на машине, а браузер все еще показывает старый сервер, задержка обычно уже не локальная. Домашний роутер обычно держит собственный небольшой DNS-кэш для каждого устройства в сети, и перезагрузка роутера очищает этот слой. Помимо роутера, свой кэш держит и резолвер вашего провайдера, и напрямую очистить его вы не можете; он очищается сам, когда истекает TTL кэшированной записи.

TTL, время жизни записи DNS, это и есть реальный предел того, как быстро может распространиться изменение. Каждый резолвер между вами и авторитативным сервером имен вправе держать ответ ровно столько секунд, прежде чем будет обязан спросить снова. Запись с TTL в один час вполне законно может еще почти час отдавать некоторым посетителям старый адрес после изменения, что бы вы ни очищали на своей машине. О том, что определяет эти сроки и как проверить, закончилось ли обновление записи повсюду, смотрите в руководстве как работает распространение DNS.

Часто задаваемые вопросы

Нужно ли перезагружать компьютер после очистки DNS?

Нет. Каждая из команд выше действует немедленно и очищает только кэш в памяти; перезагрузка не входит в процесс ни в Windows, ни в macOS, ни в Linux.

Почему очистка DNS не решила проблему?

Обычно старый ответ продолжают хранить три вещи: собственный кэш браузера (очистите его отдельно на chrome://net-internals/#dns), роутер, обслуживающий вашу сеть, или TTL записи, который просто еще не истек больше нигде в интернете. Если запрос вообще не проходит или полностью упирается в таймаут, а не возвращает устаревший ответ, это указывает на DNS-сервер, который не отвечает, а не на проблему с кэшем.

Как очистить DNS на телефоне?

Ни iOS, ни Android не предоставляют команду для ручной очистки DNS. Включение и выключение авиарежима или переключение с Wi-Fi на мобильные данные и обратно заставляет устройство сбросить кэшированное состояние DNS и заново разрешить имя при следующем запросе.

Помогает ли очистка DNS от медленной загрузки страниц?

Сама по себе редко. Поврежденный или разросшийся локальный кэш может добавить небольшую задержку, но стабильно медленные запросы чаще вызваны самим резолвером. О более вероятных причинах и о том, как их проверить, смотрите в руководстве почему DNS-запросы выполняются медленно.

В чем разница между очисткой DNS и очисткой кэша браузера?

Кэш браузера хранит содержимое страниц: HTML, CSS, изображения и скрипты. DNS-кэш хранит только соответствие имени хоста IP-адресу, которое нужно, чтобы вообще найти сервер. Очистка одного не очищает другой, и устаревшая страница может быть вызвана и тем, и другим.

Как убедиться, что очистка сработала?

В Windows сразу после очистки выполните ipconfig /displaydns: список должен вернуться почти пустым. В Linux с systemd-resolved команда resolvectl statistics показывает текущий размер кэша. В macOS нет аналогичной команды для проверки, так что практический способ убедиться - снова запросить домен командой dig example.com или запустить проверку из-за пределов вашей собственной сети инструментом вроде DNS-запроса, который опрашивает сразу несколько локаций и заодно показывает, устаревший ответ локальный для вас или идет от самих серверов имен домена.

Проверить сейчас

Запустите бесплатную проверку своего сайта - аккаунт не нужен.

Dns query

Следить за этим постоянно

Получайте оповещение в момент сбоя: HostTracker проверяет более чем из 300 локаций и уведомляет по email, SMS, в Slack, Telegram и не только.

Возможности HostTracker

Ещё в этом разделе: Починка: руководства по ошибкам, которые встречаются на практике