Linux DNS 分流:系统接管与域名策略各司其职
了解 Linux 系统解析器、本地 DNS 代理和企业 DNS 之间的职责边界,以及如何避免上游循环和内部域名泄漏。
DNS 接管经常被简化为“修改系统 DNS”。但一个可靠的实现需要分别回答两个问题:操作系统如何把查询交给客户端,以及客户端如何选择查询的上游服务器。
两个独立的职责
Linux 平台适配层负责将遵循系统解析路径的应用接入本地 DNS 代理。Go DNS 代理负责按照企业域名后缀选择企业 DNS 或终端原有 DNS。把两层分开,才能分别验证系统集成和策略执行。
在使用 systemd-resolved 的设备上,应先识别服务状态、/etc/resolv.conf 的指向和当前网络管理方式,再应用受支持的运行时配置。若让 systemd-resolved 把所有常规查询交给本地代理,代理可以在专用本地端口监听,避免与系统 Stub 地址冲突。
保存接管前的上游
外部 DNS 上游必须在接管前从活动网络状态中发现并保存。接管后再读取系统解析配置,可能只会读到本地代理自身,进而形成循环。
企业 DNS 推荐直接使用 IP 地址。代理访问企业 DNS 和原有 DNS 时,应使用直接的 UDP/TCP DNS 客户端,避免调用系统解析接口再次把请求发回代理。
内部域名要失败关闭
企业域名后缀应只发送到企业 DNS。若企业 DNS 不可用,内部名称解析应失败,不应转发到公共 DNS。外部域名则继续使用接管前发现的终端 DNS 上游。
这种保证要通过代理日志和抓包验证。只观察命令是否返回了一个 IP 地址,无法证明查询没有被发送到不该接收它的上游。
接管必须可恢复
应用配置之前,记录当前 DNS 状态和配置所有权。网络切换、DHCP 更新、解析服务重启以及客户端退出时,都需要重新验证期望状态;恢复配置前还要确认目标配置仍由客户端管理,避免覆盖用户或网络管理器后来做出的更改。
最后,系统解析接管只覆盖遵循系统解析器的应用。自行发送 DNS、使用 DoH/DoT 或内置解析器的应用可能绕过系统路径。若部署要求强制管控,还需要单独设计网络层策略。
