如何在Linux上查看OS DNS缓存?

如何在Linux上查看OS DNS缓存?

语境

根据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-resolvedjournalctl -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 缓存,请启用该服务。

相关内容