DNS初探

DNS是一个分布式系统,没有一个单独的主机知道所有的信息。

最简单的DNS系统就是/etc/hosts文件了,每行内容是”IP 主机名 主机名1 主机名2 …”。

域名(domain name)和主机名(hostname)组成完整的DNS标识,例如

www.freezhongzi.info,www是主机名,freezhongzi.info是域名,而

freezhongzi.info,freezhongzi是主机名,.info是域名。

以句号.结尾的域名,如www.freezhongzi.info.叫Fully Qualified Domain Name(FQDN),句号表示根域名,在DNS协议里用FQDN标识。

DNS递归查询(recursion query)

默认的递归查询都是由你的当前DNS服务器执行的,所以一般都设置RD位(例外是DNS根服务器是没有递归查询功能的,所以当DNS服务器向根服务器查询时不设置RD位)。

DNS查询的操作流程是:

  1. 客户端(linux/unix一般是gethostbyname和gethostbyaddr)向当前DNS服务器查询域名,一般查询A记录(IP地址)。
  2. DNS服务器收到客户端的请求之后,向DNS根服务器发送一样的A记录请求,因为DNS根服务器不支持递归查询,所以返回知道这个域名的DNS服务器列表(NS记录)和对应的IP地址。
  3. DNS服务器选择最靠前的下一跳DNS服务器(NS记录里)接着发送递归查询。
  4. 下一跳DNS服务器返回域名的IP地址,如果下一跳DNS服务器不支持递归查询而返回下下一跳DNS服务器列表重复步骤3。

从中可以看出递归查询与非递归查询的区别:

  • 非递归查询返回知道那个域名的DNS服务器地址,让你继续去查。
  • 递归查询是让DNS服务器一级级往下查直到查到IP地址为止,很像一个递归过程。

实例:

第一步:找出DNS根服务器:

查询DNS根的NS记录获得13个DNS根服务器域名和IP地址:

$dig . ns 或直接 $dig

;; AUTHORITY SECTION:
.           37383   IN  NS  b.root-servers.net.
.           37383   IN  NS  c.root-servers.net.
.           37383   IN  NS  f.root-servers.net.
.           37383   IN  NS  l.root-servers.net.
.           37383   IN  NS  i.root-servers.net.
.           37383   IN  NS  d.root-servers.net.
.           37383   IN  NS  e.root-servers.net.
.           37383   IN  NS  a.root-servers.net.
.           37383   IN  NS  k.root-servers.net.
.           37383   IN  NS  m.root-servers.net.
.           37383   IN  NS  g.root-servers.net.
.           37383   IN  NS  h.root-servers.net.
.           37383   IN  NS  j.root-servers.net.

;; ADDITIONAL SECTION:
k.root-servers.net. 3580415 IN  A   193.0.14.129
k.root-servers.net. 3581367 IN  AAAA    2001:7fd::1
a.root-servers.net. 3579080 IN  A   198.41.0.4
a.root-servers.net. 3567490 IN  AAAA    2001:503:ba3e::2:30
e.root-servers.net. 3580333 IN  A   192.203.230.10
d.root-servers.net. 3581308 IN  A   128.8.10.90
d.root-servers.net. 3530630 IN  AAAA    2001:500:2d::d
i.root-servers.net. 3580233 IN  A   192.36.148.17
i.root-servers.net. 3568782 IN  AAAA    2001:7fe::53
l.root-servers.net. 3579724 IN  A   199.7.83.42
l.root-servers.net. 3593302 IN  AAAA    2001:500:3::42
f.root-servers.net. 3580192 IN  A   192.5.5.241

上面的AAAA是IPv6地址记录。

而且貌似默认的电信DNS服务器的TTL(就是DNS服务器Cache时间)很不准(一下子15到515,不知道TTL到底是多少),而google的8.8.8.8很准一直从600秒(10钟)递减:)。

$dig www.freezhongzi.info @8.8.8.8
...
www.freezhongzi.info.   600 IN  A   xxx.xxx.xxx.xxx
...

$dig www.freezhongzi.info @8.8.8.8
...
www.freezhongzi.info.   576 IN  A   xxx.xxx.xxx.xxx
...

$dig www.freezhongzi.info @8.8.8.8
...
www.freezhongzi.info.   573 IN  A   xxx.xxx.xxx.xxx
...

第二步:随便选一个m.root-servers.net的IP地址执行递归查询:

$dig +norecurse www.freezhongzi.info @202.12.27.33

;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 12

;; QUESTION SECTION:
;www.freezhongzi.info.      IN  A

;; AUTHORITY SECTION:
info.           172800  IN  NS  b2.info.afilias-nst.org.
info.           172800  IN  NS  b0.info.afilias-nst.org.
info.           172800  IN  NS  a0.info.afilias-nst.info.
info.           172800  IN  NS  c0.info.afilias-nst.info.
info.           172800  IN  NS  d0.info.afilias-nst.org.
info.           172800  IN  NS  a2.info.afilias-nst.info.

;; ADDITIONAL SECTION:
a0.info.afilias-nst.info. 172800 IN A   199.254.31.1
a2.info.afilias-nst.info. 172800 IN A   199.249.113.1
b0.info.afilias-nst.org. 172800 IN  A   199.254.48.1
b2.info.afilias-nst.org. 172800 IN  A   199.249.121.1
c0.info.afilias-nst.info. 172800 IN A   199.254.49.1
d0.info.afilias-nst.org. 172800 IN  A   199.254.50.1
a0.info.afilias-nst.info. 172800 IN AAAA    2001:500:19::1
a2.info.afilias-nst.info. 172800 IN AAAA    2001:500:41::1
b0.info.afilias-nst.org. 172800 IN  AAAA    2001:500:1a::1
b2.info.afilias-nst.org. 172800 IN  AAAA    2001:500:49::1
c0.info.afilias-nst.info. 172800 IN AAAA    2001:500:1b::1
d0.info.afilias-nst.org. 172800 IN  AAAA    2001:500:1c::1

可以看到DNS根服务器不支持递归查询(没有RA标记)。

第三步:选择下一跳.info DNS服务器接着查询:

$dig www.freezhongzi.info @d0.info.afilias-nst.org.

;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 2, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.freezhongzi.info.      IN  A

;; AUTHORITY SECTION:
freezhongzi.info.   86400   IN  NS  f1g1ns2.dnspod.net.
freezhongzi.info.   86400   IN  NS  f1g1ns1.dnspod.net.

发现.info也不支持递归查询,返回的两个DNS服务器:

f1g1ns1.dnspod.net
f1g1ns2.dnspod.net

如果熟悉dnspod的会知道那是它的DNS服务器域名,我的freezhongzi.info就是由它托管的:)

最后一部就是向dnspod索要了:

$dig www.freezhongzi.info @f1g1ns1.dnspod.net

;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; ANSWER SECTION:
www.freezhongzi.info.   600 IN  A   xxx.xxx.xxx.xxx

;; AUTHORITY SECTION:
freezhongzi.info.   600 IN  NS  f1g1ns2.dnspod.net.
freezhongzi.info.   600 IN  NS  f1g1ns1.dnspod.net.

dnspod也不支持递归查询,但终于返回我要的IP地址了。

整个过程就是如图:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注