我问这个问题关于如何查看 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。