使用 dnsmasq 测试未来的 DNS 迁移

使用 dnsmasq 测试未来的 DNS 迁移

我计划将我的域名的 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”等效的功能。)

相关内容