语境
根据Cloudflare 文档从 Chrome 到递归解析器的 DNS 查询序列如下所示:
Check browser DNS cache --miss--> Check OS DNS cache --miss--> Recursive resolver
| |
V V
hit hit
Chrome 的 DNS 缓存 chrome://net-internals/#dns 和 firefox 的 DNS 缓存 about:networking#dns 列出了其中一个或另一个中的条目,并且可以使用 访问 Windows DNS 缓存ipconfig /displaydns
。
Windows 版本如下所示:
PS C:\> ipconfig /displaydns
Windows IP Configuration
chrome.cloudflare-dns.com
----------------------------------------
Record Name . . . . . : chrome.cloudflare-dns.com
Record Type . . . . . : 1
Time To Live . . . . : 54
Data Length . . . . . : 4
Section . . . . . . . : Answer
A (Host) Record . . . : 104.18.27.211
vortex.data.microsoft.com
----------------------------------------
Record Name . . . . . : vortex.data.microsoft.com
Record Type . . . . . : 5
Time To Live . . . . : 6
Data Length . . . . . : 8
Section . . . . . . . : Answer
CNAME Record . . . . : asimov.vortex.data.trafficmanager.net
...
systemd-resolve
在我的 Ubuntu 20.04 VPS 上,这看起来很有希望,但我无法列出所有条目。
rj@VPS:~$ systemd-resolve motel6.com
motel6.com: 23.35.171.243 -- link: eth0
-- Information acquired via protocol DNS in 85.2ms.
-- Data is authenticated: no
rj@VPS:~$ systemd-resolve motel6.com
motel6.com: 23.35.171.243 -- link: eth0
-- Information acquired via protocol DNS in 1.4ms.
-- Data is authenticated: no
我假设在第二个实例中,它是从 OS DNS 缓存中提取的,但对 VPS 的 DNS 服务器的 DNS 请求也可能是 1.4 毫秒并且现在已被缓存。
问题
如何查看 Linux 的 DNS 缓存中的所有条目?
(macos 也有加分,但我将范围限定在 Linux 上)
答案1
缓存并不保证在每个 Linux 系统上都存在。在传统配置中(即没有 systemd),应用程序会将 DNS 查询直接发送到 /etc/resolv.conf 中找到的服务器,因此首先看不到“系统”DNS 缓存。
发行版通常默认启用 DNS 缓存,但具体机制有所不同。
systemd-resolved 作为 DNS 缓存
如果您使用 systemd-resolved 作为 DNS 缓存(目前它确实是最接近“系统 DNS 缓存”),请运行systemctl kill -s USR1 systemd-resolved
journalctl -b -u systemd-resolved
并且在收到SIGUSR1后,它会将所有缓存内容转储到系统日志( )。
请注意,最新版本中引入了“systemd-resolve”工具resolvectl query
,它还可以--cache=no
选择绕过 systemd-resolved 的缓存。
测试一下,我们可以在脚本启动后向 journalctl 询问缓存中的所有 DNS 记录,然后使用 grep 查找在记录。
time=$(date +%s)
systemctl kill -s USR1 systemd-resolved
journalctl -b -u systemd-resolved -S "@$time" -o cat | grep " IN "
我们得到这个输出:
cloudflare.com IN A 104.16.133.229
cloudflare.com IN A 104.16.132.229
motel6.com IN A 23.35.171.243
vortex.data.microsoft.com IN CNAME asimov.vortex.data.trafficmanager.net
非 systemd DNS 解析器
在 systemd 出现之前,运行域名管理系统或者未绑定127.0.0.1 上的解析器 – 当然,它们有自己的缓存。如果其中一个正在您的系统上运行,则可能需要一个单独的主题,因为转储缓存的功能需要预先在两者中手动启用。
在 Unbound 中:
unbound-control dump_cache
将以可以再次加载的文本格式转储整个缓存,但必须先使用来设置控制通道unbound-control-setup
。在 dnsmasq 中:SIGUSR1 将生成缓存转储,就像 systemd-resolved 一样,但它仅在启用该
log-queries
选项时才有效(或者 dnsmasq 使用 以调试模式运行-d
)。
有些系统可能会运行神经胶质细胞作为通用缓存守护程序,其工作级别高于 DNS 查询 - 它处理抽象的“名称查找”请求。似乎没有办法正常转储其缓存内容(尽管nscd -p
存在用于检查 /var/db 中的“脱机缓存”(如果启用)的方法)。
答案2
默认情况下,Linux 系统上没有 DNS 缓存。您可以使用以下命令在系统上确认这一点
systemctl is-active systemd-resolved
如果您需要 DNS 缓存,请启用该服务。