本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
本文系马哥Linux学习笔记整理而成
DNS
:Domain Name Service
即域名解析服务;这是一种具体的应用协议,它也是C/S
架构,默认端口是53/UDP
和53/TCP
- 比如
www.google.com
这就是FQDN
(Full Qualified Domain Name
,完全限定域名)
DNS
解析其实就是一种名称转换,即将域名转换为IP
访问,因为人类容易记住的是名字而不是数字!所以才有了DNS
解析!
1、DNS解析的历史
Hosts文件年代
当初网络规模很小的时候,内核开发商为操作系统想出了hosts
文件,即在文件里面填入域名和对应IP
即可访问,但是当网络规模越来越大的时候,这就不适合了!
因此,有组织专门做了一台hosts
服务器,如果有web等服务器需要向外面提供服务得向它注册,然后它就会在它的服务器的hosts文件里添加一条记录,用户只需要下载它的最新版hosts
文件即可!还是那句话,当网络规模越来越庞大的时候,可能一天有成千上万台服务器注册,它就得更新成千上万次,用户也得跟着更新成千上万次,这很明显不适合!
因此发展到现在,DNS
解析服务器是非常典型的分布式数据库系统,DNS
使用倒装树结构,层次化管理,根域-顶级域(top level domain
,TLD
)-子域;最上面是13
台根服务器,根下面分很多顶级域如.com
.info
.net
诸如此类,后面因为各国的实际需求,又增加了国家地区域,比如.cn
.hk
之类,这也是顶级域
hosts
文件相当于一个数据库文件,存放着主机名、IP
、别名等对应信息,但是随着互联网规模增大这种方式不足以满足需求,刚开始INIA
专门处理该文件,只需要下载该文件覆盖即可;后来干脆做一台主机专门处理,因此增加一层,催生了库调用getipbyhostname()
,系统开发商在内核写入此功能,当hosts
文件不存在对应记录时,内核调用接口向DNS
服务商发起解析请求!
2、DNS是如何解析的?
上面提到的库调用充当DNS
客户端的角色向DNS
服务器发起请求,服务器收到请求后查找本地数据库,服务器将结果反馈给客户端,客户端拿到地址后去访问真正的目的地!
当拿到真正目的地IP等信息后,下次访问呢?是不是又要再次发起解析请求?这谁顶得住!
因为有了缓存机制(cache
):即当DNS
服务器可以设置缓存生存时间(TTL
),客户端取得IP
后在有效时间内可以直接访问对应IP
,当有效时间过期后重新发起解析请求即可,这就相当于加速了访问!
举个例子吧!比如我在广州请求sanxi.info
的真实IP
地址,我先向我的DNS
服务器发起请求,DNS
服务器转到运营商,运营商提交给根域,根域通过后缀反馈给客户端属派顶级域 顶级域再反馈回子域,子域的DNS
服务器找到对应的域名的IP
并返回我的DNS运营商,然后上游服务器会将这个信息记录下来当作缓存再反馈给我,最后我得到IP
后直接访问sanxi.info!可能有点绕,我画了一张图来简单说明其过程!
简单说分两段流程
- 第一段是客户端向
DNS
服务器发起请求,这叫递归查询,即我不知道你帮我查下去,类似甲方(手动狗头) - 第二段是
DNS
运营商帮你在互联网上找人,这叫迭代查询,绝大部分情况下是这样,除非你的上游服务器能负责域内的域名解析
既然域名解析是从名称解析为
IP
地址,那么能不能反过来呢?从IP
解析到域名?
当然可以了!
DNS
解析方式可以有两种
-
正向解析:名称 -->
IP
-
反向解析:
IP
--> 名称 前面一直说的是正向解析,但是反向解析不一样。因为正向解析是域名,反向解析是
IP
地址,它是根据IP
段区分,比如11.23.34.56
,因为正向解析是比如www.google.com
,是倒状解析,因此IP
解析也是跟着反过来,是``34.23.11.in-addr.arpa,至于后面的英文是类似根域.点一样是最顶层的组织名称,
56是在
34.23.11`的库里面的主机
3、域名如何注册与使用?
想要使用域名就得向INIA
组织注册域名,但是跟思科华为一样,不可能有那么多精力负责全球范围内的服务,因此它们都是委派代理商进行注册服务,比如国内的各大云服务商等等!
再比如sanxi.info.
就是一个域,我注册完后,正常情况下我需要一台主机来使用它,不然你买来干嘛!它就是我的DNS
服务器,我需要在上面装DNS
服务器和数据库,记录域内其它主机!
但是买一个域名还得配套这么设施 对于个人或者小公司来讲代价有点高,有没有折中方案呢?因此代理商又出现了 他来提供解析服务器帮我们解析,那他不用赚钱良心服务?搞一台服务器解析大量域名不就得了,又不是只为我们几个人提供服务!就好比酒店开房一样。
因此代理商提供web
服务,提供简洁的接口给我们操作,然后提交通过中间的程序提交到他们的服务器。
既然有了DNS
服务器,为了提供可用性,就需要冗余,因此DNS
服务器也有主辅之分!就跟企业或者政府机构里面正副管理一样
- 主
DNS
服务器:维护所负责解析的域中的数据库的服务器;有读写权限; - 辅助
DNS
服务器:从主DNS
服务器那里或其它的从DNS
服务器那里“复制”一份解析数据;但只能进行读操作;
“复制”操作的内容:
- 序列号
serial
:也就是数据库的版本号;当主服务器数据库内容发生变化时,其版本号递增 - 刷新时间间隔
refresh
:辅助服务器每隔多久时间到主服务器检查序列号 - 重试时间间隔
retry
:辅助服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔 - 过期时长
expire
:辅助服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务 - 不存在对应域名时的拒绝答案的缓存时长
那主服务器“通知”辅助服务器随时更新数据的是怎么传送的?
-
区域全量传送
axfr
:传送完整的数据库;小规模时还好,规模大的话非常不现实; -
区域增量传递
ixfr
:仅传送有变化的数据;这种数据量就小得多了,只需要第一次传送时传递整个数据库上面说的区域(
zone
)传送的区域其实就跟ISO
七层模型一样是一种概念,而域(domain
)是真实存在的,比如域解析库的数据库文件一样!
域数据库文件记录的有以下内容:
- 资源记录:
resource record
,简称RR
- 常见的记录类型有:
A
,AAAA
,PTR
,SOA
,NS
,CNAME
,MX
1.SOA
:start of authority
,起始授权记录;表明一个区域解析库有且只能有一个SOA
记录,而且必须放在第一条
2.NS
:name service
,域名解析服务记录;一个区域解析库可以有多条NS
记录;其中一个为主,其余为副
3.A
:address
,地址记录,从FQDN
--> IP
的IPv4
记录
4.AAAA
:同上,从FQDN
--> IPv6
5.CNAME
:canonical name
,别名记录;类似大多数人小时候都有个小名一样!
6.PTR
:pointer
指针,从IP
--> FQDN
,指针记录即反向解析
7.MX
:mail exchange
,邮件交换器,大部分规模稍大点的公司基本都有;这个可以有多个,不过跟路由表一样有优先级
- 优先级:
0
-99
,数字越小优先级越高
4、资源记录的定义格式:
- 语法格式:name名称 [TTL]缓存时间可省略 IN关键字 RR_TYPE资源类型 value值;
- 根据
name
查找value
值,中间都是辅助
解释一下其中一部分:
name
:当前区域的名字,例如sanxi.info
,或者反向解析假设是2.3.4.in-addr.arpavalue
:有多部份组成- 1)当前区域的区域名称(也可以使用主
DNS
服务器名称) - 2)当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代
- 3)(主从服务协调属性的定义以及否定答案的
TTL
)
例如:
sanxi.info. 86400 IN SOA sanxi.info admin.magedu.com. (
2020010801 ;即serial
2H ;refresh刷新
10M ;retry重试时间
1W ;expire过期时间
1D ;negative answer ttl 否定答案生存时间
)