Total Pageviews

Wednesday, 2 October 2019

权威 DNS 自身的解析记录和 Glue Record 的关系


 如果权威 DNS 的 NS 是自身,就需要向 Glue Record 查询解析记录,向 Glue Record 请求得到的自身的解析记录可以和 Glue Record 不同,然后下一步的解析请求会发往这个记录。 
虽然查询托管在 CloudXNS 的域名的解析记录时可以使用 CloudXNS 的海外节点,但是请求 CloudXNS 的权威 DNS 域名本身需要 Glue Record(不包含海外节点),所以解析速度会受到影响。 
托管在权威 DNS 上的域名不是权威 DNS 本身,所以在请求托管域名的解析记录时不需要查询权威 DNS 的 Glue Record,只有接下来的迭代查询时需要。

疑问 
最近在研究各家权威 DNS 服务,看到 CloudXNS 的介绍说他们有海外节点,所以我查询了一下 CloudXNS 的权威 DNS 域名的 Glue Record,发现他们 8 条 Glue Record 中并没有海外节点,CloudXNS 也没有 Anycast。但是从海外地区发起 dig lv3ns1.ffdns.net 可以发现 CloudXNS 海外节点的解析记录。
所以问题就是,当权威 DNS 中给出的权威 DNS 的域名解析的 A 记录包含 Glue Record 以外的 IP 时,托管在该权威 DNS 上解析的域名会使用权威 DNS 的哪些 IP 进行解析? 具体一些,假设 example.com 交给 CloudXNS 解析,但是 lv3ns1.ffdns.net 的 Glue Record 和 lv3ns1.ffdns.net 的解析记录的 IP 并不相同,在解析的时候会使用哪些 IP 进行解析?
结论 在 V2EX- https://www.v2ex.com/t/481559#reply11 上提问,很快就得到了回答。 

接下来还是拿 CloudXNS 举例,把整个流程走一遍。
假设 example.com 托管给 CloudXNS 作为权威 DNS,递归 DNS 为了获得 example.com 的解析结果,必须获得 example.com 的 NS 记录的解析结果,在本例中 NS 记录是 lv3ns[1-4].ffdns.net;以 lv3ns1.ffdns.net 为例继续,这时候需要知道 lv3ns1.ffdns.net 的解析记录。虽然 ffdns.net 的 NS 解析记录就是 lv3ns[1-4].ffdns.net,但是在向 net 查询 ffdns.net 的 NS 记录的时候,net 的解析服务器([a-f].gtld-servers.net)已经返回了 ffdns.net 的 Glue Record,所以接下来递归 DNS 会向 Glue Record 查询 lv3ns1.ffdns.net 的解析结果,然后 example.com 的解析请求就会发往那个解析结果中的 IP。 
CloudXNS 的权威 DNS 域名的 NS 就是自身;当权威 DNS 域名 NS 不是自身的(这样的权威 DNS 很多,比如 Rage4、NS1 和阿里云)时,答案就更容易理解了。
以 Rage4 为例,Rage4 的权威 DNS 域名是 ns[1-2].r4ns.com,但是 r4ns.com 的 NS 记录是 ns[1-2].softlayer.com 而不是本身,所以 ns1.r4ns.net 的解析记录必须向 ns[1-2].softlayer.com 请求,而不是采用 Glue Record;在这个例子中,r4ns.net 没有 Glue Record。

如何查询 Glue Record
DNS 工作的原理、逐级迭代查询啥的都是基础,本文没必要赘述,直接细化到 CloudXNS 的例子中。
 假设 example.com 域名托管在 CloudXNS 下,Name Server 以 lv3ns1.ffdns.net 为例,如果需要得到 example.com 的解析结果,需要向 lv3ns1.ffdns.net 请求该结果,所以还需要查询 lv3ns1.ffdns.net 的解析结果,所以这个时候需要向更上一级的 net 查询 ffdns.net 的 NS 解析记录,net 会返回 lv3ns1.ffdns.net 的 NS 解析记录,和对应 NS 的 Glue Record。使用 dig 指令试试看(使用 m.gtld-servers.net 为例): 
$ dig lv3ns1.ffdns.net @m.gtld-servers.net.