linux本地dns缓存推荐systemd-resolved(默认轻量)、dnsmasq(灵活定制)或bind(企业级功能);启用systemd-resolved需启动服务、配置/etc/systemd/resolved.conf并指向stub解析器;dnsmasq适用于内网映射与分流;bind适合多客户端共享及日志策略;均可用dig二次查询验证缓存命中。

Linux 配置本地 DNS 缓存服务,核心目标是减少重复查询、缩短响应时间、降低对外部 DNS 的依赖。目前主流方案有三种:systemd-resolved(轻量、系统集成)、dnsmasq(灵活、功能丰富)、bind(完整 DNS 服务,适合缓存+转发场景)。选哪种取决于你的需求复杂度和系统角色——普通桌面或服务器建议优先用 systemd-resolved 或 dnsmasq;若需企业级缓存+日志+访问控制,则考虑 bind。
启用 systemd-resolved(推荐默认方案)
Ubuntu 18.04+/Debian 11+/Fedora/CentOS Stream 等现代发行版已预装该服务,只需正确启用和配置即可获得开箱即用的缓存能力:
- 确认并启动服务:
sudo systemctl enable --now systemd-resolved - 确保
/etc/resolv.conf指向 stub 解析器:sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf(否则应用会绕过缓存直连上游) - 编辑
/etc/systemd/resolved.conf,在[Resolve]段落中设置:-
DNS=114.114.114.114 223.5.5.5(国内常用公共 DNS) -
FallbackDNS=1.1.1.1 8.8.8.8(备用) -
Cache=yes(默认已开启,可显式确认) -
DNSSEC=allow-downgrade(兼顾安全与兼容性)
-
- 重启服务:
sudo systemctl restart systemd-resolved,然后用systemd-resolve --statistics查看缓存命中率
部署 dnsmasq(更可控、适合定制化)
当 systemd-resolved 与 NetworkManager 冲突,或你需要自定义域名解析(如内网 host 映射)、按域名分流、设置 TTL 控制等,dnsmasq 是更稳妥的选择:
- 先停用 systemd-resolved:
sudo systemctl disable --now systemd-resolved,并恢复静态/etc/resolv.conf(如echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf) - 安装并启动:
sudo apt install dnsmasq(Debian/Ubuntu)或sudo dnf install dnsmasq(Fedora/RHEL) - 编辑
/etc/dnsmasq.conf,关键配置项包括:-
listen-address=127.0.0.1(仅监听本地) -
bind-interfaces(避免绑定到所有接口) -
cache-size=1000(默认 150,建议调大) -
no-resolv(禁用读取 /etc/resolv.conf) -
server=114.114.114.114、server=223.5.5.5(显式指定上游) -
addn-hosts=/etc/hosts(支持 /etc/hosts 中的映射)
-
- 重启服务:
sudo systemctl restart dnsmasq,验证:dig @127.0.0.1 google.com +stats,查看 “QUERY TIME” 和 “SERVER” 字段
使用 bind 搭建专用缓存 DNS(高可用/多客户端场景)
适用于局域网多台设备共享一个高速缓存 DNS,或需要完整 DNS 日志、访问策略、区域转发等功能:
- 安装:
sudo dnf install bind -y(RHEL/Fedora)或sudo apt install bind9(Debian/Ubuntu) - 编辑
/etc/named.conf,重点配置:-
listen-on port 53 { 127.0.0.1; 192.168.1.0/24; };(按需开放内网访问) -
allow-query { any; };(或限定子网) -
recursion yes;(必须开启递归) -
forwarders { 114.114.114.114; 223.5.5.5; };(指定上游) -
dnssec-validation no;(若上游不支持 DNSSEC,可临时关闭)
-
- 启动服务:
sudo systemctl enable --now named,检查状态:sudo named-checkconf和sudo journalctl -u named -f - 客户端将
/etc/resolv.conf的 nameserver 改为该服务器 IP(如nameserver 192.168.1.10)
验证缓存是否生效
无论选择哪种方案,都可通过以下方式确认缓存起作用:
- 首次解析耗时较长:
time dig google.com +short - 立即再次执行,观察“Query time”是否明显下降(如从 30ms 降到 1–2ms)
- 查看缓存统计:
- systemd-resolved:
systemd-resolve --statistics(关注 “Current Cache Size” 和 “Cache Hits”) - dnsmasq:
sudo dnsmasq -t或查日志sudo journalctl -u dnsmasq | grep "cached" - bind:
rndc stats后查看/var/named/data/named.stats中的 “A”、“AAAA” 查询计数
- systemd-resolved:
- 注意:部分应用(如 Firefox、Chrome)自带 DNS 缓存,建议用
dig或nslookup测试底层系统行为











