DNS查询过程

533 阅读5分钟

基本概念

  • DNS 域名解析服务

    我们知道网络上的计算机被赋予了 IP 地址,通过这个 IP 地址就能访问到对应的计算机。但是为了便于记忆,人们更倾向于用包含字母数字的信息来访问,于是便有了域名,比如www.xinghunm.com。但是当通过域名访问时,我们怎么能知道该域名对应的是哪台计算机呢? 这就需要 DNS(Domain Name System)服务了,它提供域名到 IP 地址之间的解析服务,也就是说你给我域名,我还你 IP(想象一下电话簿)...

  • 域名空间结构

    实际上,域名是分层次的空间结构,以www.xinghunm.com.为例(从右往左读):

    • 根:用点(·)表示,通常我们都会省略这个点
    • 顶级域名:com
    • 二级域名:xinghunm
    • 三级域名:www

    其他低层级域名以此类推。

    需要注意的是域名的层级并不是绝对的,比如顶级域名.com,在.com.cn域名结构中.com就是在.cn这个国家顶级域名下的二级域名。

    顶级域主要包括两种类型: 通用顶级域:

    通用顶级域含义
    .com商业公司
    .net互联网服务供应商
    .edu教育机构
    .org非营利组织、国际机构等
    ......

    国家和地区顶级域:

    国家和地区顶级域含义
    .cn中国
    .hk中国香港
    .us美国
    .jp日本
    ......
  • 根 DNS 服务器

    根 DNS 服务器是是互联网域名解析系统(DNS)中最高级别的域名服务器(就像国家元首一样),负责返回顶级域的域名服务器地址。通常网络上传言根 DNS 服务器只有 13 台,这种说法并不准确,实际上根 DNS 服务器地址数量是 13 个,通过任播技术,分散在不同地理位置的多台服务器,可以使用相同的 IP 地址。当向这个 IP 地址发送数据时,路由协议会自动选择一个最近的节点,实际的根 DNS 服务器达上千台。 根 DNS 服务器包含了所有顶级域名服务器的名称和 IP, 就像图书馆中指向不同类型书籍的索引。 根 DNS 服务器查找,是将网址转换为 IP 的第一步(不考虑缓存),它将返回要继续查找的顶级域名服务器的 IP。

    通过dig . NS命令就能得到根服务器的名称:

    
    $ dig . NS
      .			12881	IN	NS	c.root-servers.net.
      .			12881	IN	NS	d.root-servers.net.
      .			12881	IN	NS	e.root-servers.net.
      .			12881	IN	NS	f.root-servers.net.
      .			12881	IN	NS	g.root-servers.net.
      .			12881	IN	NS	h.root-servers.net.
      .			12881	IN	NS	i.root-servers.net.
      .			12881	IN	NS	j.root-servers.net.
      .			12881	IN	NS	k.root-servers.net.
      .			12881	IN	NS	l.root-servers.net.
      .			12881	IN	NS	m.root-servers.net.
      .			12881	IN	NS	a.root-servers.net.
      .			12881	IN	NS	b.root-servers.net.
    
    
  • TLD(Top-level domain)名称服务器

    名称服务器是提供域名到 IP 地址间映射的服务器。 TLD 名称服务器,即顶级域名称服务器(就像国家元首下的各个省长一样),它负责管理注册在.com、.cn、.org...等顶级域名下的二级域名。它将返回要继续查找的权威名称服务器的 IP。

  • 权威名称服务器

    管理一个区域的域名服务器,一般指顶级域下的二级、三级、四级等域名服务器, 就像省长下的市长、区长、乡长等。TLD 名称服务器也算是权威名称服务器,但是其相对特殊,一般单独划作一类。 权威名称服务器是名称服务器查询的最后一步,它将把请求地址的 IP 地址返回给发出初始请求的本地域名服务器。当然权威名称服务器查询有可能会查询多次,比如到三级、四级。

  • 本地域名服务器

    本地域名服务器像一个图书管理员,被请求在图书馆的某个地方找到一本特定的书。当客户端发送请求时,首先就向本地域名服务器查询,如果它回答不了,它会代替客户端发送查询的请求。

  • DNS 记录

    DNS 记录是存在于 DNS 服务器上的指令集,对于 DNS 解析至关重要,一些常用记录包括:

    • A 记录

      A 即 Address,比如将 xinghunm.com 域名指向一个 IPv4 地址(139.20.100.27):

      主机记录记录类型记录值
      xinghunm.comA139.20.100.27

      通常主机记录不直接用域名,而是用@,会直接解析为当前域名。

      主机记录记录类型记录值
      @A139.20.100.27

      主机记录也可以用*,泛解析,匹配其他所有域名*.xinghunm.com

    • CNAME 记录

      CNAME 即 Canonical Name,它的作用是将一个别名关联到真正的域名,当访问别名时就会解析到真正的域名。 假如我有一台 web 服务器(我申请到的域名为 xinghunm.com),需要在上边部署多个站点:

      a.xinghunm.com
      b.xinghunm.com
      c.xinghunm.com
      

    通过 A 记录指向 web 服务器 IP,然后再配置上述站点的 CNAME 记录,指向 xinghunm.com:

    主机记录记录类型记录值
    a.xinghunm.comCNANExinghunm.com
    b.xinghunm.comCNANExinghunm.com
    c.xinghunm.comCNANExinghunm.com

    • NS 记录

      NS 即 Name Server,提供该域解析的权威 DNS 服务器,记录值为 DNS 服务器的域名。

      比如我申请的域名 xinghunm.com, 通过 dnspod 解析,我需要配置 NS 记录指向 dnspod 服务器,这个 NS 记录,最终会被同步到 .com 顶级域名服务器。当查找 xinghunm.com 的 IP 时,.com 服务器就知道去 f1g1ns1.dnspod.net.或 f1g1ns2.dnspod.net.去进行进一步的查找了。

      主机记录记录类型记录值
      @NSf1g1ns1.dnspod.net.
      @NSf1g1ns2.dnspod.net.

DNS 查找流程

DNS 查找中客户端与浏览器、本地 DNS 之间的查询方式是递归查询;本地 DNS 服务器与根域及其子域之间的查询方式是迭代查询。 在浏览器输入 URL 回车后,首先有一个递归查找的过程:

  • 首先在浏览器缓存中查找
  • 在本地 hosts 文件中查找
  • 在 DNS 解析器缓存查找
  • 在本地 DNS 服务器查找

以上任何一个步骤找到了都会结束查询流程。如果没有查询到,则根据设置的转发器(为其他 DNS 服务器完成 DNS 查询的 DNS 服务器)进行查找,如果没有采用转发模式则进行迭代查找

迭代查找最显著的特征在于,如果服务器没有关于待查域名的结果,它会告诉客户端应该去哪里查找,而不是直接回复查询结果。而递归查找不同,它需要准确的查询结果(这个域的 IP 是多少, 不是去哪里查找),如果没有则替客户端向其他 DNS 服务器发起请求,然后再把结果返回给客户端。

浏览器递归查询测试

我们知道浏览器在 dns 查询时首先会去找自己的缓存,下面来进行测试

  • 在浏览器(chrome)地址栏中输入chrome://net-internals/#dns 通过该命令可以打开 dns 缓存管理界面:

    点击 Clear host cache 以清楚缓存。

  • 在浏览器(chrome)中打开www.baidu.com 可以看到网络请求时有 DNS Lookup 的过程:

  • 再次在浏览器(chrome)中打开www.baidu.com

    可以看到网络请求时已经没有 DNS Lookup 的过程了,说明浏览器对 dns 进行缓存了。

  • 修改本地 hosts 将www.baidu.com指向本地127.0.0.1

    mac 下 hosts 位于/etc/hosts:

    /etc/hosts
    127.0.0.1       www.baidu.com
    

    修改完成后在本地监听80 端口:

    $ http-server --port 80
    Starting up http-server, serving ./
    
    http-server version: 14.0.0
    
    http-server settings:
    CORS: disabled
    Cache: 3600 seconds
    Connection Timeout: 120 seconds
    Directory Listings: visible
    AutoIndex: visible
    Serve GZIP Files: false
    Serve Brotli Files: false
    Default File Extension: none
    
    Available on:
      http://127.0.0.1:80
      http://192.168.1.155:80
      http://10.8.0.22:80
    Hit CTRL-C to stop the server
    

    再次打开百度,并没有跳转到127.0.0.1,因为浏览器的 dns 缓存默认有一分钟,等待一分钟后再次访问,能够正确跳转:

迭代查询测试

在 mac 下通过dig 命令来追踪迭代查询 DNS 请求过程,以查询www.keyamedical.com为例:

//dig命令的+trace参数可以显示DNS的整个迭代查询过程
$ dig +trace www.keyamedical.com

依次输出以下结果:

  1. 首先从网络服务商(本地配置的是 114.114.114.114)获取根服务器的地址
// 类似命令:dig . NS

; <<>> DiG 9.10.6 <<>> +trace www.keyamedical.com
;; global options: +cmd
.			289	IN	NS	m.root-servers.net.
.			289	IN	NS	j.root-servers.net.
.			289	IN	NS	g.root-servers.net.
.			289	IN	NS	h.root-servers.net.
.			289	IN	NS	c.root-servers.net.
.			289	IN	NS	b.root-servers.net.
.			289	IN	NS	l.root-servers.net.
.			289	IN	NS	f.root-servers.net.
.			289	IN	NS	a.root-servers.net.
.			289	IN	NS	d.root-servers.net.
.			289	IN	NS	i.root-servers.net.
.			289	IN	NS	e.root-servers.net.
.			289	IN	NS	k.root-servers.net.
;; Received 327 bytes from 114.114.114.114#53(114.114.114.114) in 19 ms

可以看到根服务器的地址共 13 个,编号为 a 到 k。

  1. 选择一个根服务器地址(选择了j.root-servers.net)来获取.com顶级域的地址。

可以看到,查询.com 域名应该去找 a.gtld-servers.net. 顶级域名服务器。

//类似命令:dig @192.58.128.30 com

com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.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	g.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			86400	IN	DS	30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.			86400	IN	RRSIG	DS 8 1 86400 20220828170000 20220815160000 20826 . bU+jvoNv4L20OBmXOpqsM9ZYrxKLPHvQEuafXFbcdvtMVTZrQl+FTl6+ qIH/rgYF0gICQeK+UfCdtb1Q2rPZQIvvsJmDW43ItlAzX9Sh/dkzGyDP kbs4hS+qfCxmNzNyddKLO2gpVZb0kuQ47z9+ADNiVDPNYt+nQmJ+7DGc Fufoy0wg1vBcnJUCsCj0ehNBFv2ub+M75XbGOQ46zPvBrI/8Qlb07iTt Nzi2Bp21oHEPs7CJwlt7Q1n6lesANIBh1S8bMH16XGNn1sJDwPsg6wrs omGz93xI5JOD4ZKBxamhCy+3zYQ3RUDaHT3/Oik5vcPffnxMH7mmFaAD H2FZhA==
;; Received 1179 bytes from 192.58.128.30#53(j.root-servers.net) in 62 ms
  1. 选择一个.com顶级域名服务器地址(选择了h.gtld-servers.net)来获取keyamedical.com的地址。

可以看到,查询keyamedical.com 域名应该去找 dns23.hichina.com.dns24.hichina.com.这两个权威域名服务器。 

//类似命令: dig @192.54.112.30 keyamedical.com
keyamedical.com.	172800	IN	NS	dns23.hichina.com.
keyamedical.com.	172800	IN	NS	dns24.hichina.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5  NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20220819042341 20220812031341 32298 com. qllFbhUUxEno/kZAlwQFHwlZEsat15dJN1zshaz7drTWuTIh2dtM1ctK KdKmUST+ixD1GyHmcnomWC/vkSGF1GvO7KbRLEVshCBeTz0z4Rnib1I4 Dap0BpHb1ZrnxhrjsA9l6OFGRyCSD2bMuj1SVgIvyVRFwymcTKbX3/+d J0Je7ndJNCFb54O2gyFR63I8/BeltgrZq/RLC9/vEYsiow==
V8QJ3NUH1USOFQK3VH08EM8U0KES2LO8.com. 86400 IN NSEC3 1 1 0 - V8QJCLLEFP36SPU96SRH39114CENMVHP  NS DS RRSIG
V8QJ3NUH1USOFQK3VH08EM8U0KES2LO8.com. 86400 IN RRSIG NSEC3 8 2 86400 20220821045437 20220814034437 32298 com. Vh7FxbMvZDZ0sYJvy5O9xnmRMZDbrzYGHAam/IcINi1krJJEzyiVxFTm d+UQwdojyhChUnJoloZafHpyh4aaD4XxEVNG2ZtGh8Sj1/mipnUcVHWz IIucNniHCChoisCXM2GIgX4TRiHpzqpGPLujRRUNDAsUEnIMVM54CpE+ ZDvDreggY5AMi2uuFPrNHZgs4tdbzziX2Kt2udteFVwAKQ==
;; Received 957 bytes from 192.54.112.30#53(h.gtld-servers.net) in 306 ms
  1. 选择一个权威域名服务器地址(选择了dns24.hichina.com)来获取www.keyamedical.com的地址。

可以看到这一步返回了别名www.keyamedical.com.w.kunluncan.com.,dns 请求到别名时请求终止了。

//类似命令:dig @39.96.153.61 www.keyamedical.com
www.keyamedical.com.	600	IN	CNAME	www.keyamedical.com.w.kunluncan.com.
;; Received 97 bytes from 39.96.153.61#53(dns24.hichina.com) in 93 ms

我们对别名再用 dig 查询:

$ dig +trace www.keyamedical.com.w.kunluncan.com

同查询www.keyamedical.com步骤一样,结果返回如下:

可以看到www.keyamedical.com.w.kunluncan.com有多条 A 记录(顺序随机),也就是说www.keyamedical.com实际对应了多个(12) IP 地址,浏览器访问时通常选取返回的第一个地址。

 ; <<>> DiG 9.10.6 <<>> +trace www.keyamedical.com.w.kunluncan.com
;; global options: +cmd
.			95	IN	NS	f.root-servers.net.
.			95	IN	NS	j.root-servers.net.
.			95	IN	NS	e.root-servers.net.
.			95	IN	NS	h.root-servers.net.
.			95	IN	NS	b.root-servers.net.
.			95	IN	NS	a.root-servers.net.
.			95	IN	NS	l.root-servers.net.
.			95	IN	NS	c.root-servers.net.
.			95	IN	NS	m.root-servers.net.
.			95	IN	NS	d.root-servers.net.
.			95	IN	NS	i.root-servers.net.
.			95	IN	NS	g.root-servers.net.
.			95	IN	NS	k.root-servers.net.
;; Received 407 bytes from 114.114.114.114#53(114.114.114.114) in 34 ms

com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			86400	IN	DS	30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.			86400	IN	RRSIG	DS 8 1 86400 20220830220000 20220817210000 20826 . ElUvKaW9ddxuW7Pl7e84kh/dxcGPWYJoQaSXGnWjCZTpt+LZivJAEolu LDCZwgVTkOJnwxlI7LdbCcwfW2jUH3EYK4GqjoSe4L171tNrWrTaIQC6 AIxMzMP6HlDawEI7LQQXE36wBlA/kb4l+jjLZmA5nsXQ2hCFCCtcBkmb dknNqt2O6feytsUw9CHzvvx5q/dlMWp1CwgfjnarWVSU/4dmpmd5BKfm UdPHnw5z73wqwAHZ3jAI0H6ecCjcZVhWgSkg5MLrAIS+I6p1WpE+ROlc x5DNu+1VYG5dsRFOruituYunDgEf1UuSrq/jsdWTGjXJoNgobqZIR35v 5gCsGw==
;; Received 1198 bytes from 192.112.36.4#53(g.root-servers.net) in 245 ms

kunluncan.com.		172800	IN	NS	ns3.aliyun.com.
kunluncan.com.		172800	IN	NS	ns4.aliyun.com.
kunluncan.com.		172800	IN	NS	ns5.aliyun.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5  NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20220823042413 20220816031413 32298 com. Enbw7kmsz48csnt/+2IImg9UXUMiORjdqjCbvReZvY+xnAS1HG8z6usT EK2Niky82goEJvdt9m7PPy50IR1c2UgLtDxP7RUjpjj5BsEJCxpZkrVI ZamykLOmdtYV1N9uw5HrLVi/tdFoFWWCXxx9Riqo6pQ/vou4o1QIjw8W eoeiv4WDVfVSFFZfroDth2pSZcE+on4uDcFdxUTXUNJ6fA==
47FLS55561T6TQE2S2KIKCM9C5DP5KAS.com. 86400 IN NSEC3 1 1 0 - 47FM6VRQR9U4PTLP3UH6F9HRRID4UCP3  NS DS RRSIG
47FLS55561T6TQE2S2KIKCM9C5DP5KAS.com. 86400 IN RRSIG NSEC3 8 2 86400 20220822050824 20220815035824 32298 com. NgtYilip85OLvzy85YwK8clautxpjxkT8tQbcmnNjBdx+LhCH7+CWF5J LI7U5/E0SQ4uA8DlS9+vEtT2VUSGngWTWPNbcm3GhZEnIG54wmduFkSQ Cvn8HeaIR/9tFseJy/ZYVarMjwbaiqsEM0BpcJ68hx6CjJFvnQ1yn2na DIRXZMUWa0rJJsnOqQFohc3UhQ6nttKrioKUw1XS+aAQbg==
;; Received 854 bytes from 192.54.112.30#53(h.gtld-servers.net) in 347 ms

w.kunluncan.com.	10800	IN	NS	ns4.kunluncan.com.
w.kunluncan.com.	10800	IN	NS	ns3.kunluncan.com.
w.kunluncan.com.	10800	IN	NS	ns5.kunluncan.com.
;; Received 329 bytes from 47.88.74.34#53(ns5.aliyun.com) in 199 ms

www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.124.226
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.165.102
www.keyamedical.com.w.kunluncan.com. 60	IN A	125.62.38.84
www.keyamedical.com.w.kunluncan.com. 60	IN A	125.62.38.81
www.keyamedical.com.w.kunluncan.com. 60	IN A	125.62.38.79
www.keyamedical.com.w.kunluncan.com. 60	IN A	125.62.38.80
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.165.105
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.165.103
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.165.99
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.165.104
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.165.98
www.keyamedical.com.w.kunluncan.com. 60	IN A	117.59.124.230
w.kunlunCan.com.	86400	IN	NS	ns3.kunlunCan.com.
w.kunlunCan.com.	86400	IN	NS	ns4.kunlunCan.com.
w.kunlunCan.com.	86400	IN	NS	ns5.kunlunCan.com.
;; Received 376 bytes from 121.43.18.41#53(ns3.kunluncan.com) in 73 ms