前几天注册了个域名 51cz.info,域名解析同步到全球 DNS系统需要一段时间,所以对 DNS解析的过程有些兴趣,了解了下。

工具

Ubuntu + dig

Root DNS Server

全球只有13台路由DNS根服务器,在13台路由服务器中,名字分别为“A”至“M”, 其中10台设置在美国,另外各有一台设置于英国、瑞典和日本。 下表是这些机器的管理单位、设置地点及最新的IP地址。

名称  管理单位及设置地点    IP地址
A INTERNIC.NET(美国,弗吉尼亚州) 198.41.0.4
B 美国信息科学研究所(美国,加利弗尼亚州) 128.9.0.107
C PSINet公司(美国,弗吉尼亚州) 192.33.4.12
D 马里兰大学(美国马里兰州) 128.8.10.90
E 美国航空航天管理局[NASA](美国加利弗尼亚州) 192.203.230.10
F 因特网软件联盟(美国加利弗尼亚州) 192.5.5.241
G 美国国防部网络信息中心(美国弗吉尼亚州) 192.112.36.4
H 美国陆军研究所(美国马里兰州) 128.63.2.53
I Autonomica公司(瑞典,斯德哥尔摩) 192.36.148.17
J VeriSign公司(美国,弗吉尼亚州) 192.58.128.30
K RIPE NCC(英国,伦敦) 193.0.14.129
L IANA (美国,弗吉尼亚州) 198.32.64.12

Dig

使用dig 查看 dns过程:(其中关键词 NS, CNAME, A 注意下)

  1. 从114自己的配置中取得 13个 根服务器
  2. 从 192.112.36.4#53(g.root-servers.net) (美国国防部网络信息中心(美国弗吉尼亚州)) 取得 info顶级域的NS
  3. 从 a2.info.afilias-nst.info 取得 51cz.info 的ns(用的 dnspod)
  4. 从 f1g1ns1.dnspod.net 取得 51cz.info 的CNAME
  5. 51cz.info 的 CNAME 指向 ichengzi.github.io, ichengzi.github.io 的CNAME 指向 sni.github.map.fastly.net, sni.github.map.fastly.net的A记录有多个, 取一个访问即可
~$ dig @114.114.114.114 51cz.info +trace
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @114.114.114.114 51cz.info +trace
; (1 server found)
;; global options: +cmd
.                       143433  IN      NS      l.root-servers.net.
.                       143433  IN      NS      g.root-servers.net.
.                       143433  IN      NS      e.root-servers.net.
.                       143433  IN      NS      h.root-servers.net.
.                       143433  IN      NS      c.root-servers.net.
.                       143433  IN      NS      i.root-servers.net.
.                       143433  IN      NS      m.root-servers.net.
.                       143433  IN      NS      j.root-servers.net.
.                       143433  IN      NS      b.root-servers.net.
.                       143433  IN      NS      f.root-servers.net.
.                       143433  IN      NS      d.root-servers.net.
.                       143433  IN      NS      a.root-servers.net.
.                       143433  IN      NS      k.root-servers.net.
;; Received 239 bytes from 114.114.114.114#53(114.114.114.114) in 23 ms

info.                   172800  IN      NS      a0.info.afilias-nst.info.
info.                   172800  IN      NS      c0.info.afilias-nst.info.
info.                   172800  IN      NS      b0.info.afilias-nst.org.
info.                   172800  IN      NS      b2.info.afilias-nst.org.
info.                   172800  IN      NS      d0.info.afilias-nst.org.
info.                   172800  IN      NS      a2.info.afilias-nst.info.
info.                   86400   IN      DS      8674 7 2 EC9B6082B96B5F87143696F2B483ACC9B2C433DCE0C94E70F1FF5648 CA18008B
info.                   86400   IN      DS      8674 7 1 197789A2CBABA6FECD0B5AC88C5BC414CE1FC309
info.                   86400   IN      RRSIG   DS 8 1 86400 20180818050000 20180805040000 41656 . C3vvf9pfaWxwlgJSyMl5hQhvS+aYat+D6gRGJcxoRNAx6JLpFinTgtmd Q+DbObWEjasjZL0mXxBgNcSlJCEfc6ofVpvfkSZeGuDhrUInkCxJd/Mp y4Tbodxvzn3f/I8XGnNZr/tgMcm43qb5ZfxLcshmjj33G6VssVzb4E/2 YP1VuOMRuGvp245datpiH/uOc7UiDX57z4Bw8YFjxwRG6tWtDFa+Kv8I 1ADT7l/TlAT3mVpOoUsoJRR3b9JO4qpGQXaQmT9TtkwEuDlM0Pv9/J+i 4tBMnWiu9QXVJJHuaNneVUj9sMoPj/9izNYD9eioIMnSvlZKZEWNBHrS jVRZlw==
;; Received 812 bytes from 192.112.36.4#53(g.root-servers.net) in 269 ms

51cz.info.              86400   IN      NS      f1g1ns1.dnspod.net.
51cz.info.              86400   IN      NS      f1g1ns2.dnspod.net.
adnsd9nk7nk82he8h21rj0jjhj11o5gb.info. 3600 IN NSEC3 1 1 1 D399EAAB ADOG5K0P1KT39D679E4QHB2H57ADFM8J NS SOA RRSIG DNSKEY NSEC3PARAM
adnsd9nk7nk82he8h21rj0jjhj11o5gb.info. 3600 IN RRSIG NSEC3 7 2 3600 20180826140736 20180805130736 23235 info. X8Hulu9hUMTppcQN+6+Xy2+fPlhcsCPKAA0gBiamZ62gHtHVOyHmvP5g SytU9v2B6/pNhwTVe3xjeio/b/MIa4eabfLfgfARO4n+GT3yv0lJPoJb h/6H9VEtOqIxOEa5N5ooZcgzs43WBKwQpGEedbfIptW9FtJl2lUtJEMh 1wQ=
fqr53v6phtdkqvo89j7p54oug8sfbpbe.info. 3600 IN NSEC3 1 1 1 D399EAAB FQRG9TUL5L5MUUFUKBPB1BHFEL33LNBK A RRSIG
fqr53v6phtdkqvo89j7p54oug8sfbpbe.info. 3600 IN RRSIG NSEC3 7 2 3600 20180826131933 20180805121933 23235 info. T/0bMbqUYN8v8tbSwPO0JRMajq27+x1N1DdmgSGYLkN3O1A6EvhqCGmz wsnmb27mqEtqxCzc9DZB7SmHPFIZ9H7z46JLxWpFe/FD8Tqj3FDwIT21 x/avuFGPFITQWYYmEbOYkkmqnZVZ2IdJBa61TQNbiL3Rvp3yxBHMgsZK ZKM=
;; Received 587 bytes from 199.249.113.1#53(a2.info.afilias-nst.info) in 342 ms

51cz.info.              600     IN      CNAME   ichengzi.github.io.
51cz.info.              86400   IN      NS      f1g1ns2.dnspod.net.
51cz.info.              86400   IN      NS      f1g1ns1.dnspod.net.
;; Received 136 bytes from 58.247.212.36#53(f1g1ns1.dnspod.net) in 9 ms
cz@cz-dell:~$ dig @114.114.114.114 51cz.info

; <<>> DiG 9.10.3-P4-Ubuntu <<>> @114.114.114.114 51cz.info
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40292
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;51cz.info.                     IN      A

;; ANSWER SECTION:
51cz.info.              34      IN      CNAME   ichengzi.github.io.
ichengzi.github.io.     2341    IN      CNAME   sni.github.map.fastly.net.
sni.github.map.fastly.net. 34   IN      A       185.199.109.153
sni.github.map.fastly.net. 34   IN      A       185.199.108.153
sni.github.map.fastly.net. 34   IN      A       185.199.110.153
sni.github.map.fastly.net. 34   IN      A       185.199.111.153

;; Query time: 22 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Sun Aug 05 22:39:39 DST 2018
;; MSG SIZE  rcvd: 173

域名的层级

比如,域名math.stackexchange.com显示为math.stackexchange.com.。这不是疏忽,而是所有域名的尾部,实际上都有一个根域名。

举例来说,www.example.com真正的域名是www.example.com.root,简写为www.example.com.。因为,根域名.root对于所有域名都是一样的,所以平时是省略的

根域名的下一级,叫做”顶级域名”(top-level domain,缩写为TLD),比如.com、.net;再下一级叫做”次级域名”(second-level domain,缩写为SLD),比如www.example.com里面的.example,这一级域名是用户可以注册的;再下一级是主机名(host),比如www.example.com里面的www,又称为”三级域名”,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

DIG 命令

dig命令可以单独查看每一级域名的NS记录。

$ dig ns com
$ dig ns stackexchange.com
+short参数可以显示简化的结果。

$ dig +short ns com
$ dig +short ns stackexchange.com

DNS记录类型

域名与IP之间的对应关系,称为”记录”(record)。根据使用场景,”记录”可以分成不同的类型(type),前面已经看到了有A记录和NS记录。

常见的DNS记录类型如下。

(1) A:地址记录(Address),返回域名指向的IP地址。

(2) NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。

(3)MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。

(4)CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。

(5)PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名,详见下文。

一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。

CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。举例来说,facebook.github.io这个域名就是一个CNAME记录。

$ dig facebook.github.io

...

;; ANSWER SECTION:
facebook.github.io. 3370    IN  CNAME   github.map.fastly.net.
github.map.fastly.net.  600 IN  A   103.245.222.133

上面结果显示,facebook.github.io的CNAME记录指向github.map.fastly.net。也就是说,用户查询facebook.github.io的时候,实际上返回的是github.map.fastly.net的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改github.map.fastly.net这个域名就可以了,用户的facebook.github.io域名不用修改。

由于CNAME记录就是一个替换,所以域名一旦设置CNAME记录以后,就不能再设置其他记录了(比如A记录和MX记录),这是为了防止产生冲突。举例来说,foo.com指向bar.com,而两个域名各有自己的MX记录,如果两者不一致,就会产生问题。由于顶级域名通常要设置MX记录,所以一般不允许用户对顶级域名设置CNAME记录。

PTR记录用于从IP地址反查域名。dig命令的-x参数用于查询PTR记录。

$ dig -x 192.30.252.153

...

;; ANSWER SECTION:
153.252.30.192.in-addr.arpa. 3600 IN    PTR pages.github.com.

上面结果显示,192.30.252.153这台服务器的域名是pages.github.com。

逆向查询的一个应用,是可以防止垃圾邮件,即验证发送邮件的IP地址,是否真的有它所声称的域名。

dig命令可以查看指定的记录类型。

$ dig a github.com
$ dig ns github.com
$ dig mx github.com

参考链接: http://www.ruanyifeng.com/blog/2016/06/dns.html