DNS原理篇01-DNS原理介绍

本文最后更新于:April 17, 2020 am

本文主要包括DNS的简单介绍,DNS查询的原理介绍和DNS负载均衡应用的简单介绍。

1、DNS简介

1.1 什么是DNS

首先我们来了解DNS是什么。下面引用维基百科的解释:

域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

我们知道计算机网络中的通信实际上是需要通过IP来进行的,但是让使用者记住那么多复杂无规律的IP地址是不现实的,因此人们发明了域名,使用者只需要记住域名,然后通过域名即可访问对应的网站,而DNS就是负责将我们平时使用的域名如163.com、google.com等解析成对应的IP地址,然后让客户端和该IP地址进行通信的这样一个系统。

上面的维基百科说DNS是一个分布式的数据库其实也是合理的,因为DNS主要的功能就是存储着各类域名和对应的IP地址,DNS请求可以理解成查询数据库的操作。而因为DNS需要给全球所有上网的用户频繁使用,因此它必须是分布式(地域广)、高并发(请求多)、高可用(重要性高)的一个系统。

1.2 DNS解析类型

DNS的解析类型其实也有很多种,我们比较常接触到的就是A类和CNAME,当然现在IPv6开始普及了也就有AAAA类(相当于IPv6版的A类)。

  • A-将域名指向一个IPV4地址

    比如将wikipedia.org这个域名解析到103.102.166.224这个IPv4地址;

  • CNAME-将域名指向另外一个域名

    比如将wikipedia.org这个域名解析到wikipedia.org.cn

  • AAAA-将域名指向一个IPV6地址

    比如将wikipedia.org这个域名解析到2001:df2:e500:ed1a::1这个IPv6地址;

  • NS-将子域名指定其他DNS服务器解析

    比如你在阿里云购买的域名,但是想要使用网易云来提供DNS解析服务,那就添加一个NS记录,将记录值设置成网易云的DNS服务器域名;

  • MX-将域名指向邮件服务器地址

    设置邮箱时,让邮箱能收到邮件,就需要添加 MX 记录。MX全称为mail exchanger,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当有人发邮件给wikipediauser@wikipedia.org时,系统将对wikipedia.org进行DNS中的MX记录解析。如果MX记录存在,系统就根据MX记录的优先级,将邮件转发到与该MX相应的邮件服务器上。

  • TXT-文本长度限制一般为255,通常做SPF记录(反垃圾邮件)

    SPF是 Sender Policy Framework 的缩写,一种以IP地址认证电子邮件发件人身份的技术。接收邮件方会首先检查域名的SPF记录,来确定发件人的IP地址是否被包含在SPF记录里面,如果在,就认为是一封正确的邮件,否则会认为是一封伪造的邮件进行退回。

  • CAA-CA证书颁发机构授权校验

    CAA(Certificate Authority Authorization),即证书颁发机构授权。是一项新的可以添加到DNS记录中的额外字段,通过DNS机制创建CAA资源记录,可以限定域名颁发的证书和CA(证书颁发机构)之间的联系。未经授权的第三方尝试通过其他CA注册获取用于该域名的SSL/TLS证书将被拒绝。

    域名设置 CAA 记录,使网站所有者,可授权指定CA机构为自己的域名颁发证书,以防止HTTPS证书错误签发,从而提高网站安全性。

其他的还有诸如SRV、显性/隐性URL等解析,具体可以查看对应的域名供应商提供的DNS解析服务说明文档。

2、DNS查询过程

2.1 DNS服务器类型

DNS服务器一般分三种,根DNS服务器,顶级DNS服务器,权威DNS服务器。

  • 根DNS服务器是最高层次的DNS服务器,全球共有13套,它并不提供直接的DNS域名解析服务,而是负责将对应的顶级域名DNS服务器的地址返回给查询的客户端

  • 顶级域名top level domain,简写为 TLD),即对应图中第二层的顶级DNS服务器负责的顶级域名,同样的,顶级域名服务器也不提供直接的DNS域名解析服务,而是负责将对应的权威域名服务器返回给查询的客户端

  • 权威DNS服务器为图中的第三层,这时候权威DNS服务器会返回对应域名的IP地址,客户端拿到了IP地址就可以进行访问了。

那么图中的第四层example.wikipedia.orgwikipedia.org的子域名,也可以叫做二级域名,第五层www.example.wikipedia.org是第四层example.wikipedia.org的子域名,也可以叫做三级域名,以此类推。

2.2 DNS请求过程

接下来我们以访问维基百科(wikipedia.org)为例,对应下图进行解析:

  1. 首先客户端发送请求需要访问wikipedia.org,然后第一步是访问本地的DNS缓存;
  2. 本地的DNS缓存会读取系统下对应的hosts文件,也就是Linux下的/etc/hosts或Windows下的C:\Windows\System32\drivers\etc\hsots,如果这里面定义了wikipedia.org这个域名对应的IP地址,则直接访问这个IP,就没有后面什么事儿了;
  3. 如果本地的缓存文件没有记录,那么客户端就会发送请求到本地DNS服务器,一般来说会是ISP默认提供的DNS服务器,当然我们也可以手动指定成第三方的DNS服务器。本地DNS服务器查询服务器内的记录,如果有则直接返回记录给客户端;
  4. 如果本地DNS服务器没有记录,那么就会访问根域名服务器,询问wikipedia.org对应的顶级域名服务器的地址;
  5. 根域名服务器根据请求判断出是访问.org域名的请求,就会给客户端返回.org顶级域名服务器地址;
  6. 本地DNS服务器获取到地址之后,发送请求给.org顶级域名服务器,询问wikipedia.org对应的权威域名服务器的地址;
  7. .org顶级域名服务器给客户端返回了wikipedia.org权威域名服务器的地址;
  8. 本地DNS服务器获取到地址之后,发送请求给wikipedia.org权威域名服务器,询问wikipedia.org的IP地址;
  9. wikipedia.org权威域名服务器本地DNS服务器返回了wikipedia.org的IP地址;
  10. 本地DNS服务器给客户端返回了wikipedia.org的IP地址,客户端和这个IP建立连接,开始传输数据,该次DNS请求结束。

实际上上面的是最长的DNS查询情况,因为一般情况下我们的DNS本地服务器就会存着对应的DNS缓存记录,这样在DNS查询的时候直接就可以返回本地的缓存给客户端,从而避免了后面的递归查询。

那么要是我们修改了域名的DNS解析记录呢?比如wikipedia.org的IP地址从103.102.166.224修改成103.102.166.225,这就涉及到解析生效的时间问题,也就是所谓的TTL,解析生效时间取决于本地DNS缓存的解析记录的TTL到期时间,一般默认为10分钟。例如解析记录设置的TTL值为 10 分钟,则理论上全球解析生效时间需要10分钟;解析记录设置的TTL值为60秒,则理论上全球解析生效时间需要60秒。

3、DNS的用途

我们已经知道DNS最基本也是最重要的作用就是进行域名和IP地址之间对应关系的记录和查询,除此之外,DNS还可以用作负载均衡。

首先我们要知道,域名和IP并不是一对一的关系,而是多对多的关系。也就是说一个IP可以绑定多个域名,一个域名也可以解析到多个IP。有了这个特性,我们就可以利用DNS来实现负载均衡。

注意负载均衡并非只有DNS这一种方式

3.1 内部负载均衡(SLB)

例如,一个应用要访问数据库,在这个应用里面应该配置这个数据库的IP地址,还是应该配置这个数据库的域名呢?显然应该配置域名,因为一旦这个数据库,因为某种原因,换到了另外一台机器上,而如果有多个应用都配置了这台数据库的话,一换IP地址,就需要将这些应用全部修改一遍。但是如果配置了域名,则只要在DNS服务器里,将域名映射为新的IP地址,这个工作就完成了,大大简化了运维。

在这个基础上,我们可以再进一步。例如,某个应用要访问另外一个应用,如果配置另外一个应用的IP地址,那么这个访问就是一对一的。但是当被访问的应用撑不住的时候,我们其实可以部署多个。但是,访问它的应用,如何在多个之间进行负载均衡?只要配置成为域名就可以了。在域名解析的时候,我们只要配置策略,这次返回第一个IP,下次返回第二个IP,就可以实现负载均衡了。

3.2 全局负载均衡(GSLB)

还是刚刚上面的那个图,我们加入了GSLB1和GSLB2在权威域名服务器后面,权威服务器之前的访问过程和上面提到的DNS请求过程一样,这里我们还是以访问维基百科(wikipedia.org)为例。

  • 我们先对维基百科(wikipedia.org)做一个CNAME解析,让它解析到glsb.wikipedia.org这个GSLB1服务器;
  • 客户端请求到权威域名服务器之后,获得了一个glsb.wikipedia.org的地址,然后客户端就访问glsb.wikipedia.org这个服务器,注意这个时候glsb.wikipedia.org应该是充当了权威域名服务器的角色;
  • glsb.wikipedia.org接受到请求之后,可以根据来源的IP判断是哪个地区的请求,假设是中国,那就给它返回一个cn.glsb.wikipedia.org的GSLB2的服务器地址;
  • GSLB2根据接受到的请求,返回一个离客户端最近服务器的IP地址,从而实现了GSLB的效果。

GSLB和我们常说的LVS、NGINX负载均衡等方式的一个比较大的不同就是在覆盖范围特别广的时候使用效果会更好一些。比如在中国的服务器业务,要扩展到美国,假设业务的访问量翻倍,要增加一倍的机器,可以选择在原有的集群上增加一倍的机器,或者在美国再部署一套同样的服务器,然后配置DNS的GSLB服务器来实现。显然后者的效果会更好,因为美国的用户访问中国的服务器在速度上肯定是没有访问美国的服务器快。

这里只是打一个不太恰当的比喻,实际上访问量翻倍肯定没这么简单。但是在这种跨地域的负载均衡策略上,DNS的GSLB是一个不错的选择。