如何使用 systemd 获取 Linux 上 DNS 缓存中记录的 TTL?

如何使用 systemd 获取 Linux 上 DNS 缓存中记录的 TTL?

我问这个问题关于如何查看 Linux DNS 缓存。看起来这是可行的,但它不显示 TTL,与 Firefox、Chrome 和 Windows 不同。

在 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

...

在 Linux 上,可以转储缓存并使用 journalctl 查看它:

rj@vps:~$ time=$(date "+%F %T")
rj@vps:~$ systemctl kill -s USR1 systemd-resolved
rj@vps:~$ journalctl -b -0 --since "$time" -u systemd-resolved | grep " IN "
Oct 10 22:28:38 myserver systemd-resolved[3255524]:         cloudflare.com IN A 104.16.133.229
Oct 10 22:28:38 myserver systemd-resolved[3255524]:         cloudflare.com IN A 104.16.132.229

问题

如何使用 systemd 获取 Linux 上 DNS 缓存中记录的 TTL?

编辑:

根据用户 1686 的回答,此脚本将返回 TTL,如果为 0 或不在缓存中,则返回 0:

get-ttl () {
    site="$1"
    time=$(date "+%F %T")
    systemctl kill -s USR1 systemd-resolved
    dns_cache=$(journalctl -b -0 --since "$time" -u systemd-resolved \
        | grep " IN ")
    site_cache="$(echo $dns_cache | grep $site)"
    if [ "$site_cache" ]
        then dig +noall +answer $site A | awk '{ print $2 }'
        else echo 0
    fi
}

然后,您可以使用它来查找缓存中和缓存外的 TTL:

$ get-ttl motel6.com
3349
$ get-ttl motels.com
0

答案1

针对缓存解析器进行 DNS 查询:

dig +noall +answer cloudflare.com A @127.0.0.53

剩余的缓存 TTL(以秒为单位)将显示为第二个字段(名称和类别之间)。可选择添加+ttlunits以对其进行格式化。

(请注意,你不应该需要指定@127.0.0.53,因为使用 systemd-resolved 时它应该是 resolv.conf 中唯一的条目;我仅将其包含在演示目的中。)

每当 DNS 服务器从缓存返回答案时(无论是 systemd-resolved 还是 dnsmasq 或你的路由器或 8.8.8.8),答案的 TTL 字段将始终指示其余的在服务器缓存中存活的时间,以确保下游解析器不会将条目缓存超过原始限制。只有权威答案才可能包含完整的 TTL。

相关内容