DNS图解(秒懂 + 史上最全)
Posted 架构师-尼恩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DNS图解(秒懂 + 史上最全)相关的知识,希望对你有一定的参考价值。
文章很长,而且持续更新,建议收藏起来,慢慢读! Java 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源:
- 免费赠送 经典图书 : 极致经典 + 社群大片好评 《 Java 高并发 三部曲 》 面试必备 + 大厂必备 + 涨薪必备
- 免费赠送 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 (加尼恩领取)
- 免费赠送 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备 (加尼恩领取)
- 免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 (加尼恩领取)
推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文
入大厂 、做架构、大力提升Java 内功 必备的精彩博文 | 2021 秋招涨薪1W + 必备的精彩博文 |
---|---|
1:Redis 分布式锁 (图解-秒懂-史上最全) | 2:Zookeeper 分布式锁 (图解-秒懂-史上最全) |
3: Redis与MySQL双写一致性如何保证? (面试必备) | 4: 面试必备:秒杀超卖 解决方案 (史上最全) |
5:面试必备之:Reactor模式 | 6: 10分钟看懂, Java NIO 底层原理 |
7:TCP/IP(图解+秒懂+史上最全) | 8:Feign原理 (图解) |
9:DNS图解(秒懂 + 史上最全 + 高薪必备) | 10:CDN图解(秒懂 + 史上最全 + 高薪必备) |
10: 分布式事务( 图解 + 史上最全 + 吐血推荐 ) |
Java 面试题 30个专题 , 史上最全 , 面试必刷 | 阿里、京东、美团… 随意挑、横着走!!! |
---|---|
1: JVM面试题(史上最强、持续更新、吐血推荐) | 2:Java基础面试题(史上最全、持续更新、吐血推荐 |
3:架构设计面试题 (史上最全、持续更新、吐血推荐) | 4:设计模式面试题 (史上最全、持续更新、吐血推荐) |
17、分布式事务面试题 (史上最全、持续更新、吐血推荐) | 一致性协议 (史上最全) |
29、多线程面试题(史上最全) | 30、HR面经,过五关斩六将后,小心阴沟翻船! |
9.网络协议面试题(史上最全、持续更新、吐血推荐) | 更多专题, 请参见【 疯狂创客圈 高并发 总目录 】 |
SpringCloud 精彩博文 | |
---|---|
nacos 实战(史上最全) | sentinel (史上最全+入门教程) |
SpringCloud gateway (史上最全) | 更多专题, 请参见【 疯狂创客圈 高并发 总目录 】 |
DNS 是什么?
DNS是 Domain Name System 的缩写,也就是 域名解析系统,它的作用非常简单,就是根据域名查出对应的 IP地址。
你可以把它想象成一本巨大的电话本,比如当你要访问域名www.163.com
,首先要通过DNS查出它的IP地址是112.48.162.8
。
为啥需要DNS
NS服务器: 说白了, 就是一台翻译 名字到IP 的 软件。
IP: IP就是IP, 不解释。
下面, 我们来看一下逻辑关系: 假设某设备(充当DNS客户端)需要解析域名a.b.c.d, 于是就可以向DNS服务器发起请求, 然后然后DNS服务器将解析的IP结果w.x.y.z返回给客户端。
由于比较常见, 所以还是复习了一下, 至于为什么需要DNS, 你只要想想你经常使用的www.baidu.com就可以了, 这个可比其ip(http://36.152.44.95/)方便记忆多了。
域名的形式
域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。
如下图所示:
其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名。
国家顶级域名 | 中国:cn, 美国:us,英国uk… |
---|---|
通用顶级域名 | com公司企业,edu教育机构,gov政府部门,int国际组织,mil军事部门 ,net网络,org非盈利组织… |
反向域名 | arpa,用于PTR查询(IP地址转换为域名) |
域名的层级
由于后面我会讲到 DNS 的解析过程,因此需要你对域名的层级有一些了解
- 根域名 :
.root
或者.
,根域名通常是省略的 - 顶级域名,如
.com
,.cn
等 - 次级域名,如
baidu.com
里的baidu
,这个是用户可以进行注册购买的 - 主机域名,比如
baike.baidu.com
里的baike
,这个是用户可分配的
主机名.次级域名.顶级域名.根域名
baike.baidu.com.root
换一种形式展示,如下图所示:
eg :我们熟悉的,www.baidu.com
- com: 一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等。
- baidu: 二级域名,指公司名。
- www: 表示主机域名为 www。
域名是分层结构,域名服务器也是对应的层级结构。
有了域名结构,还需要有一个东西去解析域名,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。
由高向低进行层次划分,可分为以下几大类:
分类 | 作用 |
---|---|
根域名服务器 | 最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助 |
顶级域名服务器 | 负责管理在该顶级域名服务器下注册的二级域名 |
权限域名服务器 | 负责一个区的域名解析工作 |
本地域名服务器 | 当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器 |
注:一个域名服务器所负责的范围,或者说有管理权限的范围,就称为 区域 (Zone)
关于分层, 需要注意的是:
- 每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器
- 每一级域名服务器都知道下级域名服务器的IP地址
- 为了容灾, 每一级至少设置两个或以上的域名服务器
域名的层级有关要点,说明如下:
(1)“www.baidu.com” 的一个最完整的形式应该是 “www.baidu.com.”。
即在每个域名后面会有一个 “.” ,“.” 来表示根,我们统称这种域名叫绝对域名“ Fully Qualified Domain Name ”(FQDN),相当于Linux 系统中的文件绝对路径。可以通过在计算机中输入 “www.baidu.com.” 或 “www.dianrong.com.” 来确认是否可以打开网站。
不需要输入,不代表不存在。
“.” 来表示根,通常我们不需要输入这个根 ,因为计算机和浏览器默认已帮我们输入了这个“.” 根。
(2)域名体系,使用 逆向树 所示,树中的每一个分支,都称为域,一个域名可以属于多个域,如域名 www.baidu.com 属于baidu.com域的一部分,同时也是 com 域的一部分。
(3)“.” 是最树状结构中最顶层的域名,统称为“根”,即每个域名都是由根开始索引的,所有域名都属于根。
(4)域名体系是通过倒着来叙述一个域名,如 www.baidu.com 是先写最下面的 www,在写中间的 baidu ,接着写上面的 com ,最后写 “.” ,只是根可以省略
(5)顶级域名下面的分支是二级域名,即我们平时通过阿里云、腾讯云购买的域名,如 baidu.com 、fastcp.cn 、dianrong.com 等。
(6)二级域名下面的分支为三级域名,有时也可称为服务器名称,如 baidu下面的 www 代表了百度的网站服务名称,music 代表了百度的音乐网站服务器名称。
(7)由根分支出的域名叫 顶域域名(一般简称为 TLD ),一般分为国家地区顶级域名和通用顶级域名。
-
国家顶级域名如我们了解的 cn、jp等。
-
通用顶级域名如我们了解的 com、org、net、edu等,其中表示工商企业的是 .com;表示网络提供商的 .net,表示非盈利组织的 .org ;表示教育的 .edu 。
-
通常我们只能注册二级域名,如果需要注册顶级域名,比如注册类似 .com 这样的域名,在国内需要联系 CNNIC ,由他们进行代理注册,通常价格不菲。大多数情况下,二级域名已经可以完全满足当下的业务需求。
当然三级域名下还可以在分支四级域名出来,DNS 类似于 Unix 文件系统的结构,由根节点在上的反转树表示。最多分分支 127 层,每一层可以由最多 63 个字符组成,每层中间都以 “.” 进行分隔,类似 Unix 文件中以 “/” 分隔每一个目录。域名的总长度不可超过255个字符,仅可使用字符、数字和连字符,不区分大小写。
DNS 资源记录
在 DNS 服务器上,一个域名及其下级域名组成一个区域 (Zone)。一个 Zone的 相关的 DNS 信息构成一个数据库文件。
下面是一条A类型的资源记录(简称为A记录):域名 www.zdns.cn 的数据为 202.173.11.10
记录一条域名信息映射关系,称之为资源记录(RR)。当我们查询域名www.zdns.cn的时候,查询结果得到的资源记录结构体中有如下数据:
-
TTL,就是生存周期,是递归服务器会在缓存中保存该资源记录的时长。
-
网络/协议类型,它的代表的标识是IN,IN就是internet,目前DNS系统主要支持的协议是IN。
-
type,就是资源记录类型,一般的网站都是都是A记录(IPv4的主机地址)。
-
rdata是资源记录数据,就是域名关联的信息数据。
每个区域(Zone)数据库文件都是由资源记录(RR)构成的,一个资源记录就是一行文本,提供了一组有用的 DNS 配置信息。在DNS系统中,最常见的资源记录是Internet类记录,该记录由包含4个字段的数据构成:Name、Value、Type、TTL。其中Name和Value可以理解为一对键值对,但是其具体含义取决于Type的类型,TTL记录了该条记录应当从缓存中删除的时间。
常见的资源记录类型如表所示。
类型 | 编码 | 内容 |
---|---|---|
A | 1 | 将 DNS 域名映射到 IPv4 地址,基本作用是说明一个域名对应了哪些 IPv4 地址 |
NS | 2 | 权威名称服务器记录,用于说明这个区域有哪些 DNS 服务器负责解析 |
CNAME | 5 | 别名记录,主机别名对应的规范名称 |
SOA | 6 | 起始授权机构记录,NS 记录说明了有多台服务器在进行解析,但哪一个才是主服务器,NS 并没有说明,SOA 记录了说明在众多 NS 记录里哪一台才是主要的服务器 |
PTR | 12 | IP 地址反向解析,是 A 记录的逆向记录,作用是把 IP 地址解析为域名 |
MX | 15 | 邮件交换记录,指定负责接收和发送到域中的电子邮件的主机 |
TXT | 16 | 文本资源记录,用来为某个主机名或域名设置的说明 |
AAAA | 28 | 将 DNS 域名映射到 IPv6 地址,基本作用是说明一个域名对应了哪些 IPv6 地址 |
域名解析中,A记录、CNAME、MX记录、NS记录的区别和联系?
联系:
都是区域(Zone)数据库文件都是由资源记录。
A记录: 又称IP指向
用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。
说明:指向的目标主机地址类型只能使用IP地址;
附加说明:
- 泛域名解析即将该域名所有未指定的子域名都指向一个空间。在“主机名”中填入*,“类型”为A,“IP地址/主机名”中填入web服务器的IP地址,点击“新增”按钮即可。
- 负载均衡的实现:负载均衡(Server Load Balancing,SLB)是指在一系列资源上面动态地分布网络负载。负载均衡可以减少网络拥塞,提高整体网络性能,提高自愈性, 并确保企业关键性应用的可用性。
当相同子域名有多个目标地址时,表示轮循,可以达到负载均衡的目的,但需要虚拟主机服务商支持。
CNAME : 通常称别名指向。
您可以为一个主机设置别名。
比如设置 test.mydomain.com,用来指向一个主机www.rddns.com ,那么以后就可以用test.mydomain.com来代替访问www.rddns.com了。
说明:·
- CNAME的目标主机地址只能使用主机名,不能使用IP地址;
- 主机名前不能有任何其他前缀,如:http://等是不被允许的;
- A记录优先于CNAME记录。即如果一个主机地址同时存在A记录和CNAME记录,则CNAME记录不生效。
MX记录 : 邮件交换记录。
用于将以该域名为结尾的电子邮件指向对应的邮件服务器以进行处理。如:用户所用的邮件是以域名mydomain.com为结尾的,则需要在管理界面中添加该域名的MX记录来处理所有以@mydomain.com结尾的邮件。
说明:
- MX记录可以使用主机名或IP地址;
- MX记录可以通过设置优先级实现主辅服务器设置,“优先级”中的数字越小表示级别越高。
- 也可以使用相同优先级达到负载均衡的目的;
- 如果在“主机名”中填入子域名则此MX记录只对该子域名生效。
附加说明:
- 负载均衡服务器负载均衡(Server Load Balancing,SLB)是指在一系列资源上面智能地分布网络负载。负载均衡可以减少网络拥塞,提高整体网络性能,提高自愈性,并确保企业关键性应用的可用性。当域名的MX记录有多个目标地址且优先级相同时,表示轮循,可以达到负载均衡的目的,但需要邮箱服务商支持。
NS记录:指向DNS子域名
服务器解析记录, 用来表明由哪台服务器对该域名进行解析。这里的NS记录只对子域名生效。
例如用户希望由12.34.56.78 这台服务器解析 news.mydomain.com,则需要设置 news.mydomain.com 的NS记录。
说明:
- “优先级”中的数字越小表示级别越高;
- “IP地址/主机名”中既可以填写IP地址,也可以填写像 ns.mydomain.com 这样的主机地址,但必须保证该主机地址有效。
如,将news.mydomain.com的NS记录指向到 ns.mydomain.com,在设置NS记录的同时还需要设置ns.mydomain.com的指向,否则NS记录将无法正常解析;
- NS记录优先于A记录。
即,如果一个主机地址同时存在NS记录和A记录,则A记录不生效。这里的NS记录只对子域名生效。
实战:nslookup 进行IP查看
Nslookup一般是用来确认DNS服务器动作的.
nslookup有多个选择功能用命令行键入nslookup<主机名>执行,即可显示出目标服务器的主机名和对应的IP地址,称之为正向解析.
如果不能使用dig、nslookup,如下:
[root@cdh1 ~]# nslookup www.baidu.com
-bash: nslookup: command not found
报错,命令找不到,是因为新安装的centos7,没有安装bind-utils,安装后就可以运行nslookup了
安装相应软件包
yum install -y bind-utils
命令的基本格式
nslookup domain [dns-server]
1 使用命令 nslookup 域名 查询IP
[root@cdh1 ~]# nslookup www.baidu.com
Server: 10.0.2.3
Address: 10.0.2.3#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 36.152.44.95
Name: www.a.shifen.com
Address: 36.152.44.96
Name: www.a.shifen.com
Address: ::1
结果说明如下:
Server: 10.0.2.3 --->指定的dns服务器
Address: 10.0.2.3#53 ------>指定的dns服务器的IP和端口
Non-authoritative answer: ----->未验证的回答
baidu.com canonical name = www.a.shifen.com. ------->目标域名的规范名称(正名/别名)记录
Name: www.a.shifen.com ------->目标域名
Address: 36.152.44.95 ------->目标返回的Ip
Name: www.a.shifen.com ------->目标域名
Address: 36.152.44.96 ------->目标返回的Ip
Name: www.a.shifen.com
Address: ::1
没有指定DNS服务器,使用默认的本地DNS服务器,保存在 /etc/resolv.conf 配置文件中。
[root@cdh1 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.2.3
2 使用命令 nslookup 域名 dns-server 查询IP
[root@cdh1 ~]# nslookup www.baidu.com 114.114.114.114
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 36.152.44.95
Name: www.a.shifen.com
Address: 36.152.44.96
以上的命令,通过电信DNS 114.114.114.114 查询 www.baidu.com 的IP地址。
3 Non-authoritative answer 的说明
Non-authoritative answer表示解析结果来自非权威服务器,也就是说这个结果来自缓存,并没有完全经历全部的解析过程,从某个缓存中读取的结果,这个结果存在一定的隐患,比如域名对应的IP地址已经更变。
查询其他记录
直接查询返回的是A记录,我们可以指定参数,查询其他记录,比如AAAA、MX等。
nslookup -qt=type domain [dns-server]
其中,type可以是以下这些类型:
- A 地址记录
- AAAA 地址记录
- AFSDB Andrew文件系统数据库服务器记录
- ATMA ATM地址记录
- CNAME 别名记录
- HINFO 硬件配置记录,包括CPU、操作系统信息
- ISDN 域名对应的ISDN号码
- MB 存放指定邮箱的服务器
- MG 邮件组记录
- MINFO 邮件组和邮箱的信息记录
- MR 改名的邮箱记录
- MX 邮件服务器记录
- NS 名字服务器记录
- PTR 反向记录
- RP 负责人记录
- RT 路由穿透记录
- SRV TCP服务器信息记录
- TXT 域名对应的文本信息
- X25 域名对应的X.25地址记录
例如:
[root@localhost ~]# nslookup -qt=mx baidu.com 8.8.8.8
*** Invalid option: qt=mx
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: baidu.com
Address: 111.13.101.208
Name: baidu.com
Address: 123.125.114.144
Name: baidu.com
Address: 180.149.132.47
Name: baidu.com
Address: 220.181.57.217
DNS 解析过程
总体的三大步骤:
1、缓存查找IP
2、本机的hosts文件查找IP
3、DNS服务器查找IP
step1:缓存查找IP
第一步:检查浏览器缓存中是否缓存过该域名对应的IP地址
用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的IP
地址,当用户再次访问的时候,浏览器就会从缓存中查找该域名对应的IP地址.
但是,浏览器的本地缓存,不仅是有大小限制,而且还有时间限制(域名被缓存的时间通过TTL
属性来设置),所以存在域名对应的IP
找不到的情况。
当浏览器从缓存中找到了该网站域名对应的IP
地址,将进行下一步骤。
对于
IP
的缓存时间问题,不宜设置太长的缓存时间,时间太长,如果域名对应的IP
发生变化,那么用户将在一段时间内无法正常访问到网站,如果太短,那么又造成频繁解析域名。
step2:本机的hosts文件查找IP
第二步:如果在浏览器缓存中没有找到IP,那么找本机的hosts文件中是否存在IP配置
如果第一个步骤没有完成对域名的解析过程,那么浏览器会去系统hosts文件中,查找系统是否配置过这个域名对应的IP
地址,可以理解为系统也具备域名配置的基本能力。
-
在
Windows
系统中,hosts
文件位置在C:\\Windows\\System32\\drivers\\etc\\hosts
。 -
在
Linux
或者Mac
系统中,hosts
文件在/etc/hosts
文件中。
对于开发者来说,通过hosts绑定域名和IP
,可以轻松切换环境,可以从测试环境切换到开发环境,方便开发和测试。
step3:DNS服务器查找IP
第三步:向本地域名解析服务系统发起域名解析的请求
如果在本地无法完成域名的解析,那么系统只能请求域名解析服务系统进行解析,本地域名系统LDNS
一般都是本地区的域名服务器。local dns (local name server)是客户端网络设置的一部分,要么是手工配置,要么从DHCP得到。一般local dns 在从网络上靠近客户端。
-
比如你连接的校园网,那么域名解析系统就在你的校园机房里;
-
如果你连接的是电信、移动或者联通的网络,那么本地域名解析服务器就在本地区,由各自的运营商来提供服务。
对于本地DNS
服务器地址,Windows
系统使用命令ipconfig
就可以查看,在Linux
和Mac
系统下,直接使用命令cat /etc/resolv.conf
来查看LDNS
服务地址。
LDNS
一般都缓存了大部分的域名解析的结果,当然缓存时间也受域名失效时间控制,大部分的解析工作到这里就差不多已经结束了,LDNS
负责了大部分的解析工作。
LDNS
解析的总体过程
LDNS
总体过程总结起来就是三句话
- 从"根域名服务器"查到"一级域名服务器"的NS记录和A记录(IP地址)
- 从"一级域名服务器"查到"二级域名服务器"的NS记录和A记录(IP地址)
- 从"二级域名服务器"查出"主机名"的IP地址
DNS 查询类型
从客户端出发,完整的DNS 查找过程中,会出现三种类型的查询。
通过组合使用这些查询,优化的 DNS 解析过程可缩短传输距离。
递归查询
本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机。
在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够直接使用非递归查询。
迭代查询
本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。
迭代查询一般发生在 DNS Server 之间,当 Client 发出域名解析的请求后,DNS Server 需要给予最佳答案,这个最佳答案可能是"距离最近"的顶级域名服务器,也能是权威域名服务器。无论如何,Client 需要对返回结果再次发起请求,知道获得最终结果
非递归查询
可以理解为缓存查找或者一次搞定的查找。
非递归查询发生在 Client 和 DNS Server 之间,指的是,请求的 DNS Server 已经知道答案,直接返回。这里可能有两种情况,一种是 DNS Server 本机缓存了对应的 IP,或者是缓存了对应的域名的权威服务器。第二种情况只需要再发一次请求,即可拿到结果返回
当 DNS 解析器客户端查询 DNS 服务器以获取其有权访问的记录时通常会进行此查询,因为其对该记录具有权威性,或者该记录存在于其缓存内。
DNS 服务器通常会缓存 DNS 记录,查询到来后能够直接返回缓存结果,以防止更多带宽消耗和上游服务器上的负载。
递归查询与迭代查询相结合
从递归和迭代查询可以看出:
客户端-本地dns服务端:
这部分属于递归查询。递归查询时,返回的结果只有两种:查询成功或查询失败.
本地dns服务端—外网:
这部分属于迭代查询。迭代查询,又称作重指引,返回的是最佳的查询点或者主机地址.
详解:DNS 解析过程10个小步骤
-
浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
-
如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。
-
如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
-
如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
-
根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
-
此时LDNS再发送请求给上一步返回的gTLD
-
接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
-
Name Server根据映射关系表找到目标ip,返回给LDNS
-
LDNS缓存这个域名和对应的ip
-
LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
实战:dig 命令查看域名解析过程
什么是dig
dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具。它执行 DNS 搜索,显示从受请求的域名服务器返回的答复。多数 DNS 管理员利用 dig 作为 DNS 问题的故障诊断,因为它灵活性好、易用、输出清晰。虽然通常情况下 dig 使用命令行参数,但它也可以按批处理模式从文件读取搜索请求。不同于早期版本,dig 的 BIND9 实现允许从命令行发出多个查询。除非被告知请求特定域名服务器,dig 将尝试 /etc/resolv.conf 中列举的所有服务器。当未指定任何命令行参数或选项时,dig 将对“.”(根)执行 NS 查询。
语法
dig [@server] [-b address] [-c class] [-f filename] [-k filename] [ -n ][-p port#] [-t type] [-x addr] [-y name:key] [name] [type] [class] [queryopt…]
-b address 设置所要询问地址的源 IP 地址。这必须是主机网络接口上的某一合法的地址。
-c class 缺省查询类(IN for internet)由选项 -c 重设。class 可以是任何合法类,比如查询 Hesiod 记录的 HS 类或查询 CHAOSNET 记录的 CH 类。
-f filename 使 dig 在批处理模式下运行,通过从文件 filename 读取一系列搜索请求加以处理。文件包含许多查询;每行一个。文件中的每一项都应该以和使用命令行接口对 dig 的查询相同的方法来组织。
-h 当使用选项 -h 时,显示一个简短的命令行参数和选项摘要。
-k filename 要签署由 dig 发送的 DNS 查询以及对它们使用事务签名(TSIG)的响应,用选项 -k 指定 TSIG 密钥文件。
-n 缺省情况下,使用 IP6.ARPA 域和 RFC2874 定义的二进制标号搜索 IPv6 地址。为了使用更早的、使用 IP6.INT 域和 nibble 标签的 RFC1886 方法,指定选项 -n(nibble)。
-p port# 如果需要查询一个非标准的端口号,则使用选项 -p。port# 是 dig 将发送其查询的端口号,而不是标准的 DNS 端口号 53。该选项可用于测试已在非标准端口号上配置成侦听查询的域名服务器。
-t type 设置查询类型为 type。可以是 BIND9 支持的任意有效查询类型。缺省查询类型是 A,除非提供 -x 选项来指示一个逆向查询。通过指定 AXFR 的 type 可以请求一个区域传输。当需要增量区域传输(IXFR)时,type 设置为 ixfr=N。增量区域传输将包含自从区域的 SOA 记录中的序列号改为 N 之后对区域所做的更改。
-x addr 逆向查询(将地址映射到名称)可以通过 -x 选项加以简化。 addr 是一个以小数点为界的 IPv4 地址或冒号为界的 IPv6 地址。当使用这个选项时,无需提供 name、class 和 type 参 数。dig 自动运行类似 11.12.13.10.in-addr.arpa 的域名查询,并分别设置查询类型和类为 PTR 和 IN。
-y name: key 您可以通过命令行上的 -y 选项指定 TSIG 密钥;name 是 TSIG 密码的名称,key 是实际的密码。密码是 64 位加密字符 串,通常由 dnssec-keygen(8)生成。当在多用户系统上使用选项 -y 时应该谨慎,因为密码在 ps(1)的输出或 shell 的历史 文件中可能是可见的。当同时使用 dig 和 TSCG 认证时,被查询的名称服务器需要知道密码和解码规则。在 BIND 中,通过提供正确的密码和 named.conf 中的服务器声明实现。
查询选项
dig 提供查询选项号,它影响搜索方式和结果显示。一些在查询请求报头设置或复位标志位,一部分决定显示哪些回复信息,其他的确定超时和重试战略。每个查询选项 被带前缀(+)的关键字标识。一些关键字设置或复位一个选项。通常前缀是求反关键字含义的字符串 no。其他关键字分配各选项的值,比如超时时间间隔。它 们的格式形如 +keyword=value。查询选项是:
+[no]tcp
查询域名服务器时使用 [不使用] TCP。缺省行为是使用 UDP,除非是 AXFR 或 IXFR 请求,才使用 TCP 连接。
+[no]vc
查询名称服务器时使用 [不使用] TCP。+[no]tcp 的备用语法提供了向下兼容。vc 代表虚电路。
+[no]ignore
忽略 UDP 响应的中断,而不是用 TCP 重试。缺省情况运行 TCP 重试。
+domain=somename
设定包含单个域 somename 的搜索列表,好像被 /etc/resolv.conf 中的域伪指令指定,并且启用搜索列表处理,好像给定了 +search 选项。
+[no]search
使用 [不使用] 搜索列表或 resolv.conf 中的域伪指令(如果有的话)定义的搜索列表。缺省情况不使用搜索列表。
+[no]defname
不建议看作 +[no]search 的同义词。
+[no]aaonly
该选项不做任何事。它用来提供对设置成未实现解析器标志的 dig 的旧版本的兼容性。
+[no]adflag
在查询中设置 [不设置] AD(真实数据)位。目前 AD 位只在响应中有标准含义,而查询中没有,但是出于完整性考虑在查询中这种性能可以设置。
+[no]cdflag
在查询中设置 [不设置] CD(检查禁用)位。它请求服务器不运行响应信息的 DNSSEC 合法性。
+[no]recursive
切换查询中的 RD(要求递归)位设置。在缺省情况下设置该位,也就是说 dig 正常情形下发送递归查询。当使用查询选项 +nssearch 或 +trace 时,递归自动禁用。
+[no]nssearch
这个选项被设置时,dig 试图寻找包含待搜名称的网段的权威域名服务器,并显示网段中每台域名服务器的 SOA 记录。
+[no]trace
切换为待查询名称从根名称服务器开始的代理路径跟踪。缺省情况不使用跟踪。一旦启用跟踪,dig 使用迭代查询解析待查询名称。它将按照从根服务器的参照,显示来自每台使用解析查询的服务器的应答。
+[no]cmd
设定在输出中显示指出 dig 版本及其所用的查询选项的初始注释。缺省情况下显示注释。
+[no]short
提供简要答复。缺省值是以冗长格式显示答复信息。
+[no]identify
当启用 +short 选项时,显示 [或不显示] 提供应答的 IP 地址和端口号。如果请求简短格式应答,缺省情况不显示提供应答的服务器的源地址和端口号。
+[no]comments
切换输出中的注释行显示。缺省值是显示注释。
+[no]stats
该查询选项设定显示统计信息:查询进行时,应答的大小等等。缺省显示查询统计信息。
+[no]qr
显示 [不显示] 发送的查询请求。缺省不显示。
+[no]question
当返回应答时,显示 [不显示] 查询请求的问题部分。缺省作为注释显示问题部分。
+[no]answer
显示 [不显示] 应答的回答部分。缺省显示。
+[no]authority
显示 [不显示] 应答的权限部分。缺省显示。
+[no]additional
显示 [不显示] 应答的附加部分。缺省显示。
+[no]all
设置或清除所有显示标志。
+time=T
为查询设置超时时间为 T 秒。缺省是 5 秒。如果将 T 设置为小于 1 的数,则以 1 秒作为查询超时时间。
+tries=A
设置向服务器发送 UDP 查询请求的重试次数为 A,代替缺省的 3 次。如果把 A 小于或等于 0,则采用 1 为重试次数。
+ndots=D
出 于完全考虑,设置必须出现在名称 D 的点数。缺省值是使用在 /etc/resolv.conf 中的 ndots 语句定义的,或者是 1,如果没有 ndots 语句的话。带更少点数的名称被解释为相对名称,并通过搜索列表中的域或文件 /etc/resolv.conf 中的域伪指令进行搜索。
+bufsize=B
设置使用 EDNS0 的 UDP 消息缓冲区大小为 B 字节。缓冲区的最大值和最小值分别为 65535 和 0。超出这个范围的值自动舍入到最近的有效值。
+[no]multiline
以详细的多行格式显示类似 SOA 的记录,并附带可读注释。缺省值是每单个行上显示一条记录,以便于计算机解析 dig 的输出。
dig最基本的使用方式就是
dig
即查询域名的A记录,查询的dns服务器将采用系统配置的服务器,即/etc/resovle.conf 中的。
如果要查询其他类型的记录,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可
dig mx
dig ns
另外一个重要的功能是+trace参数,使用这个参数之后将显示从根域逐级查询的过程
dig a +trace
实战: dig查看 www.baidu.com 解析过程
如果需要浏览全部的解析过程,那么可以使用dig
命令来查看解析过程。以 www.baidu.com 为例。
总的过程记录
第一步:根DNS 服务器获取
从本地DNS
域名解析服务器获取到13
个根DNS
域名服务器(.)
对应的主机名。
第二步:一级(或者顶级)DNS 服务器获取
从13
个根域名服务器中的其中一个(这里是h.root-servers.net
)获取到顶级com.
的服务器IP
(未显示)和名称。
第三步:二级(或者顶级)DNS 服务器获取
向com.
域的一台服务器192.43.172.30(i.gtld-servers.net)
请求解析,它返回了baidu.com
域的服务器IP
(未显示)和名称,百度有四台顶级域的服务器。
第四步:三级(或者顶级)DNS 服务器获取
向百度的顶级域服务器220.181.37.10(ns3.baidu.com)
请求www.baidu.com
,它发现这个www
有个别名,而不是一台主机,别名是www.a.shifen.com
。
一般情况下,DNS
解析到别名就停止了,返回了具体的IP
地址
如果想看到具体的IP
地址,可以进一步对别名进行解析,解析结果如下:
这时候看到最后的解析结果是180.97.33.107
和180.97.33.108
。在解析别名的过程中,可以发现shifen.com
和baidu.com
都是指定了相同的域名解析服务器。以上是一个域名的解析过程,最后的解析结果和一开始的使用nslookup
的结果一致。
DNS协议原理与实战
后面我将使用 wireshark 抓取 DNS 的数据包,但是在开始之前 ,得先了解一下 DNS 的报文结构
DNS 的报文结构
整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。
事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。
Transaction ID
请求和应答的事务ID应当是一个:0xd0d7
Flags
标志字段里的内容比较多,每个字段的含义如下
- QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
- Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
- AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
- TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
- RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
- RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
- Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
- rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
Answer RRs
回答资源记录数,在应答包里为 2,说明返回了两条查询结果,你可以在 Answer 字段里看到。
Authority RRs
权威名称服务器计数
Additionnal RRs
附加资源记录数
Answers
应答的主要内容,这里返回两条结果,每条结果里的字段有
基础结构部分
DNS 报文的基础结构部分指的是报文首部,如图所示。
该部分中每个字段含义如下。
- 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
- 标志:DNS 报文中的标志字段。
- 问题计数:DNS 查询请求的数目。
- 回答资源记录数:DNS 响应的数目。
- 权威名称服务器计数:权威名称服务器的数目。
- 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。
基础结构部分中的标志字段又分为若干个字段,如图所示。
标志字段中每个字段的含义如下:
- QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
- Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
- AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
- TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
- RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
- RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
- Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
- rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
为了能够更好地了解 DNS 数据包的基础结构部分,下面通过捕获的 DNS 数据包查看基础结构部分。
图中的数据包为 DNS 请求包,Domain Name System(query) 部分方框标注中的信息为 DNS 报文中的基础结构部分。
Domain Name System (query)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x0000 Standard query #报文中的标志字段
0... .... .... .... = Response: Message is a query
#QR字段, 值为0, 因为是一个请求包
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段, 值为0, 因为是标准查询
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...0 .... .... = Recursion desired: Don't do query recursively
#RD字段
.... .... .0.. .... = Z: reserved (0) #保留字段, 值为0
.... .... ...0 .... = Non-authenticated data: Unacceptable
#保留字段, 值为0
Questions: 1 #问题计数, 这里有1个问题
Answer RRs: 0 #回答资源记录数
Authority RRs: 0 #权威名称服务器计数
Additional RRs: 0 #附加资源记录数
以上输出信息显示了 DNS 请求报文中基础结构部分中包含的字段以及对应的值。这里需要注意的是,在请求中 Questions 的值不可能为 0;Answer RRs,Authority RRs,Additional RRs 的值都为 0,因为在请求中还没有响应的查询结果信息。这些信息在响应包中会有相应的值。
图中方框标注部分为响应包中基础结构部分,每个字段如下:
Domain Name System (response)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x8180 Standard query response, No error #报文中的标志字段
1... .... .... .... = Response: Message is a response
#QR字段, 值为1, 因为是一个响应包
.000 0... .... .... = Opcode: Standard query (0) # Opcode字段
.... .0.. .... .... = Authoritative: Server is not an authority for
domain #AA字段
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...1 .... .... = Recursion desired: Do query recursively
#RD字段
.... .... 1... .... = Recursion available: Server can do recursive
queries #RA字段
.... .... .0.. .... = Z: reserved (0)
.... .... ..0. .... = Answer authenticated: Answer/authority portion
was not authenticated by the server
.... .... ...0 .... = Non-authenticated data: Unacceptable
.... .... .... 0000 = Reply code: No error (0) #返回码字段
Questions: 1
Answer RRs: 2
Authority RRs: 5
Additional RRs: 5
以上输出信息中加粗部分为 DNS 响应包比请求包中多出来的字段信息,这些字段信息只能出现在响应包中。在输出信息最后可以看到 Answer RRs,Authority RRs,Additional RRs 都有了相应的值(不一定全为 0)。
问题部分
问题部分指的是报文格式中查询问题区域(Queries)部分。
该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。
该部分中每个字段含义如下:
- 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询。
- 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
- 查询类:地址类型,通常为互联网地址,值为 1。
- DNS 请求包的问题部分字段信息,如图所示。
在下图中,Queries 部分的信息为问题部分信息,每个字段说明如下: 其中,可以看到 DNS 请求类型为 A,那么得到的响应信息也应该为 A 类型。
从图中 Queries 部分中可以看到,响应包中的查询类型也是 A,与请求包的查询类型是一致的。
资源记录部分
资源记录部分是指 DNS 报文格式中的最后三个字段,包括:
- 回答问题区域字段、
- 权威名称服务器区域字段、
- 附加信息区域字段。
这三个字段均采用一种称为资源记录的格式,格式如图所示。
资源记录格式中每个字段含义如下:
- 域名:DNS 请求的域名。
- 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
- 类:地址类型,与问题部分中的查询类值是一样的。
- 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
- 资源数据长度:资源数据的长度。
- 资源数据:表示按查询段要求返回的相关资源记录的数据。
资源记录部分只有在 DNS 响应包中才会出现。下面通过 DNS 响应包来进一步了解资源记录部分的字段信息。
其中,方框中标注的信息为 DNS 响应报文的资源记录部分信息。
该部分信息主要分为三部分信息,即回答问题区域、权威名称服务器区域、附加信息区域,下面依次分析这三部分信息。
回答问题区域
Answers #“回答问题区域”字段
baidu.com: type A, class IN, addr 220.181.57.216 #资源记录部分
Name: baidu.com #域名字段, 这里请求的域名为baidu.com
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001) #类字段
Time to live: 5 #生存时间
Data length: 4 #数据长度
Address: 220.181.57.216 #资源数据, 这里为IP地址
baidu.com: type A, class IN, addr 123.125.115.110 #资源记录部分
Name: baidu.com
Type: A (Host Address) (1)
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 123.125.115.110
其中,Name 的值为 baidu.com,表示 DNS 请求的域名为 baidu.com;类型为 A,表示要获取该域名对应的 IP 地址。Address 的值显示了该域名对应的 IP 地址。
这里获取到了 2 个 IP 地址,分别为 220.181.57.216 和 123.125.115.110。
权威名 以上是关于DNS图解(秒懂 + 史上最全)的主要内容,如果未能解决你的问题,请参考以下文章