我最近遇到了一个明显的 DNS 解析问题,我已记录下来这里这促使我进一步调查 /etc/resolv.conf 。
在我的 Linux Mint 机器上,这是一个指向 /run/systemd/resolve/stub-resolv.conf 的符号链接,其内容为:
nameserver 127.0.0.53
options edns0 trust-ad
该文件实际上包含更多注释行,建议管理员不要更改其内容(我最终必须这样做才能解决我原来的问题)。
经过一番研究后,我想我明白了现代 Linux 系统使用了一个新的resolveconf
软件包,尽管非常令人不安的sudo apt changelog resolvconf
是,最新版本 1.82 是不稳定。
我的理解是 127.0.0.53 正在将 DNS 请求重定向到resolveconf,后者将执行必要的查找。 有人可以确认一下吗?
这个帖子声称可以使用备用 DNS 服务器创建一个文件,然后通过sudo resolvconf -u
更新 /etc/resolv.conf。嗯,在 1.82 版本中这个命令不存在。man resolvconf
显示最接近的是resolvectl
,但页面没有显示任何此类 -u 选项,也没有提及建议的基本文件。 事情又发生了变化吗?还是那篇文章中的评论根本就是错误的?
我的临时快捷方式是删除符号链接/etc/resolv.conf
并创建一个具有相同名称和我选择的 DNS 服务器的文件,但我认为这完全使resolveconf 包变得无用,并可能产生其他负面影响。因此,我在完成我需要的操作后立即恢复我的黑客行为。与此同时,我正在寻求进一步的澄清,我希望有人能在这里阐明一些观点。
答案1
resolvconf
曾经/现在是一个工具,旨在允许/etc/resolv.conf
从多个源(例如 DHCP、系统管理员的静态配置、VPN 客户端、安装本地 DNS 服务器...)更新文件,其方式允许恢复每个源的设置,而无需对其他来源的干扰。它还允许为每个 DNS 配置源设置优先级,以便每当有超过三个候选 DNS 服务器时,只会选择前三个候选服务器。
(除非根据默认值调整 DNS 超时,否则在查询超时之前只能进行 3 次查询尝试,因此配置三个以上的 DNS 服务器/etc/resolv.conf
通常没有用。)
然而,我认为 Ubuntu 和 Mint 已经迁移到使用systemd-resolved
而不是经典的glibc
DNS 解析器。如果hosts:
in 中的行/etc/nsswitch.conf
hasresolve
而不是 或 before ,则这是正确的dns
。此配置将直接路由使用 glibc 的主机名解析 API 执行的任何 DNS 查询,而不进行任何systemd-resolved
检查。 /etc/resolv.conf
(从技术上讲,libnss_resolve.so
使用 来代替libnss_dns.so
。)
但是您的系统可能有一些不会使用的旧应用程序glibc
,或者 DNS 诊断程序(nslookup
等dig
),它们将实现自己的 DNS 查询,但会读取/etc/resolv.conf
以找出要使用的默认 DNS 服务器。因此,systemd-resolved
默认情况下将提供一个类似 DNS 服务器的接口,127.0.0.53:53
并且(除非禁用此兼容性接口)将/etc/resolv.conf
使用一条nameserver 127.0.0.53
线路进行配置,因此即使是特殊情况也会最终使用systemd-resolved
.
resolvectl
主要是管理 的工具systemd-resolved
,其功能是(经典libnss_dns.so
解析器库 + resolvconf
)的超集。该resolvectl
命令与 具有一定的兼容性resolvconf
,但兼容性并不完美:您可以通过等提供每个接口的 DNS 服务器配置,而不是修改 中的现有文件/etc/resolvconf/resolv.conf.d/
或添加新文件然后[/var]/run/resolvconf/interface/
运行。resolvconf -u
resolvectl dns <interface name> 1.1.1.1 8.8.8.8
resolvectl domain <interface name> domain.name.example
由于您似乎同时安装了resolvconf
和systemd-resolved
,因此您可能会遇到与 Debian 11 中相同的情况:man resolvconf
实际上会显示 的手册页resolvectl
,包括其兼容性说明。要查看实际的手册页resolvconf
,您需要输入man 8 resolvconf
.
输出中的“不稳定”sudo apt changelog resolvconf
并不意味着该版本不稳定现在: 它的意思是做出改变时该版本在 Debian 中unstable
。对于安全错误修复,您会看到<releasename>-security
代替unstable
.变更日志是单个软件包历史的一部分:当软件包从 Debian 不稳定版转移到测试版再转到稳定版时,或者从不稳定/测试版转移到 Ubuntu、Mint 或其他源自 Debian 的发行版时,它们不会被重写。
答案2
您可以尝试仅使用systemd-resolved
:
- 将缺少的名称服务器添加到
/etc/systemd/resolved.conf
- 删除解析配置
- 将符号链接保留在
/run/systemd/resolve/stub-resolv.conf
原处。
使用resolvectl status
或检查您的 DNS 服务器systemd-resolve --status
并使用 测试名称解析systemd-resolve NAME
。