# DNS
DNS是Domain Name System(域名系统)的简称,DNS可以为计算机、服务以及接入互联网或局域网的任何资源提供分层的域名解析功能。它最主要的功能是进行域名与IP之间的解析。
# 为什么需要DNS
在互联网中标记唯一一台计算机使用的是IP地址,通过合法的IP地址,我们可以与全世界任何一台主机进行通信。然而在当今计算机如此普及的情况下,以人类现有的智慧与记忆力很难将大量的IP地址背诵下来,这时使用域名系统就可以将难以记忆的数字IP地址与容易记忆的域名建议映射关系,用户通过输入域名,计算机会寻找指定的DNS服务器,请求服务器帮助解析该域名对应的IP地址,成功解析后,将获得该域名对应的真实IP地址,然后使用该IP地址与对方通信。
# 域名构成
域名是分级的,一般格式为:
主机名.三级域名.二级域名.顶级域名.
举个例子,百度的域名为www.baidu.com,代表的是根域下有com子域,com子域下面有baidu子域,baidu子域下有主机www。
注意:
- 最后一个点是根域,是所有域名的起点。通常输入域名时,最后一个根域(.)是不用输入的。
- 顶级域名或称为一级域名,前三位的有COM,NET,ORG。
# 域名查询过程
参考资料:
域名的解析过程如下:
- 在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
- 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
- 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
- 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
- 如果本地DNS服务器的本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至"根DNS服务器","根DNS服务器"收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机。
- 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。
- 不管本地DNS服务器是否用转发,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
域名查询过程中有两种方式:
- 递归查询:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
- 迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:"你下一步应当向哪一个域名服务器进行查询"。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。
这两种方式如下图:
这两种方式的不同之处:
- 递归查询:客户端只发一次请求,要求对方给出最终结果。返回的结果只有两种:查询成功或查询失败。
- 迭代查询:客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表,客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。它又称作重指引,返回的是最佳的查询点或者主机地址。
可以举个例子:
- 递归查询:一个客户端查询dns1,没有找到,dns1去查dns2,dns2去查dns3,最后逐次返回结果给到客户端。
- 迭代查询:一个客户端查询dns1,没有找到但是知道dns2有,dns1去查dns2,没有找到但是知道dns3有,dns1去查dns3。
# DNS缓存
参考资料:
- What really happens when you navigate to a URL (opens new window)
- 没错,DNS TTL 字段就是骗你的 (opens new window)
- DNS TTL最佳实践 (opens new window)
- 如何选择DNS的TTL值,设置多少才合适 ? (opens new window)
一条域名的DNS记录会在本地有两种缓存:
- 浏览器缓存
- 操作系统(OS)缓存
在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问操作系统缓存,最后再访问DNS服务器(一般是ISP提供),然后DNS服务器会递归式的查找域名记录,然后返回。
DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,操作系统缓存会参考ttl值,但是不完全等于ttl值,而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值。
# DNS记录类型
参考资料:
DNS的记录类型如下:
- A记录:用来指定主机(或域名)对应的IP地址记录。
- NS记录:域名服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置此项。
- CNAME记录:别名记录,允许将多个名字映射到同一台计算机。如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要设置此项。
- MX记录:建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮件服务器商提供的MX记录来填写。
- PTR记录:是A记录的逆向记录,又称IP反查记录,负责把IP反向解析为域名。
- TXT记录:一般指某个主机名或域名的说明。可任意填写,可为空,一般做一些验证记录会使用此项。
- AAAA记录:将域名指向一个IPv6地址。
- SOA记录:起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中哪一台是主服务器。它必须是一个文件的第一条记录。
- SRV记录:它记录了哪台服务器提供哪个服务,格式为服务的名字.协议的类型(比如:_example-server._tcp)
# 重要概念
参考资料:
# FQDN
Full Qualified Domain Name,完全限定域名,即每个域在全球网络都是唯一的;另外值得提到的一点是域并不是指诸如www.google.com这样的域名,而google.com才是域;
# 名称解析方式
DNS名称解析方式:
- 正向解析:即将FQDN转化为IP。
- 反向解析:即将IP转化为FQDN。
# DNS服务器类型
- DNS服务器:负责解析至少一个域。
- 辅助(从)DNS服务器:负责解析至少一个,是主DNS服务器的辅助。
- 缓存DNS服务器:不负责解析域,只是缓存域名解析结果。
# DNS返回结果
DNS返回的结果类型:
- 肯定答案:查询的域存在,会被缓存下来。
- 否定答案:不存在查询的域名,因此不存在与其查询的域名对应的IP,会被缓存下来。
- 权威应答:如果DNS服务器在自己的区域文件里找到了客户端需要查询的记录,就会返回一个权威性应答。
- 非权威应答:通过递归或迭代的方式查询到,或在缓存中查询到,为非权威性应答。
# DNS常用命令
参考文档:
下面是常用命令:
windows刷新DNS缓存:
ipconfig /flushdns
查询ip:
nslookup 目标域名
查询默认dns,并查看根域:
nslookup
set type=ns .查询指定记录类型的域名:
nslookup -qt=类型 目标域名 dns服务器ip
通过IP逆解析域名:
nslookup -qt=ptr 目标域名
查询域名的缓存时间:
nslookup -d 目标域名
# 群辉部署DNS
参考资料:
注意有两个要点:
- 填写解析的域名时,要带根域名(.)
- TTL设置短一点
- 启动转发器
# 群辉部署DDNS
群辉部署花生壳的ddns,这个只适用于一个供应商一个域名:
在连接性->外部访问->DDNS里设置DDNS。
在计划任务里设置dns更新间隔:
synonet --dns update
LDAP →