本文为原创文章,转载注明出处,欢迎关注网站https://hkvision.cn

缘起

由于一些复杂的原因,我有一个需求,是能够对特定的域名进行自定义解析,即自行搭建一个DNS服务器,然后让自己的DNS服务器设定为自己搭建的,达到对特定域名解析的目的。有人说改host文件就ok了,但是我希望做到能够让其他人也能对特定的域名解析,虽然让大家都改host也不麻烦,但是能统一管理也是好的。正好了解了阿里云的函数计算,于是就在函数计算上搭了一个DoH服务器,为此去回顾了一遍DNS解析的过程,温故而知新,果然发现我之前的想法是错的,现在记录一下。

域名的结构

  1. 域名的结构:

    域名是有结构的,其实很简单,例如:www.baidu.com,域名以点的形式分割,从右至左分别为根域名,顶级域名,二级域名等等。很明显这是一个树形结构。

    首先,根域名只有一个,就是.(点),真实域名应该是www.baidu.com.,但是我们一般都将最后一个点省略了。然后是顶级域名,就是com.,顶级域名还有很多,例如cn.,net.,org.等等。剩下的就是二级域名等等等。

    域名的结构

  2. 域名的管理

    域名管理通常由机构进行管理

互联网名称与数字地址分配机构(ICANN)成立于1998 年10 月,是一个集合了全球网络界商业、技术及学术各领域专家的非营利性国际组织, 负责互联网协议(IP)地址的空间分配、协议标识符的指派、通用顶级域名(gTLD) 和国家及地区顶级域名(ccTLD)系统的管理,以及根服务器系统的管理等。

中国互联网络信息中心( ChinaInternet Network Information Center,CNNIC) 是经国家主管部门批准, 于1997 年6 月3 日组建的管理和服务机构,行使国家互联网络信息中心的职责。作为中国信息社会重要的基础 设施建设者、运行者和管理者, CNNIC以“ 为我国互联网络用户提供服务,促进我国互联网络健康、有序发展”为宗旨,负责管理维护中国互联网地址系统,引领中国互联网地址行业发展,权威发布中国互联网统计信息, 代表中国参与国际互联网社群。其主要职责包括以下几部分:互联网地址资源注册管理。器运行机构,负责运行和管理国家顶级域名.cn、中文域名系统、通用网址系统及无线网址系统,以专业技术为全球用户提供不间断的域名注册、域名解析和Whois 查询服务。CNNIC是亚太互联网络信息中心( APNIC)的国家级IP 地址注册机构成员( NIR) 。以CNNIC 为召集单位的IP地址分配联盟,负责为我国的ISP 和网络用户提供IP 地址和AS 号码的分配管理服务。 引自百度百科:域名管理

  1. 查询域名的类型

    A记录:地址记录,用来指定域名的IPv4地址,如果需要将域名指向一个IP地址,就需要添加A记录。

    CNAME: 如果需要将域名指向另一个域名,再由另一个域名提供ip地址,就需要添加CNAME记录。

    TXT:在这里可以填写任何东西,长度限制255。绝大多数的TXT记录是用来做SPF记录(反垃圾邮件)。

    NS:域名服务器记录,如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录。

    AAAA:用来指定主机名(或域名)对应的IPv6地址(例如:ff06:0:0:0:0:0:0:c3)记录。

    MX:如果需要设置邮箱,让邮箱能收到邮件,就需要添加MX记录。

    显性URL:从一个地址301重定向到另一个地址的时候,就需要添加显性URL记录(注:DNSPod目前只支持301重定向)。

    隐性URL:类似于显性URL,区别在于隐性URL不会改变地址栏中的域名。

    SRV:记录了哪台计算机提供了哪个服务。格式为:服务的名字、点、协议的类型

这方面的详细可以参考这个文章:域名解析中A记录、CNAME、MX记录、NS记录的区别和联系

DNS解析过程

DNS的解析是按照树形结构来的,其中重要的就是NS记录类型,此记录类型会返回一个IP地址,此IP地址会告诉你所需要解析的域名需要去哪进行解析,这是迭代查询的一个重要步骤。OK,下面开始介绍DNS解析。

DNS解析服务器和域名服务器的区别

在我个人的理解中,DNS服务器和域名服务器是有区别的,平时我们在电脑里面设置的,应该叫DNS解析服务器,例如8.8.8.8,114.114.114.114等,而我们所说的根服务器则是域名服务器,其区别在于,DNS解析服务器本身并不管理域名记录,仅仅是做解析工作,即DNS解析服务器帮助你进行ip地址的查询,事实上这一步在客户端都可以完成。而域名服务器则是对域名记录进行管理。当我们区分了这两个概念之后就能理清楚DNS解析的过程了。

域名服务器

过程

面向客户的DNS解析实际上很简单,对于客户而言,一般都是直接发送A记录解析过去,然后等着返回IP就完事了,但是对于DNS服务器而言,他干了很多事情,下面我们就详细了解下这个背后的过程,我们以www.hkvision.cn这个域名为例,向阿里223.5.5.5发送DNS解析请求(不算缓存)

  1. 223.5.5.5接收请求,然后223.5.5.5向根域名服务器发送解析请求,这个请求目的是找到管理cn顶级域名的服务器,然后根域名服务器发现是cn域名,返回管理cn域名的服务器的地址,通常这个地址挺多的,但是一般都有一个主nameserver和一堆second nameserver,我们这里以a.dns.cn为例,ip为203.119.25.1

  2. 223.5.5.5接收地址后,向203.119.25.1发送解析请求,203.119.25.1会返回管理hkvision.cn域名的服务器地址

  3. 重复上述过程,直到返回A,AAAA,CNAME记录为止(代表这个域名是我在管理,我知道这个域名的IP是多少,于是就直接返回给你了)

递归查询

递归查询是指,如果DNS解析服务器不知道被查询的域名的IP地址,则会向根域名服务器查询,而不是让客户机进行下一步查询,因此递归查询的结果要么是域名的IP地址,要么就表示无法查到所需的IP地址

迭代查询

迭代查询是指,当域名服务器收到迭代查询请求的报文的时候,要么给出域名的IP地址(A或AAAA记录),要么告诉DNS解析服务器,你下一步需要向谁进行查询(NS记录),然后让DNS服务器继续向下一个服务器查询。

迭代查询和递归查询 迭代查询和递归查询

递归:客户端只发一次请求,要求对方给出最终结果。

迭代:客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表,客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。

授权回答:向DNS服务器查询一个域名,刚好这个域名是本服务器负责,返回的结果就是授权回答。

关于缓存

准确来说,在DNS解析的任何一个步骤都是可能存在缓存的。

  • 浏览器:浏览器是可以缓存的
  • 操作系统:非浏览器的请求是可以缓存在操作系统中的
  • DNS解析服务器:解析服务器是可以进行缓存的,尤其是热门的域名请求,直接缓存在内存中,以便其他人访问的时候能够快速回复

DNS记录会有一个ttl值(time to live),单位是秒,意思是这个记录最大有效期是多少。经过实验,OS缓存会参考ttl值,但是不完全等于ttl值,而浏览器DNS缓存的时间跟ttl值无关,每种浏览器都使用一个固定值。

参考资料:

https://www.cnblogs.com/qingdaofu/p/7399670.html http://blog.csdn.net/wyq_tc25/article/details/51679520 http://blog.csdn.net/wytheonly/article/details/37925067 http://www.cnblogs.com/Juntaran/p/5827110.html http://magic3.blog.51cto.com/1146917/1354084 http://blog.csdn.net/realmeh/article/details/22663807