当前位置: 首页 > 科技观察

一篇文章了解DNS基础知识,做好万全准备

时间:2023-03-18 20:30:47 科技观察

DNS(DomainNameSystem),又称域名系统,是互联网的一项服务。它本质上是一个分布式数据库,将域名和IP相互映射。有了它,我们就可以更方便的通过域名访问互联网了。DNS有以下特点:分布式协议支持TCP和UDP,通用端口为53,每级域名长度限制为63,域名总长度限制为253,那么什么时候使用TCP和什么时候使用UDP?最早的时候,DNSUDP数据包大小的上限是512字节,所以当某个响应的大小超过512(返回的信息过多)时,DNS服务就会使用TCP协议进行传输。后来DNS协议扩展了自己的UDP协议。DNS客户端在发送查询请求时,可以指定可以接收超过512字节的UDP包。在这种情况下,DNS仍将使用UDP协议。分层数据库结构DNS的结构与Linux文件系统非常相似,就像一棵倒置的树。我们以站长之家的域名为例:top.是根域名,后面是顶级域名com,然后是站长之家、chinaz等域名。使用域名时,从下到上开始。s.tool.chinaz.com.是一个完整的域名,www.chinaz.com也是。之所以设计这么复杂的树形结构,是为了防止名称冲突。这样的树状结构,当然可以存储在一台机器上,但是现实世界中有很多完整的域名,每天都有大量的域名被增删。如果它们存在于一台机器上,单台机器的存储性能是不小的挑战。此外,集中管理的另一个缺点是管理不够灵活。可以想象每次增删域名都要向中心数据库申请是多么的麻烦。所以在现实中,DNS是分布式存储的。根域名服务器只管理顶级域,同时将各个顶级域的管理权委托给各个顶级域,所以当你想申请com下的二级域名时,只需找com域名注册中心。比如你申请了上图中chinaz.com的二级域名,那么chinaz.com下面的域名都会由你来管理。当您管理chinaz.com的子域名时,您可以搭建自己的域名服务器,将chinaz.com的管理权委托给您在.com注册中心搭建的域名服务器。自建nameserver和非自建的结构图如下:一般不会自己搭建的就不要自己搭建,因为维护一个高可用的DNS并不容易。据我所知,有两种情况需要构建自己的域名服务器:构建内部DNS。公司内部机器多,通过IP相互访问太乱了。这时候可以搭建一个内部域名服务器,让内部服务器通过域名进行通信。该公司对域名制造商提供的名称服务器的性能不满意。顶级域名注册商虽然有自己的域名服务器,但注册商提供的域名服务器并不专业,在性能和稳定性方面无法满足企业的需求。这时候企业就需要搭建自己的高性能域名服务器,比如加入智能解析功能,让不同地域的用户就近访问IP,提高服务质量。总结DNS的分布式管理。当一个域名被委托给一个域名服务器时,该域名下的管理权限全部由该域名服务器处理。这种设计一方面解决了存储压力,另一方面提高了域名管理的灵活性(这种结构很像Linux文件系统,可以将任意子目录挂载到另一个磁盘,也可以将子目录继续待挂载)com等顶级域名受ICANN严格控制,不允许随便创建。顶级域有两种:通用顶级域国家级顶级域.com、.org、.edu等常用顶级域国家级顶级域如我国的.cn和美国的.us。一般来说,企业在申请公网域名时,如果是跨国产品,应该选择gTLD;如果没有跨国业务,就看自己的喜好了(可以比较一下各个顶级域名的服务和稳定性再做选择)。这里有一些流行的顶级域名。有关完整的顶级域,请参阅维基百科。meme顶级域名其实是一个国家域名,是黑山共和国的国家域名,但是只是用于个人开发应用,所以很多个人博主都把它作为自己的博客域名(这个博客也就是这么来的~)io是很多开源项目常用的io是顶级域名,也是国家域名。因为io和计算机中的input/output缩写是一样的,也很像计算机的秒机制,给人一种geek的感觉。与.com域名相比,.io下资源多,选择多。DNS解析过程说完DNS的基本概念,我们再来说说DNS解析过程。当我们通过浏览器或应用访问互联网时,首先会进行一个DNS解析过程。标准的glibc提供了libresolv.so.2动态库,供我们的应用程序用来进行域名解析(也叫resolving),同时也提供了一个配置文件/etc/nsswitch.conf来控制解析行为,在配置中file最重要的是这一行:hosts:filesdnsmyhostname它决定了解析顺序,默认是先搜索hosts文件,如果没有匹配,再进行DNS解析。默认的解析过程如下:上图主要描述了客户端的解析过程。我们可以看到,最重要的一步就是在第四步请求本地DNS服务器进行解析。它会根据本地DNS服务器的配置发送解析请求进行递归解析。服务器(后面会介绍什么是递归解析服务器),本地DNS服务器在/etc/resolv.conf中配置。接下来我们看一下服务器的解析过程:下面分析一下解析过程:客户端向本地DNS服务器(递归解析服务器)发送请求,解析tool.chinaz.com的域名本地DNS服务器检查缓存,是否缓存了tool.chinaz,如果有.com域名,则直接返回给客户端;如果不执行下一步,本地dns服务器会向根域名服务器发送请求,查询com顶级域的nameserver地址,得到com域名的IP,然后发送请求到comnameserver获取chinaz域名的nameserver地址,继续请求chinaz的nameserver,获取tool域名的地址,最终得到tool.chinaz.com的IP,本地dns服务器缓存结果以便下次查询能够快速的将结果返回给本地的dns服务器返回给客户端递归解析服务器vs权威域名服务器我们在解析过程中发现了两种类型的DNS服务器。客户端直接访问递归解析服务器,也是整个解析过程中最忙的。它的查询步骤是递归的,从根域名服务器开始,一直到目标域名。递归解析服务器通过逐级请求权威域名服务器,直到找到目标域名的权威域名服务器,获取下一个目标地址。简单的说:递归解析服务器负责解析域名,权威域名服务器负责存储域名记录递归解析服务器一般由ISP提供。另外,还有一些比较知名的公共递归分析服务器,比如谷歌的8.8.8.8,联通的114,BAT也推出了公共递归分析服务器,但是性能最好的应该还是由您的ISP,但可能存在DNS劫持问题。由于整个解析过程非常复杂,DNS使用缓存技术来实现服务的健壮性。当递归nameserver解析tool.chianaz.com域名,再次收到tool.chinaz.com查询时,不会再进行递归解析过程,而是直接返回上次解析结果的缓存。并且是分层缓存的,也就是说,当它下次收到来自www.chinaz.com的query时,由于这个递归解析服务器已经知道chinaz.com的权威域名服务器,所以只需要将query发送给chinaz即可。com名称服务器向www发送查询,仅此而已。根域名服务器递归解析服务器如何知道根域名服务器的地址?根域名服务器的地址是固定的。目前全球共有13台根域名解析服务器。递归解析服务器中持久化了这13条记录:为什么只有13台根域名服务器?负载均衡不是越多越好吗?如前所述,DNS协议使用UDP查询。由于能保证性能的UDP查询的最大长度为512字节,为了让根域名服务器的所有数据都包含在512字节的UDP数据包中,根服务器只能限制在13字节。一,每个服务器必须使用字母表中的单字母名称进行智能解析。智能解析是指当一个域名对应多个IP时,当你查询这个域名的IP时,会返回离你最近的IP。由于国内不同运营商之间的带宽很低,电信用户访问联通IP是一场灾难,智能DNS解析可以解决这个问题。智能解析依赖于EDNS协议,EDNS协议是谷歌起草的DNS扩展协议。修改比较简单,就是在DNS包中加入源站客户端IP,这样nameserver就可以根据客户端IP返回距离客户端较近的服务器IP。国内最新支持EDNS的是DNSPod。DNSPod是国内比较流行的域名解析厂商。许多公司使用DNSPod来加速他们的域名。已被鹅厂收购为域名注册商。一般来说,如果我们要注册一个域名,我们需要找一个域名注册商。比如我要注册hello.com,那么我需要找com域名注册商注册hello域名。.com的域名注册商不止一家,这些域名注册商也都获得了ICANN的注册权。域名注册商会搭建自己的权威域名解析服务器。比如在GoDaddy上申请.com下的二级域名,就不需要搭建域名服务器。您可以直接在godaddy控制中心管理您的域名指向。原因就是您的新域名的权威名称服务器默认由域名注册商提供。当然,你也可以改变它。比如你在godaddy申请海外域名,把权威域名服务器改成DNSPod。一方面可以加快国内解析速度,另一方面还可以享受DNSPod提供的智能解析功能。使用bind搭建域名解析服务器由于网上介绍bind搭建的文章太多,这里不再赘述。喜欢做的朋友可以上网搜索搭建教程,一步步搭建本地nameserver。这里主要介绍bind的配置文件。bind的配置文件分为bind配置文件和zone配置文件两部分。、安全、主从等配置。最重要的是添加区域配置并指定区域配置文件。recursion开启递归分析功能。如果不是,那么这个bind服务只能作为一个权威的分析服务。当你的绑定服务是外部的时候,打开它会带来安全风险。如果您没有妥善防御,您的域名服务器将被黑客利用。制作broilerzone配置文件bind配置文件中指定zone的配置文件。下图是一个简单的zone配置:zone的配置是nameserver的核心配置,指定了DNS资源记录,比如SOA,A,CNAME,AAAA等记录,这个概念网上资料太多了各种记录,这里不再赘述。主要讲SOA和CNAME的作用。SOA记录SOA记录表示该域名的权威解析服务器地址。上面提到了权威解析服务器和递归解析服务器的区别。当所有的递归解析服务器都没有缓存你的域名解析时,就会回源请求这个域名的SOA记录,也叫权威解析记录的概念CNAMECNAME很像别名,它的处理也是如此逻辑。服务器在resloving时,发现name是一个CNAME,就会转而去查询这个CNAME的A记录。一般来说,哪里可以使用CNAME,哪里就可以使用A记录,那为什么要发明CNAME这种东西呢?将多个域名指向同一个IP是一种捷径,这样当最下层的CNAME对应的IP发生变化时,上层的CNAME就不需要改变了。就像我们代码中的hardcodes一样,我们总会把这些hardcodes去掉,用一个变量来表示,这样当这个变量发生变化的时候,我们只需要修改一个地方,在配置之后使用named-checkconf和named-checkzone做完了。命令查看我们的配置文件是否有问题,然后我们就可以启动bind服务了:$>servicenamedstartRedirectingto/bin/systemctlrestartnamed.service我们使用netstat-ntlp查看服务是否启动:53端口启动,然后我们测试一下效果,使用dig解析www.hello.com域名,使用127.0.0.1作为递归解析服务器,我们看到dig的结果是我们配置文件中配置的1.2.3.4,DNS完成了它的mission,根据域名IP获取,但是我们这里演示的IP明显是假IP:)使用DNS实现负载均衡给一个域名添加多条A记录,解析时使用轮询返回一个随机的,流量会被平均分类到多个A记录Record。wwwINA1.2.3.4wwwINA1.2.3.5复制代码在上面的配置中,我们在www域中添加了两条A记录。这种方法称为多宿主主机。它的作用是:当我们请求nameserver解析www.hello时。com域名,返回的IP会在两个IP之间轮换(默认行为,有些智能解析DNS会根据IP判断,返回一个离客户端较近的IP,距离请搜索DNS智能解析)。实际上,每次发起DNS解析请求时,nameserver都会返回所有的IP。如上配置,它将向客户端返回1.2.3.4和1.2.3.5。那么它是如何实现RR的呢?nameserver每次只返回一个不同的IP顺序,client会使用响应中的第一个IP来发送请求。DNS负载均衡vsLVS专业负载均衡与专业的负载均衡工具LVS相比,DNS层的负载均衡具有以下特点:实现非常简单。默认情况下,DNS只能通过RR进行调度。后端服务没有健康检查。DNS故障恢复时间比较长(DNS服务之间有缓存)可以加载的rs数量有限(受DNS响应包大小限制)实际场景中,也需要选择相应的根据需要制定负载均衡策略。子域名授权我们从.com域名申请了一个二级域名hello.com后,有一天我们公司扩容,需要拆分两个事业部A和B,公司给他们都分配了三级域名a。hello.com和b.hello。com,域名结构如下图所示:A部门和B部门经过一段时间的发展,内部业务过多,新产品需要频繁申请域名。管理权交给自己,他们的预期结构如下:注意第一阶段和第二阶段的区别:第一阶段,如果A部门想申请a.hello下的子域。com,需要向上级申请,整个a.hello.com域的管理在总公司;第二阶段,A部门先搭建自己的nameserver,然后总公司将a.hello.com域名的管理权交给自建的nameserver。域授权子域授权分为两个操作:A部门搭建自己的nameserver,在zone配置文件中指定a.hello.com的权威解析服务器作为自己的nameserver地址。总公司在名称服务器上添加一条NS记录,并把一个。hello.com域名授权给部门A的nameserver。我们在使用bind搭建域名解析服务器中提到的第一步,只需要在区域配置文件中指定SOA记录:@INSOAns.a.hello。comadmin.a.你好。com.(...)复制代码第二步在hello.com域的nameserver上添加一条NS记录:a.hello.comINNSns.a.hello.comns.a.hello.comINAxx.xx.xx.xx(自建nameserverIP)复制代码使得在解析xx.a.hello.com域名时,hello.comnameserver发现配置中有一条NS记录,并且会继续向下递归解析DNSDebuggingToolsOPS常用的DNS调试工具包括:host,nslookup,dig这三个命令都属于bind-utils包,即bind工具集,使用复杂度和功能增加反过来。网上的教程太多了,这里简单分析下dig命令的输出:dig有很多参数和函数,大家可以详细使用。其他DNS放大攻击DNS放大攻击是一种DoS攻击。流量占用目标机带宽,使目标机拒绝连接正常用户的请求而挂机。在一个正常思路的流量攻击中,黑客对目标机器创建大量的请求-响应,但这样做的问题是需要大量的黑客。因为服务器的带宽一般要比家庭网络的带宽大很多,所以如果我们自己家里的电脑被用作hack机的话,目标电脑的带宽还没有满,我们的带宽就已经超载了。原理DNS递归解析的过程比较特殊。我们可以通过一个几个字节的查询请求来交换数百甚至数千字节的解析响应(流量放大),而大多数服务器不会对DNS服务器进行防御。那么,黑客只要能够伪装DNS查询包的源IP,让DNS服务器向目标机器发送大量响应,就可以实施DoS攻击。但是,常用的DNS服务器会过滤攻击请求,因此寻找DNS服务器漏洞也是一个问题。如果对详细的放大攻击方法感兴趣,可以自行google,这里只是简单介绍一下:)