权威服务器

权威服务器是保存 DNS 名称记录(包括 A、AAAA 和 CNAME)的服务器,简单地说,DNS 记录归它管。非权威服务器根据以前的域名查询来构建缓存文件。它不存放原始名称记录。我们平时使用的如腾讯 DNS (119.29.29.29)、114 DNS (114.114.114.114)均是非权威服务器,负责转发查询与缓存 DNS 记录。

在上一篇《网站安全的一点思考》探究的过程中,我们通过 Wireshark 抓包了解了 DNS 递归查询过程,概述如下:

  1. 查询时会携带期望得到的记录,如正常查询时会请求对应域名的 A 记录。

  2. 客户端会首先查询根域名服务器列表,并从中选择一个;此后,它向所有遇到的服务器查询 sunnysab.cn 所对应的 A 记录。根域名服务器自然不知道,于是返回了 cn 对应的名称服务器(NS 记录)a.dns.cnb.dns.cn 等等;紧接着,它向 a.dns.cn 查询 sunnysab.cn 所对应 A 的记录,以此类推。

  3. 接第二条,如果我查询一个三级域名,如 a.b.example.com,就要看哪一级别的名称服务器存储了对应的记录。

看上去,权威服务器一般为该层级的 NS 记录,并被上一层域名所知。如,cn. 这一层级知晓 sunnysab.cn. 的 NS 记录并能向查询者返回它。其实,这是由域名注册商(domain name registrar)向域名注册管理局(也称注册局,domain name registry)登记的,且一般 TTL 较长。

那么,怎样自己搭建域名解析服务呢?

抓包分析

我们不妨通过抓包来回顾一下整个过程,以下的数据是我在完成配置后所截。由于数据包过多不便于截图,这里以文本方式引用抓包数据。其中,desktop.lan 是我的笔记本名称,dns.google 是 Google DNS (8.8.8.8)的名称,XiaoQiang.lan 是路由器的名称。路由器内的网段为 192.168.31.0/24

实验时执行的命令为:

dig +trace dorm.host.sunnysab.cn @8.8.8.8

由于打开了 +trace 选项,dig 工具将尝试迭代查询过程。

+[no]trace

This option toggles tracing of the delegation path from the root name servers for the name being looked up. Tracing is disabled by default. When tracing is enabled, dig makes iterative queries to resolve the name being looked up. It follows referrals from the root servers, showing the answer from each server that was used to resolve the lookup.

If @server is also specified, it affects only the initial query for the root zone name servers.

+dnssec is also set when +trace is set, to better emulate the default queries from a name server.

抓包内容:

序号时间戳目标协议大小摘要
1. 查询根域名服务器列表,并得到对应的 IP 地址
10desktop.landns.googleDNS82Standard query 0xbf88 NS OPT
20.064575467dns.googledesktop.lanDNS567Standard query response 0xbf88 NS NS e.root-servers.net NS h.root-servers.net NS l.root-servers.net NS i.root-servers.net NS a.root-servers.net NS d.root-servers.net NS c.root-servers.net NS b.root-servers.net NS j.root-servers.net NS k.root-servers.net NS g.root-servers.net NS m.root-servers.net NS f.root-servers.net RRSIG OPT
30.066227105desktop.lanXiaoQiang.lanDNS78Standard query 0x7845 A e.root-servers.net
40.066250139desktop.lanXiaoQiang.lanDNS78Standard query 0xe45a AAAA e.root-servers.net
50.07043768XiaoQiang.landesktop.lanDNS105Standard query response 0x7845 A e.root-servers.net A 192.203.230.10 OPT
60.071267312XiaoQiang.landesktop.lanDNS856Standard query response 0xe45a AAAA e.root-servers.net AAAA 2001:500:a8::e NS m.root-servers.net NS e.root-servers.net NS a.root-servers.net NS i.root-servers.net NS c.root-servers.net NS d.root-servers.net NS f.root-servers.net NS b.root-servers.net NS g.root-servers.net NS k.root-servers.net NS j.root-servers.net NS h.root-servers.net NS l.root-servers.net A 192.33.4.12 A 193.0.14.129 A 192.36.148.17 A 202.12.27.33 A 192.203.230.10 A 192.112.36.4 A 192.5.5.241 A 199.9.14.201 A 199.7.91.13 A 198.97.190.53 A 192.58.128.30 A 198.41.0.4 A 199.7.83.42 AAAA 2001:500:2::c AAAA 2001:7fd::1 AAAA 2001:7fe::53 AAAA 2001:dc3::35 AAAA 2001:500:12::d0d AAAA 2001:500:2f::f AAAA 2001:500:200::b AAAA 2001:500:2d::d AAAA 2001:500:1::53 AAAA 2001:503:c27::2:30 AAAA 2001:503:ba3e::2:30 AAAA 2001:500:9f::42
70.07137724desktop.lanXiaoQiang.lanDNS78Standard query 0xa1cb A h.root-servers.net
80.071383532desktop.lanXiaoQiang.lanDNS78Standard query 0xaeca AAAA h.root-servers.net
90.07640378XiaoQiang.landesktop.lanDNS105Standard query response 0xa1cb A h.root-servers.net A 198.97.190.53 OPT
100.077062568XiaoQiang.landesktop.lanDNS885Standard query response 0xaeca AAAA h.root-servers.net AAAA 2001:500:1::53 NS i.root-servers.net NS h.root-servers.net NS m.root-servers.net NS e.root-servers.net NS g.root-servers.net NS f.root-servers.net NS c.root-servers.net NS a.root-servers.net NS l.root-servers.net NS k.root-servers.net NS b.root-servers.net NS j.root-servers.net NS d.root-servers.net A 192.33.4.12 A 193.0.14.129 A 192.36.148.17 A 202.12.27.33 A 192.203.230.10 A 192.112.36.4 A 192.5.5.241 A 199.9.14.201 A 199.7.91.13 A 198.97.190.53 A 192.58.128.30 A 198.41.0.4 A 199.7.83.42 AAAA 2001:500:2::c AAAA 2001:7fd::1 AAAA 2001:7fe::53 AAAA 2001:dc3::35 AAAA 2001:500:a8::e AAAA 2001:500:12::d0d AAAA 2001:500:2f::f AAAA 2001:500:200::b AAAA 2001:500:2d::d AAAA 2001:503:c27::2:30 AAAA 2001:503:ba3e::2:30 AAAA 2001:500:9f::42 OPT
110.077180982desktop.lanXiaoQiang.lanDNS78Standard query 0x8d16 A l.root-servers.net
120.077190009desktop.lanXiaoQiang.lanDNS78Standard query 0xe119 AAAA l.root-servers.net
130.08203686XiaoQiang.landesktop.lanDNS94Standard query response 0x8d16 A l.root-servers.net A 199.7.83.42
140.08203703XiaoQiang.landesktop.lanDNS106Standard query response 0xe119 AAAA l.root-servers.net AAAA 2001:500:9f::42
150.08220076desktop.lanXiaoQiang.lanDNS78Standard query 0x0c6f A i.root-servers.net
160.082211721desktop.lanXiaoQiang.lanDNS78Standard query 0xde6c AAAA i.root-servers.net
170.087168108XiaoQiang.landesktop.lanDNS94Standard query response 0x0c6f A i.root-servers.net A 192.36.148.17
180.087168289XiaoQiang.landesktop.lanDNS106Standard query response 0xde6c AAAA i.root-servers.net AAAA 2001:7fe::53
190.087318513desktop.lanXiaoQiang.lanDNS78Standard query 0x471f A a.root-servers.net
200.087328372desktop.lanXiaoQiang.lanDNS78Standard query 0x7e19 AAAA a.root-servers.net
210.092162538XiaoQiang.landesktop.lanDNS94Standard query response 0x471f A a.root-servers.net A 198.41.0.4
220.092162738XiaoQiang.landesktop.lanDNS856Standard query response 0x7e19 AAAA a.root-servers.net AAAA 2001:503:ba3e::2:30 NS m.root-servers.net NS h.root-servers.net NS l.root-servers.net NS a.root-servers.net NS f.root-servers.net NS c.root-servers.net NS g.root-servers.net NS i.root-servers.net NS e.root-servers.net NS b.root-servers.net NS d.root-servers.net NS j.root-servers.net NS k.root-servers.net A 192.33.4.12 A 193.0.14.129 A 192.36.148.17 A 202.12.27.33 A 192.203.230.10 A 192.112.36.4 A 192.5.5.241 A 199.9.14.201 A 199.7.91.13 A 198.97.190.53 A 192.58.128.30 A 198.41.0.4 A 199.7.83.42 AAAA 2001:500:2::c AAAA 2001:7fd::1 AAAA 2001:7fe::53 AAAA 2001:dc3::35 AAAA 2001:500:a8::e AAAA 2001:500:12::d0d AAAA 2001:500:2f::f AAAA 2001:500:200::b AAAA 2001:500:2d::d AAAA 2001:500:1::53 AAAA 2001:503:c27::2:30 AAAA 2001:500:9f::42
230.092354121desktop.lanXiaoQiang.lanDNS78Standard query 0x59ba A d.root-servers.net
240.092360453desktop.lanXiaoQiang.lanDNS78Standard query 0x62bd AAAA d.root-servers.net
250.103212206XiaoQiang.landesktop.lanDNS94Standard query response 0x59ba A d.root-servers.net A 199.7.91.13
260.103212366XiaoQiang.landesktop.lanDNS106Standard query response 0x62bd AAAA d.root-servers.net AAAA 2001:500:2d::d
270.103383531desktop.lanXiaoQiang.lanDNS78Standard query 0xafe6 A c.root-servers.net
280.103394471desktop.lanXiaoQiang.lanDNS78Standard query 0x5aeb AAAA c.root-servers.net
290.108075097XiaoQiang.landesktop.lanDNS105Standard query response 0xafe6 A c.root-servers.net A 192.33.4.12 OPT
300.108075217XiaoQiang.landesktop.lanDNS856Standard query response 0x5aeb AAAA c.root-servers.net AAAA 2001:500:2::c NS i.root-servers.net NS m.root-servers.net NS d.root-servers.net NS b.root-servers.net NS k.root-servers.net NS l.root-servers.net NS g.root-servers.net NS a.root-servers.net NS e.root-servers.net NS j.root-servers.net NS c.root-servers.net NS f.root-servers.net NS h.root-servers.net A 192.33.4.12 A 193.0.14.129 A 192.36.148.17 A 202.12.27.33 A 192.203.230.10 A 192.112.36.4 A 192.5.5.241 A 199.9.14.201 A 199.7.91.13 A 198.97.190.53 A 192.58.128.30 A 198.41.0.4 A 199.7.83.42 AAAA 2001:7fd::1 AAAA 2001:7fe::53 AAAA 2001:dc3::35 AAAA 2001:500:a8::e AAAA 2001:500:12::d0d AAAA 2001:500:2f::f AAAA 2001:500:200::b AAAA 2001:500:2d::d AAAA 2001:500:1::53 AAAA 2001:503:c27::2:30 AAAA 2001:503:ba3e::2:30 AAAA 2001:500:9f::42
310.108234028desktop.lanXiaoQiang.lanDNS78Standard query 0xb632 A b.root-servers.net
320.108245249desktop.lanXiaoQiang.lanDNS78Standard query 0x9b30 AAAA b.root-servers.net
330.113622944XiaoQiang.landesktop.lanDNS94Standard query response 0xb632 A b.root-servers.net A 199.9.14.201
340.113623115XiaoQiang.landesktop.lanDNS106Standard query response 0x9b30 AAAA b.root-servers.net AAAA 2001:500:200::b
350.113719477desktop.lanXiaoQiang.lanDNS78Standard query 0x297b A j.root-servers.net
360.113725899desktop.lanXiaoQiang.lanDNS78Standard query 0xd07b AAAA j.root-servers.net
370.117963526XiaoQiang.landesktop.lanDNS94Standard query response 0x297b A j.root-servers.net A 192.58.128.30
380.117963726XiaoQiang.landesktop.lanDNS106Standard query response 0xd07b AAAA j.root-servers.net AAAA 2001:503:c27::2:30
390.118079004desktop.lanXiaoQiang.lanDNS78Standard query 0x81b7 A k.root-servers.net
400.118086699desktop.lanXiaoQiang.lanDNS78Standard query 0xd5b6 AAAA k.root-servers.net
410.122862825XiaoQiang.landesktop.lanDNS94Standard query response 0x81b7 A k.root-servers.net A 193.0.14.129
420.122862965XiaoQiang.landesktop.lanDNS117Standard query response 0xd5b6 AAAA k.root-servers.net AAAA 2001:7fd::1 OPT
430.122991378desktop.lanXiaoQiang.lanDNS78Standard query 0x1058 A g.root-servers.net
440.122999354desktop.lanXiaoQiang.lanDNS78Standard query 0x2559 AAAA g.root-servers.net
450.127718111XiaoQiang.landesktop.lanDNS117Standard query response 0x2559 AAAA g.root-servers.net AAAA 2001:500:12::d0d OPT
460.127718351XiaoQiang.landesktop.lanDNS94Standard query response 0x1058 A g.root-servers.net A 192.112.36.4
470.127880689desktop.lanXiaoQiang.lanDNS78Standard query 0xa58f A m.root-servers.net
480.127889446desktop.lanXiaoQiang.lanDNS78Standard query 0xcb8e AAAA m.root-servers.net
490.132909514XiaoQiang.landesktop.lanDNS94Standard query response 0xa58f A m.root-servers.net A 202.12.27.33
500.133511734XiaoQiang.landesktop.lanDNS106Standard query response 0xcb8e AAAA m.root-servers.net AAAA 2001:dc3::35
510.133615932desktop.lanXiaoQiang.lanDNS78Standard query 0x81df A f.root-servers.net
520.133624147desktop.lanXiaoQiang.lanDNS78Standard query 0x2bdc AAAA f.root-servers.net
530.138568863XiaoQiang.landesktop.lanDNS94Standard query response 0x81df A f.root-servers.net A 192.5.5.241
540.138569003XiaoQiang.landesktop.lanDNS117Standard query response 0x2bdc AAAA f.root-servers.net AAAA 2001:500:2f::f OPT
向根域名服务器发起查询,服务器k 返回了 cn. 对应的 NS 记录
客户端紧接着解析所有 NS 记录
550.138852069desktop.lank.root-servers.netDNS104Standard query 0xd286 A dorm.host.sunnysab.cn OPT
560.173844015k.root-servers.netdesktop.lanDNS754Standard query response 0xd286 A dorm.host.sunnysab.cn NS a.dns.cn NS b.dns.cn NS c.dns.cn NS d.dns.cn NS e.dns.cn NS f.dns.cn NS g.dns.cn NS ns.cernet.net DS RRSIG A 203.119.25.1 AAAA 2001:dc7::1 A 203.119.26.1 A 203.119.27.1 A 203.119.28.1 AAAA 2001:dc7:1000::1 A 203.119.29.1 A 195.219.8.90 A 66.198.183.65 A 202.112.0.44 OPT
570.174508103desktop.lanXiaoQiang.lanDNS68Standard query 0x6780 A a.dns.cn
580.174526307desktop.lanXiaoQiang.lanDNS68Standard query 0xc88e AAAA a.dns.cn
590.179711708XiaoQiang.landesktop.lanDNS84Standard query response 0x6780 A a.dns.cn A 203.119.25.1
600.179711919XiaoQiang.landesktop.lanDNS96Standard query response 0xc88e AAAA a.dns.cn AAAA 2001:dc7::1
610.179840272desktop.lanXiaoQiang.lanDNS68Standard query 0x1ca1 A b.dns.cn
620.179848427desktop.lanXiaoQiang.lanDNS68Standard query 0x55a2 AAAA b.dns.cn
630.184846684XiaoQiang.landesktop.lanDNS95Standard query response 0x1ca1 A b.dns.cn A 203.119.26.1 OPT
640.184846814XiaoQiang.landesktop.lanDNS128Standard query response 0x55a2 AAAA b.dns.cn SOA a.dns.cn OPT
650.184949318desktop.lanXiaoQiang.lanDNS68Standard query 0x1968 A c.dns.cn
660.184956903desktop.lanXiaoQiang.lanDNS68Standard query 0xc769 AAAA c.dns.cn
670.190545508XiaoQiang.landesktop.lanDNS84Standard query response 0x1968 A c.dns.cn A 203.119.27.1
680.190545698XiaoQiang.landesktop.lanDNS117Standard query response 0xc769 AAAA c.dns.cn SOA a.dns.cn
690.190664112desktop.lanXiaoQiang.lanDNS68Standard query 0x48d7 A d.dns.cn
700.190673009desktop.lanXiaoQiang.lanDNS68Standard query 0x83d6 AAAA d.dns.cn
710.195572028XiaoQiang.landesktop.lanDNS84Standard query response 0x48d7 A d.dns.cn A 203.119.28.1
720.195572178XiaoQiang.landesktop.lanDNS107Standard query response 0x83d6 AAAA d.dns.cn AAAA 2001:dc7:1000::1 OPT
730.195759453desktop.lanXiaoQiang.lanDNS68Standard query 0x4aef A e.dns.cn
740.195771336desktop.lanXiaoQiang.lanDNS68Standard query 0xa1ee AAAA e.dns.cn
750.204773215XiaoQiang.landesktop.lanDNS84Standard query response 0x4aef A e.dns.cn A 203.119.29.1
760.204773316XiaoQiang.landesktop.lanDNS117Standard query response 0xa1ee AAAA e.dns.cn SOA a.dns.cn
770.204847005desktop.lanXiaoQiang.lanDNS68Standard query 0x078f A f.dns.cn
780.204852957desktop.lanXiaoQiang.lanDNS68Standard query 0x218e AAAA f.dns.cn
790.209290952XiaoQiang.landesktop.lanDNS84Standard query response 0x078f A f.dns.cn A 195.219.8.90
800.209291173XiaoQiang.landesktop.lanDNS128Standard query response 0x218e AAAA f.dns.cn SOA a.dns.cn OPT
810.209406982desktop.lanXiaoQiang.lanDNS68Standard query 0x78c9 A g.dns.cn
820.20941653desktop.lanXiaoQiang.lanDNS68Standard query 0xe0c8 AAAA g.dns.cn
830.215702997XiaoQiang.landesktop.lanDNS95Standard query response 0x78c9 A g.dns.cn A 66.198.183.65 OPT
840.215703147XiaoQiang.landesktop.lanDNS117Standard query response 0xe0c8 AAAA g.dns.cn SOA a.dns.cn
850.21583149desktop.lanXiaoQiang.lanDNS73Standard query 0xc954 A ns.cernet.net
860.21584197desktop.lanXiaoQiang.lanDNS73Standard query 0xa056 AAAA ns.cernet.net
870.219789697XiaoQiang.landesktop.lanDNS100Standard query response 0xc954 A ns.cernet.net A 103.137.60.44 OPT
880.221121159XiaoQiang.landesktop.lanDNS112Standard query response 0xa056 AAAA ns.cernet.net AAAA 2001:dd9::44 OPT
客户端向 cn. 对应的 NS 服务器e.dns.cn 发送查询,对方返回了 sunnysab.cn. 对应的 NS 服务器
随后,客户端开始解析所有得到的 NS 服务器
890.221379989desktop.lane.dns.cnDNS104Standard query 0x7ba3 A dorm.host.sunnysab.cn OPT
900.226745842e.dns.cndesktop.lanDNS713Standard query response 0x7ba3 A dorm.host.sunnysab.cn NS f1g1ns1.dnspod.net NS f1g1ns2.dnspod.net NSEC3 RRSIG NSEC3 RRSIG OPT
910.227232093desktop.lanXiaoQiang.lanDNS78Standard query 0xbde1 A f1g1ns1.dnspod.net
920.22725739desktop.lanXiaoQiang.lanDNS78Standard query 0x0be5 AAAA f1g1ns1.dnspod.net
930.231917437XiaoQiang.landesktop.lanDNS174Standard query response 0xbde1 A f1g1ns1.dnspod.net A 129.211.176.187 A 183.192.164.118 A 162.14.25.230 A 59.36.120.152 A 58.247.212.36 A 61.151.180.44
940.232527883XiaoQiang.landesktop.lanDNS106Standard query response 0x0be5 AAAA f1g1ns1.dnspod.net AAAA 2402:4e00:1430:1102:0:9136:2b30:e554
950.232661125desktop.lanXiaoQiang.lanDNS78Standard query 0x0c76 A f1g1ns2.dnspod.net
960.232669481desktop.lanXiaoQiang.lanDNS78Standard query 0x2577 AAAA f1g1ns2.dnspod.net
970.237553211XiaoQiang.landesktop.lanDNS190Standard query response 0x0c76 A f1g1ns2.dnspod.net A 129.211.176.224 A 183.192.201.91 A 58.251.121.111 A 58.247.212.48 A 162.14.24.230 A 223.166.151.21 A 101.226.220.16
980.237553371XiaoQiang.landesktop.lanDNS106Standard query response 0x2577 AAAA f1g1ns2.dnspod.net AAAA 2402:4e00:1020:1264:0:9136:29bc:87f9
客户端向 sunnysab.cn. 对应的 NS 服务器(归属于 Dnspod)发起查询,对方返回了 NS 记录sync.sunnysab.cn
随后,客户端将解析该域名
990.237865493desktop.lanf1g1ns2.dnspod.netDNS104Standard query 0x8b49 A dorm.host.sunnysab.cn OPT
1000.248780746f1g1ns2.dnspod.netdesktop.lanDNS122Standard query response 0x8b49 A dorm.host.sunnysab.cn NS sync.sunnysab.cn OPT
1010.249081105desktop.lanXiaoQiang.lanDNS76Standard query 0x04a9 A sync.sunnysab.cn
1020.249098769desktop.lanXiaoQiang.lanDNS76Standard query 0xf2ac AAAA sync.sunnysab.cn
1030.260753072XiaoQiang.landesktop.lanDNS153Standard query response 0xf2ac AAAA sync.sunnysab.cn SOA f1g1ns1.dnspod.net
1040.260753212XiaoQiang.landesktop.lanDNS92Standard query response 0x04a9 A sync.sunnysab.cn A 124.221.129.111
客户端向 sync.sunnysab.cn 请求目标域名,得到最终结果
1050.260916171desktop.lansync.sunnysab.cnDNS104Standard query 0xc3e7 A dorm.host.sunnysab.cn OPT
1060.271458859sync.sunnysab.cndesktop.lanDNS164Standard query response 0xc3e7 A dorm.host.sunnysab.cn A 101.94.47.143 NS ns.sunnysab.cn OPT

至此,经过 106 个 DNS 请求/响应,我们得到了 dorm.host.sunnysab.cn 最终的 IP 地址。

尝试

我使用的域名解析机构是 Dnspod。一个简单的思路是,在 Dnspod 中新建一条类型为 NS 的解析记录,如:

DNSPOD 添加 NS 记录截图

添加完成后,尝试使用 dig 命令检查效果:

dig +trace host.sunnysab.cn @119.29.29.29

; <<>> DiG 9.18.0 <<>> +trace host.sunnysab.cn @119.29.29.29
;; global options: +cmd
.                       37118   IN      NS      a.root-servers.net.
.                       37118   IN      NS      d.root-servers.net.
.                       37118   IN      NS      l.root-servers.net.
.                       37118   IN      NS      g.root-servers.net.
.                       37118   IN      NS      j.root-servers.net.
.                       37118   IN      NS      h.root-servers.net.
.                       37118   IN      NS      e.root-servers.net.
.                       37118   IN      NS      i.root-servers.net.
.                       37118   IN      NS      b.root-servers.net.
.                       37118   IN      NS      c.root-servers.net.
.                       37118   IN      NS      k.root-servers.net.
.                       37118   IN      NS      m.root-servers.net.
.                       37118   IN      NS      f.root-servers.net.
;; Received 251 bytes from 119.29.29.29#53(119.29.29.29) in 13 ms

cn.                     172800  IN      NS      e.dns.cn.
cn.                     172800  IN      NS      a.dns.cn.
cn.                     172800  IN      NS      b.dns.cn.
cn.                     172800  IN      NS      ns.cernet.net.
cn.                     172800  IN      NS      c.dns.cn.
cn.                     172800  IN      NS      d.dns.cn.
cn.                     172800  IN      NS      g.dns.cn.
cn.                     172800  IN      NS      f.dns.cn.
cn.                     86400   IN      DS      57724 8 2 5D0423633EB24A499BE78AA22D1C0C9BA36218FF49FD95A4CDF1A4AD 97C67044
cn.                     86400   IN      RRSIG   DS 8 1 86400 20220423050000 20220410040000 47671 . FfHCYmoGEWX2HFrefiPsgk7HUMOxPrwTgUIIzz5HThgWn+I8CIJ2Igs6 BfzxWuxlveLaGIbwBXI7YaylRiXOnR2f9JmjzhXHBfUrnmFd4WN/9aRD 8KYwz0EUGmOQwfXhVZkKLeJMfL6ANtuoPfizv1XJUDCXoBUv3xKvjyKe BY0EV8cD/jdNXDrQgJcaT5LY4qXinVfXXMsFaU2gESJfaNEhyK7HMNxr KiIlj9FWBDGA/UH+aijlwauvNOIFXpDWV3mGGgBw2eG0rQsFNN1Lepm7 oNVl2oC0D24os9gUFHpBfEvbdeHBmxd4me+hEtBtnUuPHFfq+xydb62k HYCi6Q==
couldn't get address for 'f.dns.cn': not found
;; Received 739 bytes from 192.112.36.4#53(g.root-servers.net) in 193 ms

sunnysab.cn.            86400   IN      NS      f1g1ns1.dnspod.net.
sunnysab.cn.            86400   IN      NS      f1g1ns2.dnspod.net.
3qdaqa092ee5belp64a74ebnb8j53d7e.cn. 21600 IN NSEC3 1 1 10 AEF123AB 3QHKTF6LTFG8AAFUUAJSR8RVAJP99SFU NS SOA RRSIG DNSKEY NSEC3PARAM
3qdaqa092ee5belp64a74ebnb8j53d7e.cn. 21600 IN RRSIG NSEC3 8 2 21600 20220421020437 20220322010437 38388 cn. h8l0G9BHCfmmihReDucaiq7ZGQVaLbZMg00XJW0S0ueVhyvgFGtobZrS zAw4TgiKkQ4RzVMIaQDCpl9Ndj1gvhGvK9tmO3DxRLMTs2EfhbS4oaAW J5ZPgtNZWe9UnmNYShX1a7BvWLAuF+yx4ZhP/pxd5LLbdpIO4FLGBIkl JKE=
460ma1kn9rcs318kuu45f11o2mjgt558.cn. 21600 IN NSEC3 1 1 10 AEF123AB 46F805934J5U26CSL3LRD98GD3IJC8R8 NS DS RRSIG
460ma1kn9rcs318kuu45f11o2mjgt558.cn. 21600 IN RRSIG NSEC3 8 2 21600 20220421020437 20220322010437 38388 cn. hfaIKR67Vm4pnSy8ScHFEJ55K1hjG2u49euVOJ7W6d1N5GnLF6Tn5JxF X/BfScthNSnLCQl/5c3AE//pUTuviDQePG4syifn58ljjV/hSV1ARprG PY+DA+VPLE6bVX1RV5P7kcGtHIFZxHWhHnGgB5irC6PuEkqWrx9RM1QX fWg=
;; Received 666 bytes from 203.119.29.1#53(e.dns.cn) in 6 ms

嗯?后面没有了??其实这时候我应该反应过来是 Dnspod 没有及时刷新缓存,将 DNS 服务器设为 8.8.8.8 后会变得正常,但是因为当时没有考虑到,走了些弯路。

找到一片知乎提问 如何为二级域名设置不同的NS服务器? - 知乎 倒是有网友成功使用的例子,但是查看腾讯云(Dnspod)的 帮助文档,里面有这样的描述:

注意:

要授权的 DNS 服务器域名不能是私建的 DNS 服务器域名,必须是解析商的权威 DNS 服务器域名。

莫非腾讯云不允许我使用自己的 NS 服务器?观察到网友使用的 NS 服务器地址是阿里云和 dns.com 的 DNS 解析服务器,帮助文档上说的应该没错。 但是,腾讯云不会还维护了一份合法 DNS 名称服务器的列表吧?如果遇上个别小国家偏远的 DNS 提供商怎么办?做软件应该不会这么做的,可事实上直接添加 NS 记录的方法又用不了。

附加 DNS 记录(胶水记录)

期间了解了一个 DNS 中常用的技术。设想这样的场景:我域名的权威名称服务器为 ns.sunnysab.cn,整个域名的解析任务都落在它身上,但是要获取它的地址,又需要它本身的配合。即,我需要向 ns 主机查询 ns 主机的地址——这将陷入一个循环。

胶水记录可以解决这个问题:它将被注册到上级 DNS 域名解析服务器中。当有范围内的 DNS 查询时,上级服务器会返回这些记录。胶水记录直接记录了主机名到 IP 地址的映射关系,以避免客户端陷入其中。此外,它还有减少递归查询次数,加快 DNS 递归查询的作用。

胶水记录在腾讯云中被称为 “自定义 DNS Host”,这个名称……我看了半天才理解……

DNSPOD 中的胶水记录设置页

按照文档的说法,“如果使用 DNS Host 来解析域名,必须在对应域名服务器上添加对应 A 记录(IP 地址保持一致)。”,但是实际操作时,不管我怎么试都没有在 DNS 响应中发现胶水记录,可能因为腾讯云向上级同步时间太长所致吧。遂放弃。

本节只是一个小小的尝试,与最终解决方案无关。

峰回路转

此时发现 dig +trace host.sunnysab.cn @8.8.8.8 (之前尝试时用的是 119.29.29.29)正常,可以返回 DNS 记录,dig www.host.sunnysab.cn 时会查询 host.sunnysab.cn 对应的 NS 记录并引导客户端向 sync.sunnysab.cn 查询 www.host.sunnysab.cn。怀疑之前可能是 119.29.29.29 缓存未刷新导致的同步问题。

安装并配置 Bind9

Bind 是一款由互联网系统联盟/协会(Internet Systems Consortium)开发的 DNS 服务器软件,历史悠久,使用广泛,这里就用它了。

还有一款名为 PowerDNS 的产品也很不错,可以了解一下。由于我这里使用场景有限,就不引入庞然大物了。

安装

使用 apt 命令搜索:

# apt search bind9

bind9/stable,now 1:9.16.27-1~deb11u1 amd64
  Internet Domain Name Server

bind9-dev/stable 1:9.16.27-1~deb11u1 amd64
  Static Libraries and Headers used by BIND 9

bind9-dnsutils/stable,now 1:9.16.27-1~deb11u1 amd64 [installed]
  Clients provided with BIND 9

bind9-doc/stable 1:9.16.27-1~deb11u1 all
  Documentation for BIND 9

bind9-dyndb-ldap/stable 11.6-3 amd64
  LDAP back-end plug-in for BIND

bind9-host/stable,now 1:9.16.27-1~deb11u1 amd64 [installed]
  DNS Lookup Utility

bind9-libs/stable,now 1:9.16.27-1~deb11u1 amd64 [installed,automatic]
  Shared Libraries used by BIND 9

bind9-utils/stable,now 1:9.16.27-1~deb11u1 amd64 [installed,automatic]
  Utilities for BIND 9

bind9utils/stable 1:9.16.27-1~deb11u1 all
  Transitional package for bind9-utils

安装:

# apt install bind9

配置

这里参考了 使用Bind9搭建权威DNS服务器 一文,区域文件如下:

root@VM-16-5-debian:/etc/bind# cat host.sunnysab.cn.zone 
$TTL 300
$ORIGIN host.sunnysab.cn.

; SOA record
; name  class  type  nameserver        contact             (sn ref ret ex min)
@       IN     SOA   ns.sunnysab.cn.  sunnysab.cn.  (
                                        2017031088 ; serial number
                                        3600       ; refresh
                                        180        ; update retry
                                        1209600    ; expiry
                                        300        ; nxdomain ttl
                                        )

; [name] [ttl] [class] type data

; NS records
@       36000   IN      NS      ns.sunnysab.cn.

; A records or CNAME records
ns      3600    IN      A       124.221.129.111
dorm    60      IN      A       101.94.47.143

完成后使用 named-checkzone 命令校验一下。

动态管理

要想动态修改 DNS 记录,有三种方法:

考虑到与本篇主题无关,这里暂且略过,后续有机会再写吧。通过自己的 DNS 服务器,倒是可以自建一个动态域名解析的平台 :D

参考资料

在 “瞎折腾” 的过程中,碰到了很多问题,所遇到的资料也较少,感谢素未谋面的网友提供的帮助。主要参考资料如下:

  1. 域名注册局 - 维基百科
  2. DNS 一般概览 - Google Cloud
  3. Debian9 Bind9管理工具详解
  4. 如何为二级域名设置不同的NS服务器? - 知乎
  5. 设置 NS 记录 - 腾讯云帮助文档
  6. 自建DNS权威服务器全过程(多域名解析) - 开发说,该文档源码安装 bind9,没必要
  7. Glue Records and Why They are Crucial
  8. 胶水记录(Glue Record)是什么?有什么作用?
  9. 使用自建DNS服务器解析自己的域名(Windows操作系统环境下),这位同学使用的是阿里云
  10. 使用Bind9搭建权威DNS服务器
  11. 去Cloudflare化的第一步 自建权威DNS服务器
  12. 自定义 DNS Host 的胶水记录(Glue Record)