DNS解析基础知识

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

本文系马哥Linux学习笔记整理而成

DNSDomain Name Service即域名解析服务;这是一种具体的应用协议,它也是C/S架构,默认端口是53/UDP53/TCP

  • 比如www.google.com这就是FQDNFull Qualified Domain Name,完全限定域名)

DNS解析其实就是一种名称转换,即将域名转换为IP访问,因为人类容易记住的是名字而不是数字!所以才有了DNS解析!


1、DNS解析的历史

Hosts文件年代

当初网络规模很小的时候,内核开发商为操作系统想出了hosts文件,即在文件里面填入域名和对应IP即可访问,但是当网络规模越来越大的时候,这就不适合了!

​ 因此,有组织专门做了一台hosts服务器,如果有web等服务器需要向外面提供服务得向它注册,然后它就会在它的服务器的hosts文件里添加一条记录,用户只需要下载它的最新版hosts文件即可!还是那句话,当网络规模越来越庞大的时候,可能一天有成千上万台服务器注册,它就得更新成千上万次,用户也得跟着更新成千上万次,这很明显不适合!

​ 因此发展到现在,DNS解析服务器是非常典型的分布式数据库系统,DNS使用倒装树结构,层次化管理,根域-顶级域(top level domainTLD)-子域;最上面是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.png

简单说分两段流程

  • 第一段是客户端向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.SOAstart of authority,起始授权记录;表明一个区域解析库有且只能有一个SOA记录,而且必须放在第一条

2.NSname service,域名解析服务记录;一个区域解析库可以有多条NS记录;其中一个为主,其余为副

3.Aaddress,地址记录,从FQDN --> IPIPv4记录

4.AAAA:同上,从FQDN --> IPv6

5.CNAMEcanonical name,别名记录;类似大多数人小时候都有个小名一样!

6.PTRpointer指针,从IP --> FQDN,指针记录即反向解析

7.MXmail exchange,邮件交换器,大部分规模稍大点的公司基本都有;这个可以有多个,不过跟路由表一样有优先级

  • 优先级:0-99,数字越小优先级越高
4、资源记录的定义格式:
  • 语法格式:name名称 [TTL]缓存时间可省略 IN关键字 RR_TYPE资源类型 value值;
  • 根据name查找value值,中间都是辅助

解释一下其中一部分:

  • name:当前区域的名字,例如sanxi.info,或者反向解析假设是2.3.4.in-addr.arpa
  • value:有多部份组成
  • 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 否定答案生存时间
)

世间微尘里 独爱茶酒中