我计划将我的域名的 DNS 从一个提供商迁移到另一个提供商。(“mydomain.com”,因为我必须审查真实名称)从技术上讲,这只是在注册商更改之前更改 NS 记录的问题,但我想通过欺骗本地机器上的 DNS 服务器并进行测试来确保我不会错过一些域名。
我首先尝试将 /etc/resolv.conf 更改为“nameserver 2.22.230.67”(它是新的名称服务器之一),但它不再返回指向不同域(edgekey.net)的 CNAME 条目的任何内容:
$ dig +short login.mydomain.com
prod.mydomain.com.edgekey.net.
$ dig +short prod.mydomain.com.edgekey.net
e8727.dscx.akamaiedge.net.
$ dig +short e8727.dscx.akamaiedge.net
$
然后我尝试安装和配置 bind,但很快就放弃了,并使用以下条目再次尝试使用 dnsmasq:
server=mydomain.com/2.22.230.67
尽管如果我通过发出多个查询手动询问,dnsmasq 可以正确解析 CNAMES,但问题仍未解决:
$ dig +short login.mydomain.com
prod.mydomain.com.edgekey.net.
$ dig +short prod.mydomain.com.edgekey.net
e8727.dscx.akamaiedge.net.
104.84.78.23
$ nslookup login.mydomain.com
Server: 127.0.0.1
Address: 127.0.0.1#53
login.mydomain.com canonical name = prod.mydomain.com.edgekey.net.
prod.mydomain.com.edgekey.net canonical name = e8727.dscx.akamaiedge.net.
Name: e8727.dscx.akamaiedge.net
Address: 2a02:26f0:2b00:396::2217
Name: e8727.dscx.akamaiedge.net
Address: 2a02:26f0:2b00:3a9::2217
$ ping login.mydomain.com
ping: login.mydomain.com: Name or service not known
我是否做错了什么或者对 dnsmasq 的期望太高了?
我已经放弃并启动下一步,迁移 DNS 并在生产中进行测试,但我仍然很好奇我应该如何测试它。
如果我使用的是 Windows 10,我可能会尝试 powershell 命令Add-DnsClientNrptRule
,它看起来非常符合我的需要,但现在我想要一个适用于 Linux 的解决方案。
答案1
你对它的期望太高了。/etc/resolv.conf 和 dnsmasq 都是“存根”解析器 - 它们不知道如何跟踪委派,也不知道如何追踪别名。它们都依赖于你提供的服务器是一个完整的“递归”解析器,它可以完成所有必要的处理并立即返回最终结果。
(2.22.230.67 不是这样的服务器。它是一个仅权威的服务器,只回答它直接托管的域的查询,但不回答递归查询。很少有公共服务器配置为同时执行这两项工作,但在企业网络内更常见。)
这也对 BIND 产生了影响:如果您将域配置为“转发”区域,它也期望服务器接受递归查询并返回完整的最终答案。相反,在您的情况下,正确的类型应该是“static-stub”:
# /etc/named.conf
zone "mydomain.com." {
type static-stub;
server-addresses { 2.22.230.67; };
};
(不要使用“类型存根”——它的作用略有不同。)
如果 BIND 不起作用,Unbound 是您的下一个选择。以下应该可以完成这项工作:
# /etc/unbound/unbound.conf
stub-zone:
name: "mydomain.com."
stub-addr: 2.22.230.67
stub-first: yes
与 BIND 类似,Unbound 有两种区域类型 - “存根区域”期望指向权威服务器,该服务器可能返回不完整的答案,而“转发区域”期望指向递归服务器,该服务器始终返回完整的最终答案。例如,您可以使用转发区域将所有剩余查询指向 1.1.1.1 或 8.8.8.8。
(dnsmasq 的“server=”选项类似于 Unbound 中的“forward-zone”。正如开头提到的,dnsmasq 不是递归解析器,因此它没有任何与“stub-zone”等效的功能。)