一篇文章了解 DNS 基础知识,保存以供将来参考
土豆外行
DNS(Name)又称为域名系统( Name ),是互联网的一项服务,其本质是一个将域名和 IP 地址相互映射的分布式数据库,有了它,我们就可以更方便地通过域名访问互联网。
DNS具有以下特点:
那么,什么情况下应该使用TCP,什么情况下应该使用UDP呢?
最早的时候,DNS的UDP报文大小上限是512字节,所以当某个大小超过512(返回的信息太多)时,DNS服务会使用TCP协议进行传输。后来DNS协议扩展了自己的UDP协议,DNS在发送查询请求时可以指定可以接收大于512字节的UDP数据包,这种情况下DNS仍然会使用UDP协议。
分层数据库结构
DNS的结构跟Linux文件系统很相似,像一棵倒立的树。我们以站长之家的域名为例:
最上面的.是根域名,后面是顶级域名com,然后是站长首页域名,以此类推。使用域名时,要从下往上。.是完整域名,.也是完整域名。
之所以设计这么复杂的树形结构,是为了防止名称冲突。这样的树形结构当然可以存放在单台机器上,但现实世界中完整的域名有很多,每天都有大量的域名新增和删除,如果都存放在单台机器上,对单台机器的存储性能会是一个很大的挑战。另外,集中管理的另一个缺点就是不够灵活,可以想象每次新增或删除域名都要向中央数据库申请是多么麻烦。因此现实中的DNS是分布式存储。
根域名服务器只管理顶级域名,而把各个顶级域名的管理权委托给各个顶级域名。所以当你想申请com下的二级域名时,只要找到com域名注册中心就可以了。比如你申请了上图中的二级域名,那么它下面的域名就归你管理了。当你管理子域名时,你可以自己建一个,然后把管理权委托给你在.com注册中心建的子域名。自建和非自建的结构图如下:
一般来说,如果可以的话,你应该避免构建自己的 DNS,因为维护高可用性 DNS 并不容易。据我所知,有两种情况需要构建自己的 DNS:
搭建内部DNS。公司机器比较多,通过IP互相访问太过混乱,这种情况下可以搭建内部DNS,让内部服务器之间通过域名互相通信。
企业对域名厂商提供的性能不满意,虽然顶级域名注册商都有自己的域名,但是注册商提供的域名不够专业,在性能和稳定性上不能满足企业的需求。此时企业就需要自建高性能域名,比如增加智能解析功能,让不同地域的用户就近访问IP,提升服务质量。
总结一下DNS的分布式管理,当把一个域委托给一个的时候,这个域下面的管理权就交给这个了,这样的设计不仅解决了存储压力,也提高了域名管理的灵活性(这个结构很像Linux File,你可以把任意子目录挂载到另外一个磁盘上,也可以继续挂载其下的子目录)
顶级域名
com 等顶级域名受到 ICANN 的严格控制,不能随意创建。顶级域名有两种类型:
常见的通用顶级域名有.com、.org、.edu等,国家顶级域名有我国的.cn、美国的.us。企业在申请公共域名时,如果是跨国产品,则应选择通用顶级域名;如果没有跨国业务,则看自己的喜好(可以对比各顶级域名的服务和稳定性再做选择)。下面介绍几个热门的顶级域名,完整顶级域名请参考维基百科。
我
me顶级域名其实是一个国家域名,是黑山共和国的国家域名。不过它对个人开发者开放,所以很多个人博主都用它作为自己的博客域名(本博客也是这么来的~)
io
很多开源项目经常使用io作为顶级域名,这也是一个国家域名。因为io和计算机中input/的缩写相同,也和计算机的二进制10很相似,所以给人一种geeky的感觉。相比.com域名,.io资源非常多,选择也更多。
DNS解析过程
讨论了DNS的基本概念之后,我们再来说说DNS的解析过程。当我们通过浏览器或者应用程序访问互联网的时候,首先会执行DNS的解析过程。标准的glibc提供了一个.so.2的动态库,我们的应用程序用它来进行域名解析(也叫域名解析),同时它还提供了一个配置文件/etc/.conf来控制该行为。配置文件中最关键的一行是这样的:
hosts: files dns myhostname
决定顺序,默认先搜索hosts文件,若没有找到匹配则进行DNS解析,默认解析流程如下:
上图主要描述了客户端的解析过程,我们可以看到,最重要的是第四步请求本地DNS服务器执行,它会根据本地DNS服务器配置,将解析请求发送给递归解析服务器(什么是递归解析服务器,后面会介绍)。本地DNS服务器的配置在/etc/.conf中,我们来看一下服务器的流程:
我们来分析一下解析过程:
客户端向本地DNS服务器(递归解析服务器)发送请求,解析域名
本地DNS服务器检查缓存中是否有缓存的域名,如果有则直接返回给客户端。
如果不执行下一步
本地DNS服务器向根域名服务器发送请求,查询com顶级域名的地址
获取到com域名的IP后,向com发送请求,获取域名的地址
继续请求,得到工具域名地址,最终得到IP,本地DNS服务器缓存此结果,以便下次查询快速返回
本地DNS服务器返回结果给客户端
递归 DNS 与权威 DNS
我们在解析过程中发现了两种类型的DNS服务器,客户端直接访问递归解析服务器,这也是整个解析过程中最繁忙的,它的查询步骤是递归的,从根域名服务器开始,查询目标域名。
递归解析服务器通过一层层地请求权威域名服务器来获取下一个目标的地址,直到找到目标域名的权威域名服务器。
简单来说:递归解析服务器负责解析域名,权威域名服务器负责保存域名记录。
递归解析服务器一般由 ISP 提供,另外也有一些知名的公共递归解析服务器,比如 的 8.8.8.8、联通的 114、BAT 也推出了公共递归解析服务器。不过性能最好还是由你的 ISP 提供,但可能会有 DNS 劫持的问题。
缓存
由于整个解析过程非常复杂,DNS采用缓存技术来实现服务健壮性。递归解析完一个域名后,再次收到查询时,不会再经过一次递归解析过程,而是直接返回上一次解析结果的缓存。而且是分级缓存,也就是下次收到对www的查询时,由于这次递归解析服务器已经知道权限,所以只需要再发送一次对www的查询请求即可。
根域名服务器递归解析服务器如何知道根域名服务器的地址呢?根域名服务器的地址是固定的,目前全球共有13台根域名解析服务器,这13条记录在递归解析服务器中被持久化:
为什么只有 13 个根名称服务器?越多不是对负载平衡越好吗?如前所述,DNS 协议使用 UDP 查询。由于 UDP 查询中可以保证性能的最大长度为 512 字节,因此为了将所有根名称服务器数据包含在 512 字节的 UDP 数据包中,根服务器的数量只能限制为 13 个,并且每个服务器都必须使用字母表中的单字母名称。
智能分析
智能解析是指当一个域名对应多个IP时,当你查询这个域名的IP时,会返回距离你最近的IP。
由于国内不同运营商之间带宽很低,对于电信用户来说访问联通的IP就是一场灾难,而智能DNS解析可以解决这个问题。
智能解析依赖的是EDNS协议,EDNS是一个草案的DNS扩展协议,修改起来比较简单,就是在DNS数据包中增加一个IP,这样就可以根据这个IP返回比较接近的IP了。
国内最新支持EDNS的是 ,是国内比较知名的域名解析厂商,很多公司都会用到域名加速,目前已经被腾讯收购。
域名注册商
一般我们想要注册域名,都需要找域名注册商。比如我要注册一个.com域名,就需要找一个.com域名注册商来注册hello域名。.com域名注册商不止一家,这些域名注册商也都是从ICANN获得注册权的。查看如何申请成为.com域名注册商。
那么,域名注册商和权威域名解析服务器是什么关系呢?
域名注册商都会自建权威域名解析服务器,比如你在上申请.com下的二级域名,就不需要自建,直接在控制中心管理指向的域名即可。原因是你新域名的权威域名服务器是域名注册商默认提供的,当然你也可以更改,比如把权威域名服务器从你申请的海外域名改为,这样一方面会加快国内解析速度,另一方面还可以享受提供的智能解析功能
使用bind搭建域名解析服务器
由于网上介绍bind设置的文章太多了,我就不细说了,喜欢的朋友可以自己在网上搜索设置教程,一步步搭建本地的来玩玩,这里主要介绍bind配置文件
bind配置文件分为两部分:bind配置文件和zone配置文件
绑定配置文件
bind配置文件位于/etc/named.conf,主要负责bind功能的配置,比如区域路径、日志、安全、主从配置等。
最重要的是添加zone配置,指定zone配置文件。启用递归解析功能。如果这个是no,那么这个bind服务只能作为权威解析服务。当你的bind服务是对外开放的时候,开启会有安全风险,如果防御不力,你的服务器就会被当成bot来用。
区域配置文件
zone的配置文件在bind配置文件中指定,下图是一个简单的zone配置:
区域配置是核心配置,指定了DNS资源记录,比如SOA、A、CNAME、AAAA等,各种记录的概念网上文档太多,这里就不赘述了,主要说一下SOA和CNAME的作用。
SOA 记录
SOA记录表示这个域名的权威解析服务器地址,上面的文章讲了权威解析服务器和递归解析服务器的区别,当所有递归解析服务器都没有你的域名解析的缓存时,就会回溯到源头去请求这个域名的SOA记录,也叫权威解析记录。
别名记录
CNAME 的概念和别名很相似,它的处理逻辑也是如此。当程序执行时,发现 name 是一个 CNAME,就会去查询这个 CNAME 的 A 记录。一般来说,凡是能用到 CNAME 的地方,都可以用 A 记录来代替。那么为什么要发明 CNAME 这样的东西呢?它是一种快捷的方式,可以将多个域名指向同一个 IP,这样当最底层 CNAME 对应的 IP 发生改变时,上层 CNAME 就不需要改变。就像我们代码中的硬编码信息一样,我们总是把这些硬编码的信息去掉,用一个变量来表示,这样当这个变量发生改变时,我们只需要修改一个地方就可以了。
配置完之后就可以使用named-和named-命令来检查一下我们的配置文件是否有问题,然后就可以启动bind服务了:
$> service named start
Redirecting to /bin/systemctl restart named.service
我们使用-ntlp来检查服务是否启动:
53端口已经开启,下面我们来测试一下效果,使用dig解析域名,使用127.0.0.1作为递归解析服务器
我们可以看到dig的结果和我们配置文件中配置的一样,都是1.2.3.4,DNS完成了它的使命,根据域名获取到了IP,但是我们这里用来演示的IP明显是假IP:)
使用DNS实现负载平衡
为一个域名添加多条A记录,解析时轮询随机返回一条,流量会被均匀划分到多条A记录中。
www IN A 1.2.3.4
www IN A 1.2.3.5
上面的配置中,我们给www域名添加了两个A记录,这种做法叫多宿主主机,它的作用是:当我们请求解析域名时,返回的IP会在两个IP之间轮换(默认行为,部分智能解析DNS会根据IP进行判断,返回一个更近的IP,距离请查询DNS智能解析)。
其实每次进行 DNS 解析请求时,都会返回所有 IP 地址。例如上面的配置中,它会同时返回 1.2.3.4 和 1.2.3.5 给客户端。那么它是如何实现 RR 的呢?只是每次返回的 IP 地址顺序不一样,客户端会使用请求中第一个 IP 地址。
DNS 负载平衡与 LVS 专业负载平衡
与LVS等专业的负载均衡工具相比,DNS层的负载均衡有以下特点:
实现非常简单
默认只能通过RR方式调度
DNS 没有对后端服务进行健康检查
DNS故障恢复时间相对较长(DNS服务之间存在缓存)
可加载的RS数量是有限的(受DNS数据包大小限制)
在实际场景中,你也需要根据自己的需求选择相应的负载均衡策略
子域名授权
我们在.com域名下申请了二级域名后,有一天公司规模扩大,需要拆分成A、B两个业务部门,公司就给他们分配了三级域名,域名结构如下:
经过一段时间的发展,A部门和B部门内部业务太多,需要频繁申请新产品的域名,此时他们想要自己搭建,需要上层赋予他们相应的域名管理权限,他们期望的架构如下:
注意第一阶段和第二阶段的区别:第一阶段,如果A部门要申请子域,需要向上级申请,整个域的管理权在总公司;第二阶段,A部门先建好,然后总公司再把域管理权移交给自建的,这个移交管理权的行为就叫子域授权。
子域名授权分为两步:
A部门搭建自己的服务器,并在区域配置文件中指定自己的地址作为权威解析服务器。
总部添加NS记录,将域名授权给部门A。
我们在使用 bind 构建 DNS 服务器中讨论的第一步是在区域配置文件中指定 SOA 记录:
@ IN SOA ns.a.hello.com admin.a.hello.com. (……)复制代码
扫一扫在手机端查看本文链接:https://by928.com/6744.html 转载请注明出处和本文链接!请遵守 《网站协议》 !
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。