DNS简介

2022-02-12 ⏳5.0分钟(2.0千字)

我们平时上网使用域名,比如小站的域名是taoshu.in。但计算机在通信的时候需要用到IP地址。但是IP地址不方便记忆和使用,于是人们发名了域名系统,英文是 Domain Name System,简写为DNS。DNS最核心的功能就是保存域名跟IP地址的映射关系。今天就介绍一下DNS的工作原理。

在DNS中,最核心的概念是域名。域名是一种分层组织信息的方式,有点类似计算机的文件夹。以 Windws 系统为例,用户 Demo 的桌面所在的路径是C:\Users\Demo\Desktop。最开始的C:表示在C盘,这是最顶层。然后用反斜杠分割,每一层表示一个文件夹。所以桌面上的文件都保存在C盘下的Users文件夹下的Demo文件夹下的Desktop文件夹。

文件夹的组织方式有如下特点:

把C盘换成根,把反斜杠换成点,再把文件夹路径倒过来写,就成了域名。我们以www.taoshu.in为例分析域名的结构。其实这个域名在DNS系统中应该写成www.taoshu.in.,只是在实际使用中可以省略最后面的.。我们从右向左看。

所有的域名都是根域名的子域名。根域名就是最后省略的句点.。如果我们把根域名想象成C盘,那所有的域名都是C盘下的文件夹。以根域名下的直接子域名也叫顶级域名,常用的有com./net./org.等,这一类叫通用顶级域名(Top Level Domain, TLD)。随着互联网的发展,管理机构又给各国分配所谓的国家代码顶级域名(Country Code top-level domain),简称 ccTLD。TLD由国际互联网组织管理,ccTLD由各主权国家自行管理。我国的ccTLD就是cn.。在选域名的时候,一般选用TLD,比如com.。如果没有合适的,或者业务是面向某一特定国家,也可以选择ccTLD。当然,也有一些ccTLD有特殊含义,使用非常多,比如.io/.tv/.ai等。像是本站,就选用了印度的ccTLD域名in.,取乐在其中之义。

我们平时注册的域名都在顶级域名下面,也叫一级域名。比如本着taoshu.in.就是in.下面的一级域名。对于ccTLD而言,也有两层的一级域名,比如com.cn。虽然example.com.cn包含三部分,但仍然是一级域名。

一旦注册了一域名,我们就可以根据自己的实际情况设置二级或者更深层级的域名,比如wwww.taoshu.in.就是表示用于提供 web 服务的二级域名。如果我们想提供邮件服务,可以设置mail.taoshu.in.

DNS是一个分布式系统,每一层只管自己直接子域名,不管子域名的子域名。以根域名.为例,它的直接子域名就是像com./net./org.这样的顶级域名。所以根域名的服务器上只保存顶级域名DNS服务器的IP地址。这种数据也叫NS记录。保存数据的文件通常叫做 zone。截止到今天,根域名服务器有1489条顶级域名记录

其他顶级域名的信息都由各自在服务器管理。比如in.下所有一级域名的记录都由印度的国家域名服务器管理,我们可以通过drill命令查看:

➜ dns drill NS in.
in. 1268 IN NS ns1.registry.in.
in. 1268 IN NS ns2.registry.in.
in. 1268 IN NS ns3.registry.in.
in. 1268 IN NS ns4.registry.in.
in. 1268 IN NS ns5.registry.in.
in. 1268 IN NS ns6.registry.in.

所谓的注册域名,就是获得在上一级域名服务器写入记录的权利。比如我注册了taoshu.in.域名并支持费用,那么我就可以在in.的域名系统中写入taoshu.in.的相关信息,并指定该域名的DNS服务器。我现在用 Cloudflare 解析:

➜ dns drill NS taoshu.in.
taoshu.in. 3090 IN NS earl.ns.cloudflare.com.
taoshu.in. 3090 IN NS mona.ns.cloudflare.com.

这里可以看到两台 Cloudflare 的服务器。一旦将taoshu.in.的NS记录写入in.的服务器,后续的管理工作就都可以在 Cloudflare 后台完成了。

以上就是域名的结构以及跟DNS服务器的关系。那怎么才能通过域名查到对应的IP地址呢?下面我们就来分析查询的过程。

整个DNS系统分成三个部分:

我们在上文说的服务器都是权威服务器。所谓的权威就是保存最终数据,所有DNS解析结果都以权威服务器上的数据为准。

代理服务器并不是一台真正的服务器,而有在每计算机系统的DNS解析组件。每台计算机上会运行各种程序,这些程序不需要自己处理DNS解析过程,只需要将请求发送给操作系统的DNS组件就行了。这里的DNS组件就叫代理服务器。

递归解析服务器则是真正执行DNS查询的服务器。以www.example.com为例,整个查询过程如下:

DNS解析过程
  1. 代理服务器向递归服务器查询域名的 A 记录(也就是 ipv4 地址)
  2. 递归服务器将查询请求原样发送给根域名的服务器
  3. 根域名服务器只保存根域名的信息,并不知道www.example.com的信息,所以返回com.域名的NS记录
  4. 递归服务器根据返回的NS记录,将查询请求转发给com.的域名服务器
  5. com.域名服务器同样只记录了www.example.com的NS服务器,所以返回NS记录
  6. 递归服务器把请求转发给example.com.的域名服务器
  7. 一般来说,example.com.的域名服务器保存了www.example.com.信息,所以返回对应 A 记录

如果example.com的域名服务器只保存了www.example.com.的NS服务器信息,那整个过程还会持续下去。因为是整个过程是层层递归,所以叫递归查询服务器。

各服务器之间使用UDP的53号端口收发消息,DNS查询内容没有加密,都是明文通信

从查询的过程可以看出,所有的域名查询都需要先访问根域名的服务器,然后得到各级域名的服务器。那递归服务是怎么知道根服务器的IP地址的呢?答案就是在代码中写死服务器地址。全世界总共有13台逻辑根服务器

显然,13台服务器远不能应对当今互联网的DNS查询请求。人们采用了所谓的 Anycast 技术在世界各地部署了多达1500台镜像服务器。所谓 Anycast 就是利用 BGP 协议在不同的网络中广播根服务器的IP地址。对于根服务器的请求,可以发到就近的镜像服务器。各服务器定时同步根域名数据。中国已经部署了 F/I/J/K/L 五组根镜象服务器。所有国内用户对根服务器的查询请求都不需要通过国际互联网就能完成。但是,中国境内的都是镜像服务器,只能提供查询功能,无法更改根域名的记录内容。

现在总结一下DNS的系统设计:

以上就是DNS系统的主要内容。DNS是互联网最古老的协议,使用UDP明文通信,因此也就在安全性和隐私保护方面问题最大的协议。在互联网中到处充斥着基于DNS的内容审查、行为监控、域名劫持、网站屏蔽、拒绝服务攻击等行为。互联网标准化组织也一直致力于解决DNS的各类安全问题。后面我会陆续介绍。欢迎关注。