15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
10.10.2024

如何在Windows、macOS和Chrome中清除DNS缓存

清除DNS缓存会强制您的操作系统或浏览器丢弃本地存储的DNS记录,并从权威名称服务器获取最新映射。这一操作可以解决各种连接故障——从ERR_NAME_NOT_RESOLVED错误到服务器迁移后遗留的过期IP记录。

什么是DNS缓存?它是由操作系统(以及某些浏览器单独维护)保存的临时本地数据库,存储之前DNS查询的结果。每次解析像example.com这样的主机名时,解析出的IP地址会与TTL(生存时间)计数器一起存储。在TTL过期之前,系统会完全跳过上游解析器,直接使用缓存记录——这虽然速度快,但一旦记录过期、被污染或指向已停用的服务器,就会成为隐患。

为什么DNS缓存会成为问题

了解故障模式有助于理解为什么有时刷新是唯一正确的解决方法:

  • 服务器迁移或IP变更:当网站迁移到新基础设施时,其DNS记录会更新为新的A或AAAA记录。如果本地缓存仍保存旧IP,所有请求都会发送到错误的主机——通常导致连接超时或TLS证书不匹配错误。
  • DNS缓存污染:恶意软件和中间人攻击可以向本地缓存注入虚假记录,悄无声息地将流量重定向到攻击者控制的服务器。刷新缓存可立即清除被污染的条目。
  • 负缓存:失败的DNS查询(NXDOMAIN响应)也会被缓存。如果某个域名曾暂时无法访问且负结果已被缓存,系统将拒绝再次解析该域名,直到负TTL过期——即使该域名已恢复在线也是如此。
  • 分离式DNS冲突:使用本地/etc/hosts覆盖或VPN分配解析器的开发人员,经常会遇到覆盖其预期路由的过期缓存条目。
  • VPN断开后的残留:VPN会话的残留DNS条目在断开连接后可能持续存在,导致本地网络上的DNS泄漏或路由故障。

如何在Windows中清除DNS缓存

该操作在Windows 7、8、10和11上完全相同。唯一的实质区别是您偏好使用命令提示符还是PowerShell。

方法一:命令提示符(ipconfig /flushdns)

  1. Win + R,输入cmd,然后按Ctrl + Shift + Enter以管理员权限启动命令提示符。或者,在开始菜单中搜索命令提示符,右键单击并选择以管理员身份运行
  2. 运行刷新命令:
ipconfig /flushdns
  1. 成功刷新后返回:
Windows IP Configuration

Successfully flushed the DNS Resolver Cache.

如果出现错误,请确保以提升的权限打开了命令提示符。标准用户会话没有DNS客户端服务缓存的写入权限。

方法二:Windows PowerShell

PowerShell提供了一个专用cmdlet,可直接与DNS客户端服务交互,而无需通过旧版ipconfig接口。

  1. Win + X,在Windows 11上选择Windows PowerShell(管理员)终端(管理员)
  2. 运行:
Clear-DnsClientCache

成功时没有确认输出——命令静默返回。要验证缓存是否为空,请立即运行Get-DnsClientCache;它应该不返回任何结果。

方法三:重启DNS客户端服务

在上述命令失败的极少数情况下——通常是由于DNS客户端服务状态损坏——重启服务本身会作为副作用清除缓存:

Stop-Service -Name Dnscache -Force
Start-Service -Name Dnscache

重要注意事项:在某些Windows配置中,DNS客户端服务被设置为其他网络服务的依赖项。停止它可能会短暂中断网络连接。请勿在没有维护窗口的情况下在生产服务器上运行此操作。

查看当前DNS缓存(Windows)

在刷新之前,检查缓存内容通常很有用,可以确认过期记录是否确实是问题所在:

Get-DnsClientCache

这将输出所有缓存条目及其TTL、记录类型和解析数据——比盲目刷新具有更高的诊断价值。

如何在macOS上清除DNS缓存

macOS在所有现代版本上使用mDNSResponder作为DNS服务守护进程。自macOS Sierra以来,刷新机制保持一致,但旧版本需要不同的命令。

macOS Ventura、Monterey、Big Sur、Catalina、Mojave、High Sierra、Sierra(10.12及更高版本)

  1. 通过Applications > Utilities > Terminal打开终端,或按Cmd + Space并输入Terminal
  2. 运行:
sudo killall -HUP mDNSResponder
  1. 在提示时输入管理员密码。密码字段不会显示字符——这是预期行为。按Enter确认。

没有成功提示。-HUP信号指示mDNSResponder重新加载其配置并清除缓存,无需完全重启。

macOS El Capitan和Yosemite(10.11 / 10.10)

El Capitan使用与上述相同的mDNSResponder命令。Yosemite曾短暂将mDNSResponder替换为discoveryd,需要不同的方法:

sudo discoveryutil udnsflushcaches

macOS Mavericks、Mountain Lion和Lion(10.9及更早版本)

sudo killall -HUP mDNSResponder

刷新macOS上的其他DNS缓存层

macOS维护不止一个DNS缓存。为了彻底刷新——在调试分离式DNS或mDNS问题时尤为重要——请按顺序运行以下三个命令:

sudo killall -HUP mDNSResponder
sudo killall mDNSResponderHelper
sudo dscacheutil -flushcache

dscacheutil -flushcache清除目录服务缓存,该缓存存储系统级进程使用的额外名称解析数据。省略此步骤可能会留下mDNSResponder单独无法清除的残留条目。

如何清除Google Chrome中的DNS缓存

Chrome维护自己的内部DNS缓存,完全独立于操作系统级别的解析器。这是一个有意为之的架构决策——Chrome的网络栈(基于Chromium的net::库构建)会预解析它预测您将访问的域名,并将这些结果缓存在进程内。这意味着即使刷新了操作系统DNS缓存,Chrome仍会从自己的存储中提供过期记录。

分步操作:刷新Chrome的DNS缓存

  1. 打开Google Chrome。
  2. 在地址栏中导航至:
chrome://net-internals/#dns
  1. 点击清除主机缓存按钮。这将立即清除Chrome进程内缓存中保存的所有DNS条目。

重置Chrome的Socket池

DNS缓存条目和开放的TCP/TLS连接是两个独立的问题。如果您已清除DNS缓存,但Chrome仍通过旧连接路由流量(例如服务器IP更改后),则还必须刷新socket池:

  1. 导航至:
chrome://net-internals/#sockets
  1. 点击刷新socket池

这将关闭所有空闲和活跃的keep-alive连接,强制Chrome使用新解析的IP地址重新建立新的TCP连接。

刷新后重启Chrome

完全关闭所有Chrome窗口并重新打开浏览器。在macOS上,确保Chrome没有仍在Dock中后台运行——右键单击图标并选择退出,而不仅仅是关闭窗口。

DNS缓存对比:操作系统级别与浏览器级别

属性操作系统DNS缓存Chrome DNS缓存
范围系统范围内所有应用程序仅Chrome浏览器
刷新命令(Windows)`ipconfig /flushdns``chrome://net-internals/#dns`
刷新命令(macOS)`sudo killall -HUP mDNSResponder``chrome://net-internals/#dns`
遵守操作系统TTL设置部分(使用自己的TTL逻辑)
受VPN DNS变更影响不会立即受影响
可被诊断工具查看`Get-DnsClientCache`、`dscacheutil -cachedump`仅通过Chrome内部工具
系统重启后清除是(进程内存)
浏览器重启后清除

各平台刷新命令一览

平台/版本命令
Windows(所有版本)`ipconfig /flushdns`
Windows PowerShell`Clear-DnsClientCache`
macOS 10.12及更高版本`sudo killall -HUP mDNSResponder`
macOS Yosemite(10.10)`sudo discoveryutil udnsflushcaches`
macOS(完整刷新)`sudo killall -HUP mDNSResponder && sudo dscacheutil -flushcache`
Google Chrome(所有操作系统)`chrome://net-internals/#dns` > 清除主机缓存
Linux(systemd-resolved)`sudo systemd-resolve –flush-caches`
Linux(nscd)`sudo service nscd restart`

此处包含Linux是因为管理VPS托管环境的管理员在传播DNS变更时,经常需要同时刷新本地工作站和远程服务器上的DNS缓存。

DNS缓存刷新可解决的常见错误

  • ERR_NAME_NOT_RESOLVED——Chrome无法解析主机名。几乎总是DNS问题;同时刷新操作系统和Chrome缓存。
  • DNS_PROBE_FINISHED_NXDOMAIN——解析器返回了不存在的域名响应。可能是过期的负缓存条目。
  • 服务器迁移后出现ERR_CONNECTION_TIMED_OUT——旧IP仍被缓存。刷新操作系统缓存,并使用nslookupdig验证是否返回了新IP。
  • TLS/SSL证书不匹配错误——如果缓存的IP指向与持有正确证书的服务器不同的服务器,将出现证书名称不匹配。这在域名在托管提供商之间迁移时很常见。如果您管理SSL基础设施,请确保在DNS TTL过期之前,SSL证书已在正确的源服务器上配置。
  • CMS迁移后出现间歇性404错误——网站可以加载,但资源或页面返回404。通常是由于CDN或反向代理仍解析到旧源服务器。在每个层面刷新缓存。

DNS传播与本地缓存:一个关键区别

一个常见的误解是,清除本地DNS缓存会使新发布的DNS记录立即可见。实际上并非如此——如果上游递归解析器(您的ISP的DNS服务器或像8.8.8.8这样的公共解析器)也缓存了旧记录,您将继续收到旧IP,直到该解析器的缓存过期。

正确的诊断工作流程是:

  1. 使用dig @8.8.8.8 example.com Anslookup example.com 1.1.1.1直接检查权威记录。
  2. 如果权威记录正确但本地解析有误,则刷新本地操作系统缓存。
  3. 如果权威记录本身仍然错误,则问题出在DNS注册商或托管控制面板层面——而非本地缓存。

在管理托管于独立服务器上的域名DNS时,请在计划迁移前至少24小时将TTL设置为较低值(300秒)。这可以最大限度地缩短传播窗口,并减少互联网上过期缓存条目的影响范围。

DNS缓存管理的安全影响

DNS缓存污染(也称为DNS欺骗)是一类攻击,攻击者向解析器缓存中注入恶意A或CNAME记录,将用户重定向到欺诈服务器。虽然DNSSEC在协议层面提供了加密验证,但本地缓存卫生仍是一种实用的第一响应措施。

如果您怀疑DNS缓存已被污染:

  1. 使用适合您操作系统的命令立即刷新本地缓存。
  2. 切换到支持DNSSEC验证的解析器,例如Cloudflare(1.1.1.1)或Google(8.8.8.8)。
  3. 检查正在运行的进程,查找可能正在修改hosts文件的恶意软件(Windows上为C:WindowsSystem32driversetchosts,Unix系统上为/etc/hosts)。
  4. 检查路由器的DNS设置——攻击者一旦入侵路由器,无论本地缓存状态如何,都可以重定向网络上的所有DNS查询。

对于运营自有邮件基础设施的企业,DNS完整性尤为关键。配置错误或被污染的DNS记录会直接影响SPF、DKIM和DMARC验证。如果您依赖邮件托管服务,请在任何DNS变更后验证MX、SPF和DKIM记录是否正确解析。

自动化DNS缓存刷新

对于经常处理DNS变更的开发人员和系统管理员——特别是在VPS控制面板配置、暂存环境切换或域名迁移期间——自动化刷新可以完全省去手动步骤。

Windows计划任务(PowerShell):

$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-Command Clear-DnsClientCache"
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00AM"
Register-ScheduledTask -Action $action -Trigger $trigger -TaskName "FlushDNSCache" -RunLevel Highest

macOS launchd plist(每天凌晨3点刷新):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
  "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.local.flushdns</string>
  <key>ProgramArguments</key>
  <array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>killall -HUP mDNSResponder</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>3</integer>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
</dict>
</plist>

将此文件保存到~/Library/LaunchAgents/com.local.flushdns.plist,并使用launchctl load ~/Library/LaunchAgents/com.local.flushdns.plist加载。

自动化刷新在CI/CD流水线中最为有用,在这些流水线中,DNS记录作为部署工作流的一部分以编程方式更新,构建代理必须在变更应用后立即解析新记录。

技术决策矩阵:何时刷新以及在哪里刷新

症状刷新操作系统缓存刷新Chrome缓存刷新路由器缓存检查上游解析器
网站在Firefox中可以加载但在Chrome中不行
网站在所有浏览器中均无法访问
网络上所有设备均无法访问网站
`nslookup`显示正确IP但网站仍然失败是(socket)
同事可以访问网站但您不能
刚完成服务器迁移
疑似DNS污染

刷新前后的实用检查清单

  • 在本地刷新之前,使用dig或像whatsmydns.net这样的在线工具确认DNS变更已传播到权威服务器。
  • 注意您正在排查的记录的当前TTL——如果是86400秒(24小时),本地刷新只对您有帮助;其他用户仍会看到旧记录长达24小时。
  • 在Windows上,刷新前运行ipconfig /displaydns以捕获当前缓存状态的快照,用于诊断目的。
  • 刷新后,在打开浏览器之前使用nslookup example.comping example.com确认是否返回了新IP。
  • 如果在共享虚拟主机环境中工作,请记住托管提供商的名称服务器也会缓存记录——如果传播在服务器层面似乎卡住了,请联系支持。
  • 对于Chrome,清除DNS缓存后,还需清除socket池并执行强制刷新(Windows/Linux上按Ctrl + Shift + R,macOS上按Cmd + Shift + R),以同时绕过浏览器的HTTP缓存。
  • 如果在生产环境中执行,请在变更日志中记录此次刷新——DNS变更和缓存刷新在数天后诊断部署后问题时经常被忽视。

常见问题

清除DNS缓存会影响浏览速度吗?

暂时会。刷新后,系统必须对每个访问的主机名执行全新的DNS查询,这会增加少量延迟开销(通常每次查询20–100毫秒),直到缓存重新填充。对大多数用户来说,这几乎感觉不到。缓存会在正常浏览几分钟内自动重建。

刷新DNS缓存会让我退出网站登录状态吗?

不会。DNS缓存条目与浏览器Cookie、会话令牌和身份验证状态完全分离。刷新DNS不会影响这些内容。

ipconfig /flushdnsClear-DnsClientCache有什么区别?

两个命令都指示Windows DNS客户端服务清除其缓存。ipconfig /flushdns是通过ipconfig工具与服务通信的旧版接口;Clear-DnsClientCache是直接使用WMI/CIM接口的原生PowerShell cmdlet。最终结果相同,但Clear-DnsClientCache可脚本化并返回结构化对象,在自动化场景中更为适用。

为什么刷新操作系统DNS缓存后,Chrome仍然显示旧网站?

Chrome维护自己的进程内DNS缓存,不受操作系统级别刷新的影响。您必须通过chrome://net-internals/#dns单独清除Chrome的缓存。此外,如果旧的TCP连接在Chrome的socket池中仍然存活,还必须通过chrome://net-internals/#sockets刷新socket池。

我应该多久清除一次DNS缓存?

没有通用的时间表。应按需清除——当遇到DNS相关错误时、服务器或域名迁移后、疑似安全事件后,或在VPN与非VPN网络配置之间切换时。只有在DNS记录频繁变更的开发或暂存环境中,才有必要进行定期计划刷新。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用