DNS 是网络上非常重要的一个概念,不仅仅是码农任何上网的人都会接触它,DNS 是非常复杂,这篇文章希望以比较简单的方式去理解它,让非码农也能了解基本概念,从而有效的去运用它。
DNS 是干什么的
当我们在浏览器输入一个网址访问资源的时候,浏览器怎么知道资源在哪儿呢?必须要有一个 IP 地址,浏览器才能和放置资源的服务器连接。而 DNS 的作用其实就是翻译域名,获取这个域名对应的 IP 地址。
那为什么不直接使用 IP 地址访问服务器的资源,原因很简单,IP 地址太难记忆,另外服务器绑定的 IP 可能变化,而浏览器是不知道这个变化的。
对于我们上网的人来说,谁在提供 DNS 服务呢?或者说谁在翻译这个 IP 地址呢?不同的操作系统有不同的方式。
在 Windows 中,可以在控制面板网络连接中配置,一般有两种方式:
- 自定义配置一个 DNS 服务器
- 由 ISP 或者局域网 DHCP 协议进行分配。
这种 DNS 服务器称为本地 DNS 服务器,由它来负责 IP 解析工作。
一旦配置好本地 DNS 服务器后,在电脑上任何软件(比如浏览器)想使用 DNS 翻译功能就会向本地 DNS 服务器发出请求。
在 Linux 中,是通过 /etc/resolv.conf 文件配置本地 DNS 服务器。
对于大部分上网的人来说,了解本地 DNS 服务器如何配置就可以了,一般 DNS 服务器会自动分配,比如在家里你通过宽带上网,使用的本地 DNS 服务器一般是这个 ISP 提供的。
DNS 是一个数据库
DNS 首先是一个巨大的数据库,这个数据库是有层级关系的,而且是分布在世界各地的。那么域名是如何映射到这个数据库中的呢?首先来理解几个概念。
(1)域名
一个域名表示你拥有了互联网的一个资源,通过域名也能了解到一个组织的主人是谁,比如 google.com 表示谷歌这个组织拥有的一个互联网资源。
子域名,主要是一个企业为了规范化自己的域名系统和服务,而在一级域名下扩展出来的名称系统。newyingyong.cn 这个域名是我的,每开发一个项目就会新扩展一个子域名,比如 http://www.rss.newyingyong.cn 这个服务的子域名就是 rss.newyingyong.cn。
其实对于 .com 域名来说,google.com 就是它的子域名,这体现了域名系统或者说 DNS 系统的层级性。
(2)主机
通过域名,我们能够定义一个主机,比如大部分 WEB 服务,默认的主机名就是 WWW。
google.com 其实隐藏了默认的主机名,实际上等同 www.google.com ,www 是 google.com 这个域名下定义的虚拟主机。
(3)Fully Qualified Domain Name
FQDN 叫做绝对域名名称,由主机名和域名组合而成,注意一个完整的 FQDN 末尾有一个点号。比如 www.google.com. 代表一个 FQDN。
现在来说说 DNS 系统的层级数据库,DNS 最顶层是点号(.),叫做 ROOT 根域名。接下来是 TLDs,表示顶级域名,顶级域名分为两种类型:
- .com,.org 这样的叫做一般通用顶级域(gTLDs)
- .cn,.jp 这样的叫做国家顶级域(ccTLDs)。
![DNS][2017-dns1]
[2017-dns1]: http://notes.newyingyong.cn/static/image/2017/dns1.png "DNS"
层级系统的意思表示在这个数据库中,根域名服务器管理顶级域服务器,而顶级域管理一级域名服务器,最后一个域名服务器管理具体主机的 IP 信息。
实体 DNS 服务器
上面说了 DNS 是一个数据库,那么这个数据库的组成部分就是具体的服务器,这些服务器来维护 DNS 信息。而维护是通过授权方式的,而且是一级授权。
(1)根域名服务器
根域名服务器由 ICANN 来管理,在全球有 13 个根域名服务器,每个根域名服务器由多台机器。分布在全球各地,查询量非常大,所以分布在各地是有原因的。根域名服务器主要负责解析 TLD 服务器。
(2) TLD 服务器
TLD 服务器负责解析 Domain-Level 服务器。
(3)Domain-Level 服务器
这个服务器一般告之某个域名解析出来的 IP 地址,比如 www.google.com ,由负责管理 google.com 域名的服务器解析 IP 地址,这个层级的服务器叫做 Domain-Level 服务器 。
通过上面看出,每个层级的域名服务器负责管理他能管辖的域名,而且他也只管理他下一级的,不会跨级别管理,原因就是授权。这相当于一个公司,CEO 管理总经理,总经理管理经理,经理管理具体的员工,一般不会跨级别管理,因为事情做的太多就没有效率了。
以上的服务器也统称为权威域名服务器。他们来负责维护具体 DNS 的信息。
DNS 是如何具体工作的
客户端会发送一个命令告诉本地 DNS 服务器,告诉我 www.google.com. 这个 FQDN 的 IP 地址(A 记录),然后就等着拿结果,这种查询方式叫做递归查询。注意区分本地域名服务器和权威域名服务器的区别。本地域名服务器理论上只是查询,没有维护 DNS 信息。
本地 DNS 服务器最终会找出具体的 IP 地址,但是这个步骤不是一步到位的,可能有很多步骤,这种查询方式叫做迭代查询。
本地 DNS 服务器也叫做 Hinet 服务器,也叫做 Resolving Name Server。这样的服务器一般由本地 ISP 提供或者由其他组织提供,比如 Google 的 8.8.8.8 域名服务器。
借用《鸟哥私房菜》的图来说明:
![DNS][2017-dns2]
[2017-dns2]: http://notes.newyingyong.cn/static/image/2017/dns2.gif "DNS"
- 本地 DNS 服务器发现没有 www.google.com 域名对应的 IP 地址,就会向根域名服务器发出查询任务。根域名服务器说,我只知道 .com 这个 TLD 服务器的 DNS 信息,你去问他把,并且返回 .com 服务器的地址。
- .com 服务器说我不知道,但是知道这个域名由谷歌自己维护(Domain-Level 服务器 )的,你去问他把,并且返回谷歌 NS 服务器的 IP 地址,由它来告诉调用者。
- 本地 DNS 服务器联系上 Google 的 NS 服务器后,NS 这台机器上的 DNS 软件说,这是我维护的,然后把具体的 IP 地址告诉了本地 DNS 服务器。本地 DNS 服务器会缓存这一结果,然后告诉客户端(比如浏览器)。
这里出现了两个新的名词,Resolving Name Server 负责具体的 DNS 查询工作(也叫本地 DNS 服务器),中国很多 ISP 很不厚道,提供的 DNS 服务器会进行 DNS 污染操作,假如为了安全可以使用一些其他组织的 DNS 服务器,比如 8.8.8.8
另外一个服务器叫做 NS 服务器,这个告诉调用者,具体那台机器维护某个域名的 DNS 信息(比如 A 记录),为了获取某个域名的 IP 地址,需要去向它查询,理解身上有些拗口。
上个例子中根域名服务器或者顶级域名服务器告诉调用者(本地 DNS 服务器)去具体某个 NS 服务器去查询 DNS 信息,而最后到了 Google 的 NS 服务器后,这台 NS 服务器就会直接解析域名对应的 A 记录了。
申请域名后应该干什么
对于个人用户来说,申请域名后(newyingyong.cn)(同时有了个 IP),就要进行域名的解析工作了,比如说我在万网(域名注册机构)买了个域名,阿里云买了个主机,默认就是在万网(域名管理机构)进行域名解析工作的,万网的 NS 服务器名称是 dns1.iidns.com.,在万网(域名管理机构)后台,配置域名(实际上是主机)和 IP 地址即可。
![DNS][2017-dns3]
[2017-dns3]: http://notes.newyingyong.cn/static/image/2017/dns3.png "DNS"
假如你要更改一个域名管理机构(比如 DNSPod)负责域名及诶工作,你的域名注册机构管理后台配置 NS 服务器是 DNSpod 就可以了,由他们负责域名的解析工作。
发现没有,这里体现了 DNS 系统的授权特性,授权域名管理机器去管理这个域名的 DNS 信息。
那么背后发生了什么?一旦由 DNSPod 负责解析工作,它会做两件事情:
- 告诉它的上一级域名服务器,newyingyong.cn 这个域名的解析工作由我的 NS 服务器来管理,请登记下。
- 在自己的 DNS 服务器上增加一条记录,记录相应主机的 A 记录(当然还有其他的类型的 DNS 记录,比如 MX 记录)。
假如是一家大型公司,比如有很多一级域名或者很多子域名,可能想自己维护 DNS 信息,那么就要自己搭建一个 DNS 服务器,然后在自己的域名管理机构配置 NS 服务器即可,这个 NS 服务器的地址就是你自己的服务器,负责维护域名的 DNS 信息。比如 sina.com.cn 的域名服务器就是自己维护的,名称是 ns1.sina.com.cn.,这台服务器地址是 202.106.184.166。
那么为什么大型机构希望维护自己的域名信息呢?
- 方便管理,假如不自己维护域名信息,域名生效时间和缓存时间都是不可控的,而自己搭建可以避免这些问题。
- 动态管理,比如通过一些软件来更新自己的 DNS 信息更方便,还可以做动态域名解析。
DNS 是个协议
DNS 是个数据库,更是个协议,默认使用 UDP 协议,端口号是 53,很多客户端(比如浏览器和 dig)通过这个协议,查询出了某个域名的 A 记录。
而 DNS 服务器为了管理,一般使用 BIND 这个软件来提供具体的服务(服务器端)。
这篇文章简单讲了下 DNS 的基本概念,有点枯燥,后面会通过 dig 命令能理解 DNS,也会将如何搭建 DNS 服务器。
大家可以思考下,DNS 的缓存是什么概念,DNS 污染是什么,什么是动态 DNS,什么是泛域名,为什么 NS 服务器一般有多台,为什么自己电脑上配置本地的 DNS 服务器有多台。