Linux DNS 客户端配置这项西西弗斯式工作



Linux DNS 客户端配置这项西西弗斯式工作

Linux DNS 客户端配置这项西西弗斯式工作

原文作者:Xe Iaso、David Anderson。原文发表于 Tailscale Blog,2021 年 4 月 15 日。来源页没有公开标注开放转载许可;本文按已取得的许可翻译整理,并保留原作者和图像署名。

Linux 上的 DNS 配置经常被多个组件同时管理。DHCP、NetworkManager、resolvconf、systemd-resolved 和 VPN 客户端都可能尝试更新解析器配置。排查时,先找出谁拥有配置,再判断域名应该走哪条解析路径,比直接改写文件更重要。

先识别 /etc/resolv.conf 的管理者

最简单的 resolv.conf 只列出 DNS 服务器,例如:

nameserver 192.168.122.1

原文用 nslookup 展示一次普通查询的示例输出:

$ nslookup tailscale.com
Server: 192.168.122.1
Address: 192.168.122.1:53

Non-authoritative answer:
Name: tailscale.com
Address: 18.205.143.78

这是 2021 年文章中的样例输出,不代表目前的 DNS 地址或任何读者机器上的结果。

实际系统中,这个文件可能由服务生成,也可能是符号链接。顶部注释常会显示由谁管理,例如:

# Generated by resolvconf
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
# Generated by NetworkManager
重要:原文旧流程图包含“覆盖”或删除 /etc/resolv.conf 的分支。现代发行版常用符号链接或由系统服务动态生成该文件;盲目覆盖、删除可能导致整机断网。先检查文件是否为链接、链接目标、活跃的网络管理服务和发行版文档,再决定下一步;不要把图里的覆盖步骤当成通用操作。

resolvconf、NetworkManager 与 systemd-resolved

resolvconf 不是单一实现,而是一组约定。Debian 的 resolvconf 会把多个来源的设置合并;openresolv 则提供优先级及 exclusive 模式。后者允许某个配置来源排除其他来源,但多个服务争用 exclusive 时,仍可能由最后写入者胜出。

NetworkManager 可直接管理 resolv.conf,也可能通过 resolvconf 或 dnsmasq 工作。原文指出,NetworkManager 的 dnsmasq 模式才支持其所需的分流 DNS 路径。systemd-resolved 可以按接口与域后缀路由查询,并可由 Tailscale 通过 D-Bus 配置。

示例解析规则可以是:corp.example 后缀交给企业 DNS,.local 交给本机发现服务,其余域名交给公共解析器。按后缀路由可防止内部主机名泄漏到公共 DNS。普通 resolv.conf 本身不支持这种按域名分流的路由表。

Tailscale 的本地解析路径

在不使用路由感知的解析器时,Tailscale 可让操作系统把 DNS 请求交给本机的 tailscaled(100.100.100.100),再由其按 tailnet 配置分流。NetworkManager、resolvconf 与 systemd-resolved 的组合不同,配置责任也会不同。原文示例中的设备名和 tailnet 域名属于作者的历史机器输出;本文对域名做了省略处理。

resolv.conf mode: stub
Current DNS Server: 100.100.100.100
DNS Servers: 100.100.100.100 8.8.8.8 1.1.1.1
DNS Domain: <tailnet-domain>

原文还展示了 resolvconf 写入 100.100.100.100 的样例。该地址是 Tailscale 的本地 DNS 入口;样例不是可直接套用到任意发行版的配置。

原文决策图:保留上下文,避免照搬危险分支

以下四张图均为 Tailscale 原文附图,展示作者 2021 年的配置所有权排查流程。它们反映 NetworkManager 1.26.6(2020 年 12 月修复相关 systemd-resolved 问题)和 Tailscale 1.8 的历史背景。图中遇到无管理者时的“覆盖 resolv.conf”建议有风险;请同时阅读上面的安全说明。本文保留原图供读者理解历史决策,不把图中的旧操作当作当前通用建议。

Tailscale 原文图:判断 resolv.conf 是否存在,并进入后续分支
原文附图一:初始检查分支。图中存在覆盖文件的历史建议,不能脱离当前系统管理方式使用。署名 Xe Iaso、David Anderson / Tailscale。
Tailscale 原文图:根据 resolv.conf 所有者以及 resolvconf 是否可用选择配置路径
原文附图二:resolvconf 与 NetworkManager 的历史选择分支。署名 Xe Iaso、David Anderson / Tailscale。
Tailscale 原文图:检查 systemd-resolved、NetworkManager 和 resolvconf 的配置所有权
原文附图三:systemd-resolved 与 NetworkManager 的历史配置分支。署名 Xe Iaso、David Anderson / Tailscale。
Tailscale 原文图:汇总 resolv.conf 管理者、systemd-resolved、NetworkManager 与 resolvconf 的 DNS 配置决策
原文附图四:作者对完整决策流程的汇总图。署名 Xe Iaso、David Anderson / Tailscale。
按域后缀选择企业 DNS 或默认解析路径的概念图
补充示意图:域后缀分流概念;不是主机检测结果。

版本与安全边界

本文主要解释 Linux DNS 配置所有权和 split DNS 的概念。原文中的 NetworkManager 1.26.6 与 Tailscale 1.8 均是历史版本背景,不可据此推断当前发行版、glibc/musl、VPN 客户端或解析器组合的行为。systemd-resolved 的路由匹配、NetworkManager 后端以及各 resolvconf 实现会因版本和发行版不同而异。

原文提到 glibc 与 musl 的解析行为也不同。处理 DNS 泄漏、VPN 断线或覆盖配置等安全问题,应先在隔离环境验证并准备回滚。本文仅静态阅读了原有命令和输出;没有执行命令、修改 DNS、进行网络实验或检查实际主机。

来源与署名:Xe Iaso、David Anderson,《The Sisyphean Task Of DNS Client Config on Linux》,Tailscale Blog,2021-04-15。来源页版权归 Tailscale Inc. 与原作者;公开页面未提供开放许可说明。按授权翻译和复用原文诊断图。


© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容