简介:我确信有不少人都遇到过 DNS 缓存问题。有很多关于在 Ubuntu 中清除 DNS 缓存的提示和技巧,以及关于完全禁用它的更罕见的信息。但大多数答案都没有触及问题的核心:如果您是运行自己的内部 DNS 服务器的普通用户,您是否需要 DNS 缓存?(有点开玩笑,但不是。)
我遇到的问题是,我有自己的内部域,并运行自己的 DNS 服务器(BIND),它既为我的网络上的内部主机(大约 75 台主机)提供服务,也是互联网主机的缓存解析器(这样我就可以稍微快一点地浏览网页,尽管今天的情况比 20 年前有所改善)。
DNS 缓存的目的是减轻 DNS 服务器的负担。我想,如果你是普通人,没有运行自己的 DNS 服务器,那么这可能被视为一种减轻 ISP DNS 服务器负担的方法。但对于像我这样需要通过名称在内部访问所有主机的人来说,能够解析内部域也是必不可少的。
我使用 autofs 和 nfs 自动挂载不同的卷来存储音乐、视频、照片等。当然,我可以通过 IP 完成所有这些操作,但主机名看起来和感觉起来更好。谁有时间在 75 台不同的机器上管理 /etc/hosts?因此,我希望 DNS 查询仅到达我的 DNS 服务器,而 Ubuntu 22.04 似乎在这方面存在特殊问题。
问题:我遇到过很多次尝试打开自动挂载 NFS 卷但找不到的情况。我对服务器执行 nslookup 后...缓存中没有本地运行的记录。我尝试了多种解决方案但都不起作用。有一种解决方案可以确保在 192.168.20.10 上运行的 DNS 服务器是缓存所依赖的服务器。但根本不起作用。
另一个解决方案(有点麻烦)是手动设置 /etc/resolv.conf,然后使其不可变。这行不通,因为 /etc/resolv.conf 是一个符号链接。有一段时间,我只是手动将其更正为指向我的 DNS,它最终会返回到 NetworkManager 设置的 DNS。我终于找到了解决方案。
解决方案(但是...)
#!/bin/bash
[[ $(id -u) -ne 0 ]] && echo "This must run as root" && exit
systemctl disable systemd-resolved.service
systemctl stop systemd-resolved
grep "dns=none" /etc/NetworkManager/NetworkManager.conf || sed -i '/\[main\]/a dns=none' /etc/NetworkManager/NetworkManager.conf
rm /etc/resolv.conf
printf "nameserver 192.168.20.10\nsearch mydomain.prv\n" > /etc/resolv.conf
chattr +i /etc/resolv.conf
这确实有效。但这不是正确的答案。正确的解决方案是找出 DNS 缓存为何能在一段时间内与我的 DNS 配合使用,然后放弃并开始只为绕过我的 DNS 服务器的互联网主机提供服务。这让我想到了……
问题:有人知道 Ubuntu 22.04 中的默认 DNS 缓存如何选择从哪里获取 DNS 答案吗?我尝试将 DNS 服务器添加到 netplan,但没有成功。我甚至找不到关于 Ubuntu 使用什么 DNS 缓存的明确答案。我看到的大多数参考资料都是关于 dnscache 的,但也有一些参考资料是 dnsmasq。我的系统没有 dnscache 命令,但有 dnsmask 命令。我从 Ubuntu 18.04 升级到了 22.04,所以这些问题可能是由于垃圾造成的?只要它始终使用我的 DNS 服务器,我使用缓存就没有问题,但我没有找到任何可靠的说明来解决真正的问题。所以,现在,我仍然会坚持使用上面的脚本,因为它“有效”。但我希望一切正常。
答案1
至少 Ubuntu Server 22.04systemd-resolved.service
默认使用。这是一个 DNS 解析器和 DNS 缓存。请勿并行安装第二个 DNS 缓存。
Ubuntu Server 用于netplan
网络配置(Ubuntu Desktop 使用网络管理器)。
systemd-resolved.service
在启动时或通过 netplan apply(Ubuntu Server)进行配置。
如果解析是通过网络或缓存完成的,您可以使用命令resolvectl
eG提供的信息查看状态统计等的详细信息。resolvectl query ubuntuusers.de
请参阅resolvectl –help
和man resolvectl
了解详情。