
在日常使用Ubuntu等Linux系统的过程中,无论是普通用户、网站开发者还是系统运维工程师,经常会遇到DNS缓存相关的网络问题。例如网站更换了IP,局部访问异常,或本地解析记录与实际不符等。这些都可能与本地DNS缓存有关。与Windows系统只需一条ipconfig /flushdns命令相比,Ubuntu环境下的DNS缓存机制要复杂许多,不同版本、不同服务管理器有不同的缓存管理方式。如何**查看DNS缓存?如何刷新(清空)DNS缓存?**这些成为困扰许多用户的高频运维问题。本文将围绕Ubuntu主流DNS缓存机制和刷新方法展开技术讲解,涵盖Systemd-resolved、Dnsmasq、Bind9等常见方案,帮助你彻底掌握Linux DNS缓存的排查与优化能力。
一、引言:Ubuntu系统中的DNS缓存机制概述
- DNS缓存(Domain Name System Cache)即把已解析过的域名及其IP信息存储在本地/中间件内,下次再解析相同域名时,优先直接读取缓存,极大提升上网和服务访问速度,同时减少外部DNS服务器的压力。
- Ubuntu系统根据配置差异,可能没有启用本地DNS缓存(如部分云VPS裸装环境),而桌面环境、新版云主机以及部分应用服务器则普遍启用。
- 当前Ubuntu主流的DNS缓存服务有三类:Systemd-resolved (18.04及以后版本默认)、Dnsmasq (轻量缓存、常用于路由和虚拟化)、Bind9(企业级DNS服务器)、以及历史遗留的nscd(Name Service Cache Daemon)。
了解自己系统采用哪种DNS缓存方式,是高效管理和问题排查的前提。
二、判断Ubuntu当前使用的DNS缓存服务
首先,我们要辨别当前系统DNS缓存机制。可以通过以下方式检测:
-
检查systemd-resolved(99%新安装Ubuntu默认):
systemctl status systemd-resolved若显示"
active (running)",则是默认缓存方案。 -
检查dnsmasq:
systemctl status dnsmasq显示running说明正在用dnsmasq管理DNS缓存。
-
检查bind9:
systemctl status bind9用于自建本地DNS服务器时才见,普通桌面/云主机一般不会默认启用。
-
nscd(历史方案,现代版本极少见):
systemctl status nscd -
查看
/etc/resolv.conf,内容一般会有"nameserver 127.0.0.53"说明已启用systemd-resolved。
建议多方式综合比对。如果上述全部未启用,说明系统本身不做本地DNS缓存,所有解析均直接问远程DNS服务器。这种情况下无需主动"刷新"缓存。
三、查看DNS缓存内容(受限实现)
Ubuntu本身并没有像Windows那样直接列出完整DNS缓存的机制。以下为几种主流缓存服务下的可查方式及其限制:
-
systemd-resolved:
可以利用
systemd-resolve --statistics查看缓存条数和命中率,但不直接显示所有缓存列表内容。例如:systemd-resolve --statistics输出类似如下:
DNSSEC supported by current servers: no Transactions Current Transactions: 0 Total Transactions: 186 ... Cache Current Cache Size: 69 Cache Hits: 90 Cache Misses: 96并不会直接显示每条域名-IP的缓存项。仅便于整体观察和监控。
-
dnsmasq:
默认不提供直接查看缓存内容的命令,可通过dnsmasq日志、配置命令增加"
log-queries"以日志方式间接查阅。 -
bind9:
bind9支持通过
rndc dumpdb命令将缓存导出到文件/var/cache/bind/named_dump.db,适合自建DNS服务器分析。 -
nscd:
可以用
nscd -g命令简单列出缓存信息,但现代Ubuntu极少使用nscd。
小结: 主流Ubuntu系统下,真正能查看DNS缓存详情的办法较为受限,大多数情况下只能查看缓存的命中率、数量或间接通过日志、抓包解决。如需对特定域名进行DNS追踪,建议结合网络抓包工具(如tcpdump、wireshark)或本地hosts绕过。
四、刷新(清空)DNS缓存的实用操作方法
刷新DNS缓存的根本目的是让系统放弃"旧有缓存",强制重新从外部DNS服务器获取最新解析结果。针对不同服务管理器操作也各异。
1. 对于Systemd-resolved服务(Ubuntu 18.04及以上默认)
-
使用以下命令手动刷新缓存(需要root权限):
sudo systemd-resolve --flush-caches -
刷新后可用如下命令检查缓存统计,确认清空已生效:
systemd-resolve --statistics"
Current Cache Size"应变为0或很小的数字。 -
如需"软重启"服务(极少用),可:
sudo systemctl restart systemd-resolved推荐优先用flush命令。
2. 对于Dnsmasq服务
-
清空dnsmasq缓存最直接的方式是重载或重启服务:
sudo systemctl restart dnsmasq -
或发送HUP信号快速刷新(不影响进程状态):
sudo kill -SIGHUP $(pidof dnsmasq) -
如有用到NetworkManager时(桌面环境):可配合使用
sudo systemctl restart NetworkManager
3. 对于Bind9服务(常用于自建DNS服务器)
-
使用rndc工具重载/刷新缓存:
sudo rndc flush -
针对单一域名清缓存:
sudo rndc flushname yourdomain.com -
如无rndc命令,需先安装bind9utils包。
4. 对于nscd(不推荐,旧方法)
-
通过下列命令刷新nscd缓存(如有用到):
sudo systemctl restart nscd或
sudo nscd -i hosts
5. 若系统未启用本地DNS缓存怎么办?
- 如查无发现上述服务,说明Ubuntu实际并无本地DNS缓存机制。此时,"刷新缓存"只需要重启网络服务、断开再连接网络、或者直接重启机器,即自动放弃所有内存中的DNS解析条目。
sudo systemctl restart NetworkManager
# 或
sudo systemctl restart networking
五、常见问题排查与实用运维建议
- 不同网络环境(如企业代理、防火墙、落地DNS污染),DNS缓存异常可能并不在本地,而在上游运营商或出口网关设备上。如全网刷新无效,建议更换DNS(如8.8.8.8、1.1.1.1、114.114.114.114等)。
- 本地
/etc/resolv.conf可加入临时nameserver指定优先解析服务,但如有自动同步机制,重启网络后会自动被覆盖。建议用systemd-resolved的自定义配置进行持久性DNS指定。 - 重复DNS故障建议结合工具(dig、nslookup、host)与系统日志(如
/var/log/syslog)追踪排查。 - 云主机部署场景建议在定期维护脚本中加入DNS自动刷新、网络接口自检任务,提高服务稳定性。
六、实用常用命令速查表
# 显示DNS缓存统计(systemd-resolved)
systemd-resolve --statistics
# 刷新systemd-resolved缓存
sudo systemd-resolve --flush-caches
# 重启dnsmasq(刷新缓存)
sudo systemctl restart dnsmasq
# 刷新bind9缓存
sudo rndc flush
# 网络服务重启
sudo systemctl restart NetworkManager
# 指定域名DNS解析
dig www.example.com
nslookup www.example.com
总结
在Ubuntu系统环境中,DNS缓存的查看和刷新与Windows有本质不同。通过辨识系统运行的DNS缓存服务(systemd-resolved、dnsmasq、bind9等),对应采取命令刷新缓存;查看缓存信息则更多依赖统计数据和系统日志。在实际网络运维过程中,合理掌握DNS缓存控制技巧,可以有效避免解析故障、加速站点部署和系统升级。建议定期刷新缓存、变更网站解析后及时验证解析一致性,结合dig/nslookup等工具多维度确认,遇到复杂异常多查阅系统日志及上游DNS状态。只有深入理解Linux DNS解析与缓存原理,才能真正实现高效稳定的服务器与网络管理。
相关关键词: Ubuntu刷新DNS缓存、Linux DNS缓存机制、systemd-resolved清缓存、dnsmasq dns flush、bind9 flush cache、dig nslookup 运维实用命令