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支持的两种模式
-
非交互模式
用户可以针对一个主机或域名仅仅获取特定的名称或所需信息。
-
非交互模式
用户可以向域名服务器查询各类主机、域名的信息,或者输出域名中的主机列表。
2.2、非交互模式查询域名
查询命令nslookup domain [dns-server]
- 不指定dns-server(DNS服务器)参数,则用当前系统默认的dns服务器解析域名,如下图:
系统默认的dns服务器配置在
/etc/resolv.conf
- 指定dns-server(DNS服务器)参数:指定DNS服务器查询域名的IP地址,如下图:
2.3、交互模式下的查询
我们先来了解一下DNS存储的记录结构, 如下图:
例如,我们要在交互模式下,查询根域名服务器的服务域名
$ 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的解析过程
以浏览器访问www.baidu.com为例,演示DNS解析过程
先在命令行输入nslookup进入交互模式
- 拿到根域名的查询地址,即获得一个根域名服务器的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:
- 随便选一个根域名服务器,查询它的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.
- 查询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