我正在尝试为我的笔记本电脑构建一个简单的级联 DNS 解析算法:
- 查询 DHCP 提供的服务器
- 未找到/失败?查询 8.8.8.8 及其相关项
- 未找到/失败?查询 127.ABC 上的本地 dnsmasq
目前看来,仅当前一个服务器因某种原因失败时才会请求下一个服务器,但如果该服务器回复了空回复,则解决过程将停止。
是否可以通过内核机制或 systemd-resolved 强制 Linux 驱动的机器按照上述级联方式执行此操作?通过 dnsmasq 路由请求肯定是可能的(在第一个server=
指令中设置 systemd-resolved 以将查询转发到 DHCP 提供的服务器),但我更喜欢采用不那么混乱的方式,尽可能保持我的发行版的完整性。
答案1
不幸的是,DNS 的工作方式并非如此。只有在先前定义的服务器没有响应时,才会查询其他服务器。任何响应,即使该响应是 NXDOMAIN,都是响应。即使是查询被拒绝的响应也是响应...
答案2
事实证明,满足我需求的类似事情可以通过相反的方式完成(因为域不重叠)。必要的功能在 dnsmasq 本身中,我可以通过以下方式实现我想要的功能:
在 127.0.0.53 上启动 systemd-resolved
在 dnsmasq.conf 中添加必要的规则
address = /banana.services/127.0.0.1 address = /mango.services/127.0.0.1
使用 systemd-resolved 和全局 dns 的后备服务器完成 dnsmasq.conf
server = 127.0.0.53 server = 8.8.8.8 server = 8.8.4.4 server = 1.1.1.1
瞧瞧——现在* dnsmasq 将首先提供本地覆盖,然后查看本地 DNS,最后,如果它仍然一无所获,将查询知名 DNS 服务器列表
* nsswitch.conf 可能也需要改变解析的顺序。