公众号关注“杰哥的IT之旅”, 选择“星标”,重磅干货,第一时间送达! 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的分布式管理,当一个域委托给一台服务器后,这个域下的管理权就交给这台服务器了,这样的设计不仅解决了存储压力,也提高了域名管理的灵活性(这个结构很像Linux的文件,你可以把任意子目录挂载到另外的磁盘上,也可以把其下的子目录挂载到别的磁盘上。)
顶级域名
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服务器,客户端直接访问递归解析服务器,它是整个解析过程中最繁忙的,它的查询步骤是递归的,从根域名服务器开始,查询目标域名。
递归解析服务器通过一层层地请求权威域名服务器来获取下一个目标的地址,直到找到目标域名的权威域名服务器。
简单来说:递归解析服务器负责解析域名,权威域名服务器负责保存域名记录。
递归解析服务器一般都是ISP提供的,另外还有一些比较知名的公共递归解析服务器,比如的8.8.8.8、联通的114、BAT也都推出了公共递归解析服务器,但是性能最好的应该还是你的ISP提供的,但是可能会存在DNS劫持的问题。
缓存
由于整个解析过程非常复杂,DNS采用了缓存技术来实现服务健壮性,当一个域名递归解析后,再次收到查询时,不会再经过一次递归解析过程,而是会缓存上一次解析的结果,www.的缓存直接返回。而且是分级缓存,也就是当再次收到www.next time的查询时,由于递归解析服务器已经知道权限,因此只需要向www.next time发送一次www.next time的查询请求即可。
根域名服务器递归解析服务器如何知道根域名服务器的地址呢?根域名服务器的地址是固定的,目前全球共有13台根域名解析服务器,这13条记录在递归解析服务器中被持久化:
为什么只有 13 个根域名服务器?负载均衡不是越多越好吗?前面提到,DNS 协议采用 UDP 查询,由于能保证性能的 UDP 查询最大长度为 512 字节,因此必须将所有根域名服务器的域名服务器数据都包含在一个 512 字节的 UDP 数据包中。根服务器数量限制为 13 个,且每个服务器必须使用字母表中的单字母名称。
智能分析
智能解析是指当一个域名对应多个IP时,当你查询这个域名的IP时,会返回距离你最近的IP。
由于国内不同运营商之间带宽很低,对于电信用户来说访问联通的IP就是一场灾难,而智能DNS解析可以解决这个问题。
智能解析依赖的是EDNS协议,EDNS是一个草案的DNS扩展协议,修改起来比较简单,就是在DNS数据包中增加一个IP,这样就可以根据这个IP返回比较接近的IP了。
国内最新支持EDNS的是 ,是国内比较知名的域名解析厂商,很多公司都会用到域名加速,目前已经被腾讯收购。
域名注册商
一般我们想要注册一个域名,都需要找一个域名注册商,比如我要注册一个域名,就需要找一个域名注册商来注册hello这个域名,com的域名注册商不止一个,这些域名注册商也是从ICANN获得其域名的注册权,详见如何申请成为.com域名注册商
那么,域名注册商和权威域名解析服务器是什么关系呢?
域名注册商都会自建权威域名解析服务器,比如你在上申请.com下的二级域名,就不需要自建,直接在控制中心管理指向的域名就可以了,原因是你新域名的权威域名服务器是域名注册商默认提供的,当然你也可以更改,比如从你申请的海外域名,把权威域名服务器改为,一方面加快国内解析速度,另一方面还可以享受到智能解析提供的功能
使用bind搭建域名解析服务器
关于bind构造的文章请参考:
bind配置文件分为两部分:bind配置文件和zone配置文件
绑定配置文件
bind配置文件位于/etc/named.conf,主要负责bind功能的配置,比如区域路径、日志、安全、主从配置等。
最重要的是添加zone配置,指定zone配置文件。启用递归解析功能,如果这个是no,那么这个bind服务只能作为权威解析服务,当你的bind服务是对外开放的时候,开启会有安全风险,如果你防护不好,你的鸡就会被当成肉鸡了
区域配置文件
zone的配置文件在bind配置文件中指定,下图是一个简单的zone配置:
区域配置是核心配置,指定了DNS资源记录,比如SOA、A、CNAME、AAAA等,各种记录的概念网上文档太多了,这里就不再赘述,主要说一下SOA和CNAME的作用。
SOA 记录
SOA记录表示这个域名的权威解析服务器地址,上面的文章讲解了权威解析服务器和递归解析服务器的区别,当所有递归解析服务器都没有你的域名解析的缓存时,就会回溯到源头去请求域名。SOA记录,也叫权威解析记录
别名记录
CNAME 的概念和别名很相似,其处理逻辑也一样。当一个执行发现 name 是一个 CNAME 时,就会去查询这个 CNAME 的 A 记录,一般来说,可以用 A 记录来代替 CNAME。那么我们为什么要发明 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 地址顺序不一样,客户端会使用 URL 中的第一个 IP 来发送请求。
DNS 负载平衡与 LVS 专业负载平衡
与LVS等专业的负载均衡工具相比,DNS层的负载均衡有以下特点:
在实际场景中,你也需要根据自己的需求选择相应的负载均衡策略
子域名授权
我们在.com域名下申请了二级域名后,有一天公司规模扩大,需要拆分成A、B两个业务部门,公司就给他们分配了三级域名,域名结构如下:
经过一段时间的发展,A部门和B部门内部业务太多,需要频繁申请新产品的域名,此时他们希望建设自己的域名,需要上层赋予他们相应的域名管理权限,他们期望的结构如下:
注意第一阶段和第二阶段的区别:第一阶段,如果A部门要申请子域名,需要向上级提出申请,整个域名由总公司管理;第二阶段,A部门先自建,然后总公司再将域名管理权转让给自建的,这个转让管理权的行为就叫子域名授权。
子域名授权分为两步:
我们在使用 bind 构建 DNS 服务器中讨论的第一步是在区域配置文件中指定 SOA 记录:
@ IN SOA ns.a.hello.com admin.a.hello.com. (……)
第二步,给域添加NS记录:
a.hello.com IN NS ns.a.hello.com
ns.a.hello.com IN A xx.xx.xx.xx (自建nameserver的IP)这样在解析域名的时候,如果配置中有NS记录,就会继续向下递归解析
DNS 调试工具
OPS中常用的DNS调试工具有:host、dig
这三个命令都属于bind-utils包,也就是bind工具集,它们的使用复杂度和功能依次递增,man手册和网上关于它们的使用教程太多了,这里我们简单分析一下dig命令的输出:
dig 有很多参数和功能,详细使用方法请阅读 man page。
其他
DNS 放大攻击
DNS放大攻击是DoS攻击的一种,它利用大量流量占满目标机器的带宽,导致目标机器拒绝连接正常用户的请求并崩溃。
想法
在一般的流量攻击中,黑客机器会制造大量的流量到目标机器,但是问题就在于这需要大量的黑客机器,因为服务器的带宽一般比家庭网络的带宽要大很多,如果我们自己家里的机器作为黑客机器的话,还没有等到目标机器的带宽占满,我们的带宽就已经超负荷了。
原则
DNS递归解析的过程比较特殊,我们可以通过一个几个字节的查询请求,得到几百甚至几千字节的响应(流量放大),而大多数服务器都不会对DNS服务器进行防御。DNS查询包的IP可以被伪装,这样DNS服务器就可以向目标机器发送大量的DNS查询包,从而实现DoS攻击。
但常用的DNS服务器都会对攻击请求进行过滤,因此寻找DNS服务器漏洞也是一个问题。
扫一扫在手机端查看
-
Tags : 解析域名_一文搞懂 DNS 基础知识,收藏起来有备无患~
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。