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查询的操作流程是:
- 客户端(linux/unix一般是gethostbyname和gethostbyaddr)向当前DNS服务器查询域名,一般查询A记录(IP地址)。
- DNS服务器收到客户端的请求之后,向DNS根服务器发送一样的A记录请求,因为DNS根服务器不支持递归查询,所以返回知道这个域名的DNS服务器列表(NS记录)和对应的IP地址。
- DNS服务器选择最靠前的下一跳DNS服务器(NS记录里)接着发送递归查询。
- 下一跳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地址了。
整个过程就是如图: