DNS解析过程

309 阅读4分钟

DNS 是域名系统(Domain Name System)的缩写。

一、基本概念

它就像是互联网的电话簿。在互联网中,每一个设备(如服务器、计算机等)都有一个唯一的 IP 地址(如 IPv4 的格式是 xxx.xxx.xxx.xxx),这串数字很难被人们记住。而域名(例如baidu.com、google.com)相对来说比较容易记忆。DNS 的主要功能是将人们便于记忆的域名转换为计算机能够识别的 IP 地址。

例如,当你在浏览器中输入www.example.com浏览器会向DNS 服务器发送一个请求,询问这个域名对应的 IP 地址是多少。DNS 服务器经过查询后,将对应的 IP 地址返回给浏览器,然后浏览器就可以根据这个 IP 地址去访问对应的网站服务器。

二、nslookup工具

为了后面演示DNS的解析过程,这里先介绍一款DNS查询的命令行工具:nslookup。如果没有安装,Debian/Ubuntu可以执行如下命令安装sudo apt install net-tools进行安装

2.1、nslookup支持的两种模式

  1. 非交互模式

    用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。

  2. 非交互模式

    用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。

2.2、非交互模式查询域名

查询命令nslookup domain [dns-server]

  1. 不指定dns-server(DNS服务器)参数,则用当前系统默认的dns服务器解析域名,如下图:

系统默认的dns服务器配置在 /etc/resolv.conf

image.png

  1. 指定dns-server(DNS服务器)参数:指定DNS服务器查询域名的IP地址,如下图:

image.png

2.3、交互模式下的查询

我们先来了解一下DNS存储的记录结构, 如下图:

image.png

例如,我们要在交互模式下,查询根域名服务器的服务域名

$ nslookup                                                           [22:14:03]
> set type=ns
> .
Server:		8.8.8.8
Address:	8.8.8.8#53

Non-authoritative answer:
.	nameserver = a.root-servers.net.
.	nameserver = b.root-servers.net.
.	nameserver = l.root-servers.net.
.	nameserver = g.root-servers.net.
.	nameserver = j.root-servers.net.
.	nameserver = e.root-servers.net.
.	nameserver = d.root-servers.net.
.	nameserver = f.root-servers.net.
.	nameserver = i.root-servers.net.
.	nameserver = k.root-servers.net.
.	nameserver = m.root-servers.net.
.	nameserver = h.root-servers.net.
.	nameserver = c.root-servers.net.

Authoritative answers can be found from:

三、DNS的解析过程

image.png

以浏览器访问www.baidu.com为例,演示DNS解析过程

先在命令行输入nslookup进入交互模式

  1. 拿到根域名的查询地址,即获得一个根域名服务器的IP,因为需要拿到IP才能进行通信

Non-authoritative answer: 代表从缓存中查询到的结果

Authoritative answers: 代表从域名服务器查询到的结果

> set type=ns    # 设置查询的值类型为后面输入域名的权威服务器域名
> . # 要查询的是根域名的域名服务器
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
. nameserver = j.root-servers.net.
. nameserver = b.root-servers.net.
. nameserver = f.root-servers.net.
. nameserver = c.root-servers.net.
. nameserver = k.root-servers.net.
. nameserver = i.root-servers.net.
. nameserver = h.root-servers.net.
. nameserver = e.root-servers.net.
. nameserver = g.root-servers.net.
. nameserver = a.root-servers.net.
. nameserver = m.root-servers.net.
. nameserver = l.root-servers.net.
. nameserver = d.root-servers.net.
Authoritative answers can be found from:
  1. 随便选一个根域名服务器,查询它的IP
> set type=a
> b.root-servers.net.
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: b.root-servers.net
Address: 170.247.170.2

3.设置nslookup查询的服务器为上一步得到的IP结果(即指定后面的查询从根域名服务器查询),并查询com顶级域名的域名服务器的域名

> server 170.247.170.2  # 指定查询的server为根域名服务器
Default server: 170.247.170.2
Address: 170.247.170.2#53
> set type=ns  # 查询 com. 域名的顶级域名服务器的域名
> com.
Server:		170.247.170.2
Address:	170.247.170.2#53

Non-authoritative answer:
*** Can't find com.: No answer

Authoritative answers can be found from:
com	nameserver = a.gtld-servers.net.
com	nameserver = b.gtld-servers.net.
com	nameserver = c.gtld-servers.net.
com	nameserver = d.gtld-servers.net.
com	nameserver = e.gtld-servers.net.
com	nameserver = f.gtld-servers.net.
com	nameserver = g.gtld-servers.net.
com	nameserver = h.gtld-servers.net.
com	nameserver = i.gtld-servers.net.
com	nameserver = j.gtld-servers.net.
com	nameserver = k.gtld-servers.net.
com	nameserver = l.gtld-servers.net.
com	nameserver = m.gtld-servers.net.
a.gtld-servers.net	internet address = 192.5.6.30
a.gtld-servers.net	has AAAA address 2001:503:a83e::2:30
b.gtld-servers.net	internet address = 192.33.14.30
b.gtld-servers.net	has AAAA address 2001:503:231d::2:30
c.gtld-servers.net	internet address = 192.26.92.30
c.gtld-servers.net	has AAAA address 2001:503:83eb::30
d.gtld-servers.net	internet address = 192.31.80.30
d.gtld-servers.net	has AAAA address 2001:500:856e::30
e.gtld-servers.net	internet address = 192.12.94.30
e.gtld-servers.net	has AAAA address 2001:502:1ca1::30
f.gtld-servers.net	internet address = 192.35.51.30
f.gtld-servers.net	has AAAA address 2001:503:d414::30

4.设置查询服务器为顶级域名服务器,并查询域名baidu.com的权威域名服务器

因为上一步已经返回了顶级域名服务器域名对应的IP,所以直接把顶级域名服务器的IP随便拿一个来用就行

> server 192.5.6.30   # 设置查询服务器为顶级域名服务器
Default server: 192.5.6.30
Address: 192.5.6.30#53
> set type=ns   # 查询baidu.com的权威域名服务器
> baidu.com
Server:		192.5.6.30
Address:	192.5.6.30#53

Non-authoritative answer:
*** Can't find baidu.com: No answer

Authoritative answers can be found from:
baidu.com	nameserver = ns2.baidu.com.
baidu.com	nameserver = ns3.baidu.com.
baidu.com	nameserver = ns4.baidu.com.
baidu.com	nameserver = ns1.baidu.com.
baidu.com	nameserver = ns7.baidu.com.
ns2.baidu.com	internet address = 220.181.33.31
ns3.baidu.com	internet address = 153.3.238.93
ns3.baidu.com	internet address = 36.155.132.78
ns4.baidu.com	internet address = 111.45.3.226
ns4.baidu.com	internet address = 14.215.178.80
ns1.baidu.com	internet address = 110.242.68.134
ns7.baidu.com	internet address = 180.76.76.92
ns7.baidu.com	has AAAA address 240e:940:603:4:0:ff:b01b:589a
ns7.baidu.com	has AAAA address 240e:bf:b801:1002:0:ff:b024:26de

5. 设置查询服务器为权威域名服务器,并从权威域名服务器查询域名www.baidu.com的IP

返回的结果是 canonical name = www.a.shifen.com.,说明这一个跳转域名,意思是www.baidu.com 会跳转到 www.a.shifen.com

> server 220.181.33.31
Default server: 220.181.33.31
Address: 220.181.33.31#53
> set type=a
> www.baidu.com
Server:		220.181.33.31
Address:	220.181.33.31#53

www.baidu.com	canonical name = www.a.shifen.com.
  1. 查询CDN域名的IP,就是我们最终需要的IP了
> www.a.shifen.com.
Server:		220.181.33.31
Address:	220.181.33.31#53

Non-authoritative answer:
*** Can't find www.a.shifen.com.: No answer

Authoritative answers can be found from:
a.shifen.com	nameserver = ns1.a.shifen.com.
a.shifen.com	nameserver = ns5.a.shifen.com.
a.shifen.com	nameserver = ns2.a.shifen.com.
a.shifen.com	nameserver = ns3.a.shifen.com.
a.shifen.com	nameserver = ns4.a.shifen.com.
ns5.a.shifen.com	internet address = 180.76.76.95
ns4.a.shifen.com	internet address = 14.215.177.229
ns4.a.shifen.com	internet address = 111.20.4.28
ns3.a.shifen.com	internet address = 36.155.132.12
ns3.a.shifen.com	internet address = 153.3.238.162
ns2.a.shifen.com	internet address = 220.181.33.32
ns1.a.shifen.com	internet address = 110.242.68.42
ns5.a.shifen.com	has AAAA address 240e:bf:b801:1006:0:ff:b04f:346b
ns5.a.shifen.com	has AAAA address 240e:940:603:a:0:ff:b08d:239d