dns

搭建DNS服务(一)

DNS原理

Posted by Jht on July 14, 2018

DNS原理及其解析过程

为啥要有DNS?

网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以在网络上进行通讯时只能识别IP地址,但IP有很长又不好记,所以 域名解析的作用主要就是为了便于记忆。

DNS是啥呢?

DNS (Domain Name System 的缩写)的作用非常简单,就是根据域名查出IP地址。你可以把它想象成一本巨大的电话本。

查询方式

递归查询

DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。

迭代查询

DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果 为止。

查询过程

虽然只需要返回一个IP地址,但是DNS的查询过程非常复杂,分成多个步骤:

可以用dig查看整个过程:

#运行dig baidu.com
dig baidu.com #(dig +short 可以得到简略的结果)


# 下面是是查询参数和统计
; <<>> DiG 9.11.3-1ubuntu1-Ubuntu <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3692
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
; COOKIE: f92dc4caed35b9a4 (echoed)

#下面是查询内容
;; QUESTION SECTION:
;www.baidu.com.                 IN      A

#下面是DNS服务器的答复
;; ANSWER SECTION:
www.baidu.com.          333     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       103     IN      A       220.181.111.188
www.a.shifen.com.       103     IN      A       220.181.112.244

#下面是是DNS服务器的一些传输信息
;; Query time: 0 msec
;; SERVER: 10.230.8.10#53(10.230.8.10)
;; WHEN: Fri Aug 10 18:33:13 DST 2018
;; MSG SIZE  rcvd: 113

域名的层级

DNS服务器怎么会知道每个域名的IP地址呢?答案是分级查询。

请仔细看前面的例子,每个域名的尾部都多了一个点。

比如,域名www.baidu.com显示为www.baidu.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,又称为”三级域名”,这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

域名的层级结构如下:

#主机名.次级域名.顶级域名.根域名
host.sld.tld.root

根域名服务器

DNS服务器根据域名的层级,进行分级查询。

需要明确的是,每一级域名都有自己的NS记录,NS记录指向该级域名的域名服务器。这些服务器知道下一级域名的各种记录。

所谓”分级查询”,就是从根域名开始,依次查询每一级域名的NS记录,直到查到最终的IP地址,过程大致如下:

1.从"根域名服务器"查到"顶级域名服务器"的NS记录和A记录(IP地址)
2.从"顶级域名服务器"查到"次级域名服务器"的NS记录和A记录(IP地址)
3.从"次级域名服务器"查出"主机名"的IP地址

仔细看上面的过程,你可能发现了,没有提到DNS服务器怎么知道”根域名服务器”的IP地址。回答是”根域名服务器”的NS记录和IP地址一般是不会变化的,所以内置在DNS服务器里面。

下面是内置的根域名服务器IP地址的一个例子:

; formerly NS.INTERNIC.NET
;
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
#列出了根域名(.root)的三条NS记录A.ROOT-SERVERS.NET 以及它们的IP地址(即A记录)198.41.0.4
#另外,可以看到记录的TTL值是3600000秒,相当于1000小时。也就是说,每1000小时才查询一次根域名服务器的列表。
#目前,世界上一共有十三组根域名服务器,从A.ROOT-SERVERS.NET一直到M.ROOT-SERVERS.NET。
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:BA3E::2:30

分级查询

#运行
dig +trace www.baidu.com

;; Warning: Message parser reports malformed message packet.
#下面是列出根域名.的所有NS记录,即所有根域名服务器。
#根据内置的根域名服务器IP地址,DNS服务器向所有这些IP地址发出查询请求,询问www.baidu.com的顶级域名服务器com.的NS记录。最先回复的根域名服务器将被缓存,以后只向这台服务器发请求。
; <<>> DiG 9.11.3-1ubuntu1-Ubuntu <<>> +trace www.baidu.com
;; global options: +cmd
.                       467947  IN      NS      b.root-servers.net.
.                       467947  IN      NS      i.root-servers.net.
.                       467947  IN      NS      l.root-servers.net.
.                       467947  IN      NS      d.root-servers.net.
.                       467947  IN      NS      j.root-servers.net.
.                       467947  IN      NS      e.root-servers.net.
.                       467947  IN      NS      f.root-servers.net.
.                       467947  IN      NS      m.root-servers.net.
.                       467947  IN      NS      k.root-servers.net.
.                       467947  IN      NS      a.root-servers.net.
.                       467947  IN      NS      h.root-servers.net.
.                       467947  IN      NS      c.root-servers.net.
.                       467947  IN      NS      g.root-servers.net.
b.root-servers.net.     16702   IN      A       199.9.14.201
;; Received 836 bytes from 10.230.8.10#53(10.230.8.10) in 0 ms

#下面是.com域名的NS记录,同时返回的还有每一条记录对应的IP地址。
#然后,DNS服务器向这些顶级域名服务器发出查询请求,询问www.baidu.com的次级域名baidu.com的NS记录。
com.                    172800  IN      NS      h.gtld-servers.net.
com.                    172800  IN      NS      i.gtld-servers.net.
com.                    172800  IN      NS      a.gtld-servers.net.
com.                    172800  IN      NS      l.gtld-servers.net.
com.                    172800  IN      NS      g.gtld-servers.net.
com.                    172800  IN      NS      k.gtld-servers.net.
com.                    172800  IN      NS      b.gtld-servers.net.
com.                    172800  IN      NS      m.gtld-servers.net.
com.                    172800  IN      NS      d.gtld-servers.net.
com.                    172800  IN      NS      e.gtld-servers.net.
com.                    172800  IN      NS      f.gtld-servers.net.
com.                    172800  IN      NS      c.gtld-servers.net.
com.                    172800  IN      NS      j.gtld-servers.net.
com.                    86400   IN      DS      30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.                    86400   IN      RRSIG   DS 8 1 86400 20180823050000 20180810040000 41656 . y4DX1sa/+BX/tSvLv6zVPJurhjqS+3CcBhl1osNautNvkSBZhbKEpbP6 187ufUYH5BGN0PZ4331LXBcom0o5LluPVvKtU5uWMF4Mjv2tdOLNbh8j EIHFSyIwKOT1oTVxpWWVgcJ4RNc6ZA1Vx4QY0rk8yF7jqP1yqsDOZFTs bPCmmX37qBHcDM19hlpUInc1ln0njnKv+huipfx6Bg4rwpmvfERqIahe PEvKLTxPurb6f2ZvjaXZLaaC2MAxeMj6T7F6ihRAzPHDs9IHL/fVE0Ot LJFbDUKInw3+lqMr3NuLGpBQbOQwW0e1CCS5JA70gClFxgvuJJJ2kK8V lME43A==
;; Received 1173 bytes from 199.9.14.201#53(b.root-servers.net) in 242 ms

#下面是baidu.com的有四条NS记录,同时返回的还有每一条NS记录对应的IP地址。
baidu.com.              172800  IN      NS      dns.baidu.com.
baidu.com.              172800  IN      NS      ns2.baidu.com.
baidu.com.              172800  IN      NS      ns3.baidu.com.
baidu.com.              172800  IN      NS      ns4.baidu.com.
baidu.com.              172800  IN      NS      ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A  NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20180816044556 20180809033556 46475 com. KPWx33+FsechgyH7iiU/A+VVV+l404cL5oozCf7TehGsLgm3aFAhz08U czlvwQu4w8gkfmieMCXDkOJkBdJz8btaWz+WilBir8arYxnTuQ5ZzAo2 zW1SEVHQTvgDaoRA6F9wpDHpSLQZt0WpkJWnH8FDisI5XSrnY79nrB7R 1AY=
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN NSEC3 1 1 0 - HPVVP23QUO0FP9R0A04URSICJPESKO9J  NS DS RRSIG
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN RRSIG NSEC3 8 2 86400 20180814043035 20180807032035 46475 com. xmegigrVUYtk0Cl9kFck/oi0vk6L6gWhfD2PSqII6SjrL+0CuJDiDdYZ 7yj8KTv61mopxsaqrd67PxrfehyaSABWKIDd1wPZPCL/j96FsaFLses2 I6GSXoTgEeYlNiWdtgAme+sGIUYxiIwHUzrwlTuqyR84vqUw+6S+Zl4/ CkY=
;; Received 697 bytes from 192.42.93.30#53(g.gtld-servers.net) in 218 ms

#然后,DNS服务器向上面这四台NS服务器查询www.baidu.com的主机名
#结果显示,www.baidu.com有1条CNAME记录。并且还显示,最先返回结果的NS服务器是ns4.baidu.com

www.baidu.com.          1200    IN      CNAME   www.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns3.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns5.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns4.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns2.a.shifen.com.
a.shifen.com.           1200    IN      NS      ns1.a.shifen.com.
;; Received 239 bytes from 220.181.38.10#53(ns4.baidu.com) in 3 ms

DNS的记录类型

域名与IP之间的对应关系,称为”记录”(record)。

常见的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记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。举例来说,www.baidu.com这个域名就是一个CNAME记录。

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

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

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

dig -x IP地址

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

dig a baidu.com
dig ns baidu.com
dig mx baidu.com

转载

来自DNS 原理入门