8 个问题彻底搞透 DNS 协议
对于 DNS 协议,你可能想知道以下几个问题:
DNS 是啥
DNS 服务器有哪些
DNS 查询方式有哪些
DNS 缓存如何提升性能
DNS 协议格式长啥样
DNS 有哪些安全问题
DNS 的应用场景有哪些
DNS 的工具有哪些
01 DNS 是啥
DNS 协议简单说就是为了 将用户可读的域名转换为 IP 地址 。域名就是 IP 地址的代号,为什么互联网会有域名这一说法,主要是为了方便记忆,也为了掩盖对象本身的真实信息,使信息对用户透明,比如在周星驰的电影《唐伯虎点秋香》中,9527 就是唐伯虎的的代号。
02 DNS 服务器
为了根据域名得到 IP 地址,需要建立一个域名和 IP 地址之间的映射关系,简单点就是用一个文件来完成,这种叫 静态映射 ,复杂点就是用专门的服务器来完成,这种叫 动态映射 ,提供动态映射服务的服务器就叫 DNS 服务器 。
windows 用户比较熟悉的静态映射方法就是通过 hosts 文件,位置在 C:\Windows\System32\drivers\etc\hosts,只要在 hosts 文件中写上你想访问的域名和地址,系统内置的 DNS 解析器会优先解析,不会访问 DNS 服务器。Linux 下是 /etc/hosts。
由于存在单点故障,DNS 服务器不可能设计成集中式的,由于需要解析的域名信息众多且复杂,DNS 服务器必须足够多,为了方便管理,DNS 服务器最后呈现的是 具有层次结构的大型分布式集群系统 。如下图所示:
总体形成一个分级的树状体系,每个节点为一个 DNS 服务器,每个节点都有自己的 IP 地址。每一层的角色不一样,从上到下分别表示:
根域名服务器(Root Domain):用 · (句点)表示,根域名服务器全球的数量是固定的,为 13 个(当然这里的“个”是“组”的意思),至于为什么是 13 个?见文末的解释。
顶级域名服务器(Top-Level Domain, TLD):指代某个国家/地区或组织使用的类型名称,如 com、cn、edu 等。
次级域名服务器(Second-Level Domain, SLD):个人或组织在 Internet 上注册的名称,如 qq.com、gitHub.com 等
三次域名服务器或权威域名服务器(如果有):这层严格来说是次级域名的子域,是二层域名派生的域名,通俗说就是网站名,如 cs.berkeley.edu
主机名(如果有):主机名称标签,通常在 DNS 域名最左侧,标识网络上的特定计算机,如 www.berkeley.edu
附:13 个根服务器的配置文件:https://www.internic.net/domain/named.root
DNS 服务器有一个区域的概念。由于 DNS 服务器要为全球的用户提供查询和数据库的服务,对计算、存储、网络带宽都要求很高,所以就必须组织成域名服务器集群,使它们协同工作,共同提供域名解析服务。每个集群就负责管理相应的域名名字空间,也就是说每个集群负责不同的 DNS 区域(DNS Zone) 。比如每个根域名服务器节点指向的下一级就是它管理的 DNS 区域,同样再往下,cn 顶级域名服务器节点下面就管理中国区的 DNS 区域。
通过这种区域管理的方法,就很容易进行 DNS 查询。每一级的 DNS 区域域名服务器会保存下一级的 DNS 区域域名服务器的信息,如果从根域名服务器出发,一级级的往下查找,就可以得到目标域名对应的 IP 信息。
可能你会有问题,怎么找到根域名服务器呢?
上面已经提到过,全球的根域名服务器总的只有 13个,这 13 个的信息都是公开的,也就是说每一个用户的出口 DNS 服务器上都有这些根域名服务器的已知信息。有了这些信息,查找就不是问题了。
除了以上所列的 DNS 服务器,严格来说还有三种 DNS 服务器角色不容忽视。一种是本地 DNS 服务器,一种是 ISP DNS 服务器,还有一种是公共 DNS 服务器。
一个大概的图示如下所示:
/etc/hosts
和 /etc/resolv.conf
,前者记录了内网主机 hostname 和 IP 之间的映射关系,后者记录了外网的 DNS 服务器地址。/etc/hosts
和自身的缓存中都找不到相应的域名时,就会从 /etc/resolv.conf
中记录的地址进行进一步查询。8.8.8.8 # 主
8.8.8.4 # 备
# 国内三大运营商提供的公共 DNS:
114.114.114.114
114.114.115.115
# 阿里提供的
223.5.5.5
223.6.6.6
# 百度提供的:
180.76.76.76
03 DNS 查询
递归查询
迭代查询
本地终端发出域名解析请求,到本地 DNS 服务器(如果是 web 请求,会先查看浏览器缓存) 本地 DNS 服务器首先查看自身缓存,如果不存在则向 ISP DNS 服务器发出查询请求 ISP DNS 服务器同样先查看缓存,不存在再向众所周知的全球 13 台根服务器发出请求 根 DNS 服务器收到请求后会判断该域名(比如.com)由谁授权管理,返回管理这个域名的顶级 DNS 服务器的 IP,给到 ISP DNS 服务器 ISP DNS 服务器根据返回的 IP 继续请求顶级 DNS 服务器 该顶级 DNS 服务器收到请求后,如果自己无法解析,也会判断对应域名(比如qq.com)由下一级的哪个 DNS 服务器授权管理,并将该次级 DNS 服务器的 IP 发给 ISP DNS 服务器。 ISP DNS 服务器继续根据返回的 IP 请求次级 DNS 服务器 次级 DNS 服务器如果解析出对应的域名(比如 www.qq.com),就将该域名对应的 IP 返回给 ISP DNS 服务器,如果没有,就继续重复上述动作。 ISP DNS 服务器缓存一份域名与 IP 的映射关系,并将结果返回给本地 DNS 服务器 本地 DNS 服务器同样会缓存一份,然后将结果给到请求的终端,完成本次查询。
04 DNS 缓存
浏览器缓存:当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址 系统缓存:一般 DNS Resolver 模块通常设有 DNS cache,hosts 文件也可以看做是缓存 本地 DNS 缓存(如果有):这里特指硬件服务器,和系统缓存对应 路由器缓存:一般现在的出口路由器也会设有 DNS 缓存,当以上都查询不到,会在路由器缓存中查询 ISP DNS 缓存:ISP 网络提供的 DNS 服务器缓存。 根域名/顶级域名/次级域名等缓存
对于 Windows 系统,在命令行输入 ipconfig /flushdns
即可对于 Linux 系统,看有没有使用 dnsmasq
之类的缓存服务器,如果使用的话,只需重启缓存服务即可,如重启dnsmasq
服务:sudo systemctl restart dnsmasq.service
,如果没有使用,则根据各大 Linux 发行版各自的缓存服务来清除,比如 ubuntu 系统,默认使用systemd
解析的服务来缓存 DNS 条目,可以通过sudo systemd-resolve --flush-caches
来清除缓存对于 Web 浏览器的 DNS 缓存,可以在地址栏输入 chrome://net-internals/#dnsChrome
,然后再点击 "clear host cache",也可以通过Ctrl+Shift+Del
打开清除浏览器数据窗口进行清除
05 DNS 协议格式
06 DNS 安全问题
域名抢注:有些黄牛会批量抢注大量域名,然后转身高价卖给那些对域名感兴趣的人,谋取暴力 DNS Cache 污染:中间 DNS 服务器将上级服务器返回结果进行修改,给客户端一个改变了(污染)的信息 DNS 劫持:和 DNS Cache 污染比较像,不过这种可以被外部第三者劫持进行恶意修改 DNS 欺骗:用一个假的 DNS 应答来欺骗用户计算机,让其相信这个假的地址,并且忽略真正的 DNS 应答 DNS 放大攻击:这是一种 DDoS 攻击, 利用 DNS 回复包比请求包大的特点,放大流量,伪造请求包的源 IP 地址为受害者 IP,将应答包的流量引入受害的服务器 系统上运行的 DNS 服务存在漏洞,导致被黑客获取权限,从而篡改 DNS 信息 DNS 设置不当,导致泄漏一些敏感信息。提供给黑客进一步攻击提供有力信息
DNS 劫持
Server:8.8.8.8
Address:8.8.8.8#53
Non-authoritative answer:
Name:www.google.com
Address: 216.58.221.68
DNS 欺骗
07 DNS 应用
DNS 负载均衡器
dig baidu.com
,我们可以看到 baidu.com
对应多个 A 记录:CDN 专用 DNS
服务发现
08 DNS 工具
host nslookup dig
bind-utils
包,CentOS 系用户可以使用 yum install bind-utils
安装。dig
dig selfboot.cn +trace @8.8.8.8
; <<>> DiG 9.8.3-P1 <<>> selfboot.cn +trace @8.8.8.8
;; global options: +cmd
. 474418 IN NS j.root-servers.net.
. 474418 IN NS g.root-servers.net.
......
. 474418 IN NS l.root-servers.net.
. 474418 IN NS m.root-servers.net.
;; Received 496 bytes from 8.8.8.8#53(8.8.8.8) in 12 ms
cn. 172800 IN NS a.dns.cn.
......
cn. 172800 IN NS e.dns.cn.
cn. 172800 IN NS ns.cernet.net.
;; Received 292 bytes from 2001:500:1::803f:235#53(2001:500:1::803f:235) in 382 ms
selfboot.cn. 86400 IN NS f1g1ns2.dnspod.net.
selfboot.cn. 86400 IN NS f1g1ns1.dnspod.net.
;; Received 83 bytes from 203.119.25.1#53(203.119.25.1) in 816 ms
selfboot.cn. 14400 IN A 192.30.252.153
selfboot.cn. 14400 IN A 192.30.252.154
selfboot.cn. 600 IN NS f1g1ns1.dnspod.net.
selfboot.cn. 600 IN NS f1g1ns2.dnspod.net.
;; Received 125 bytes from 115.236.137.40#53(115.236.137.40) in 31 ms
nslookup
> github.com
Server:114.114.114.114
Address:114.114.114.114#53
Non-authoritative answer:
Name:github.com
Address: 13.229.188.59
>
host
baidu.com has address 39.156.69.79
baidu.com has address 220.181.38.148
baidu.com mail is handled by 20 jpmx.baidu.com.
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 20 mx50.baidu.com.
baidu.com mail is handled by 20 mx1.baidu.com.
baidu.com mail is handled by 15 mx.n.shifen.com.
dig -x
。59.188.229.13.in-addr.arpa domain name pointer ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com.
whois
Domain Name: coolshell.cn
ROID: 20090825s10001s91994755-cn
Domain Status: ok
Registrant ID: hc401628324-cn
Registrant: 陈皓
Registrant Contact Email: haoel@hotmail.com
Sponsoring Registrar: 阿里云计算有限公司(万网)
Name Server: f1g1ns1.dnspod.net
Name Server: f1g1ns2.dnspod.net
Registration Time: 2009-08-25 00:40:26
Expiration Time: 2023-08-25 00:40:26
DNSSEC: unsigned
为什么根域名服务器全球只有13组?
绝大多数的网络接口类型支持IP报文≤576 字节无需分片自由通行,考虑到以上诸因素,IETF决定将DNS报文体限制在512字节。每一个根域名服务器占用32字节,其中包括根域名的名称、IP地址、TTL(Time To Live)等参数。 13根域名服务器一共占用416字节,剩余的96字节用于包装DNS报文头以及其它协议参数。所以从空间上来说,没有多余的空间容纳第14个根域名服务器的32字节。
容易被大众误解的是,这13个根域名服务器并不等于13台物理服务器,而是代表着13个全球IP地址,由13个机构来管理,对应有不同的名字,分别为“A” 到 “M”,其中美国最大电信运营商Verizon管理两个根域名全球IP地址。 截至到(2019.09)为止,全球一共有 1011台服务器实例(Instances),遍布 5大洲 4大洋。
参考:
后台回复“加群”,带你进入高手如云交流群
推荐阅读:
喜欢,就给我一个“在看”
10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「1024」,即可免费获取!!