概述
DNS是一个缩写,可以代表Domain Name System,域名系统,是互联网的一项基础服务。也可以代表Domain Name Server,域名服务器,是进行域名和与之相对应的IP地址相互转换的服务器。DNS协议则是用来将域名转换为IP地址(也可将IP地址转换为相应的域名地址)。
当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。开始时,域名的字符仅限于ASCII字符的一个子集。
DNS解析,将域名翻译为可由计算机直接读取的IP地址。根据查询对象不同,DNS解析可分为递归解析和迭代解析两种方式。
使用TCP和UDP端口53,在进行区域传输时使用TCP协议,其它时候则使用UDP协议。
DNS的规范规定2种类型的DNS服务器,即主DNS服务器和辅助DNS服务器。在一个区中主DNS服务器从自己本机的数据文件中读取该区的DNS数据信息,而辅助DNS服务器则从区的主DNS服务器中读取该区的DNS数据信息。
Zone Transfer:区传送,当一个辅助DNS服务器启动时,它需要与主DNS服务器通信,并加载数据信息。
报文
DNS定义两种报文 :查询报文和响应报文,两者都有12个字节的头和查询问题。
公共DNS服务器
常用的公共DNS服务器
- 谷歌:主DNS:
8.8.8.8
,辅DNS:8.8.4.4
- Cloudflare:DNS:
1.1.1.1
- Norton ConnectSafe:主DNS:
199.85.126.10
,辅DNS:199.85.127.10
- 114DNS:部署在国内,主DNS
114.114.114.114
,辅114.114.115.115
- CNNIC:中国互联网络信息中心推出SDNS,主DNS
1.2.4.8
,辅DNS210.2.4.8
域名服务器
有以下几种类型
- 主域名服务器:负责维护一个区域的所有域名信息,是特定的所有信息的权威信息源,数据可以修改
- 辅助域名服务器:当主域名服务器出现故障、关闭或负载过重时,辅助域名服务器作为主域名服务器的备份提供域名解析服务。辅助域名服务器中的区域文件中的数据是从另外的一台主域名服务器中复制过来的,是不可以修改的
- 缓存域名服务器:从某个远程服务器取得每次域名服务器的查询回答,一旦取得一个答案就将它放在高速缓存中,以后查询相同的信息就用高速缓存中的数据回答,缓存域名服务器不是权威的域名服务器,因为它提供的信息都是间接信息
- 转发域名服务器:负责所有非本地域名的本地查询。转发域名服务器接到查询请求后,在其缓存中查找,如找不到就将请求依次转发到指定的域名服务器,直到查找到结果为止,否则返回无法映射的结果。
DNS记录
DNS Record,即由DNS构建起的域名与IP地址之间的对应关系。通过设置不同的解析记录,可以实现对主机名不同的解析效果,从而满足不同场景下的域名解析需求。域名解析记录主要有以下几种类型。
A记录
A(Address)记录是用来指定主机名(或域名)对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上,同时也可以设置域名的子域名。A记录就是指定域名对应的IP地址。如添加一条A记录将www.google.com
的主机指向IP192.168.1.1
,那么当你访问www.google.com
主机时就会解析到192.168.1.1
这个IP上。
CNAME记录
canonical name,通常称别名解析,是主机名到主机名的映射。当需要将域名指向另一个域名,再由另一个域名提供IP地址,就需要添加CNAME记录,最常用到CNAME的场景包括做CDN、企业邮箱、全局流量管理等。与A记录不同的是,CNAME别名记录设置的值不是一个固定的IP,而是主机的别名地址。
别名解析可以提供更大的灵活性,便于统一管理。比如,当主机因某种因素的影响需要更换IP时,如果域名做CNAME记录,就可以同时更新别名的解析指向,不需要进行新的解析操作。
NS记录
Name Server记录。如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录。NS记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析。NS记录中的IP即为该DNS服务器的IP地址。大多数域名注册商默认用自己的NS服务器来解析用户的DNS记录。DNS服务器NS记录地址一般以以下的形式出现:ns1.domain.com
、ns2.domain.com
等。
SOA记录
Start Of Authority,SOA,是起始授权机构记录,说明在众多NS记录里哪一台才是主要的服务器。在任何DNS记录文件中,都是以SOA记录开始。SOA资源记录表明此DNS名称服务器是该DNS域中数据信息的最佳来源。
SOA记录与NS记录的区别:NS记录表示域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析;SOA记录设置一些数据版本和更新以及过期时间等信息。
AAAA记录
AAAA记录是用来将域名解析到IPv6地址的DNS记录。用户可以将一个域名解析到IPv6地址上,也可以将子域名解析到IPv6地址上。国内大多数IDC不支持AAAA记录的解析,因此如果想进行AAAA记录解析,则需对域名NS记录设置一些专业的域名解析服务商,由他们提供AAAA记录的设置。
TXT记录
TXT记录,一般指某个主机名或域名的标识和说明。如:admin IN TXT “管理员, 电话:XXXXXXXXXXX”,mail IN TXT “邮件主机,存放在xxx , 管理人:AAA”,Jim IN TXT “contact: abc@mailserver.com”,也就是说,通过设置TXT记录内容可以使别人更方便地联系到你。TXT 记录常用的方式还有做 SPF 记录(反垃圾邮件)和SSL证书的DNS验证等。
MX记录
MX(Mail Exchanger)记录是邮件交换记录,主要用于邮箱解析,在邮件系统发送邮件时根据收信人的地址后缀进行邮件服务器的定位。MX记录允许设置一个优先级,当多个邮件服务器可用时,会根据该值决定投递邮件的服务器。
MX记录的权重对Mail服务非常重要,当发送邮件时,Mail服务器先对域名进行解析,查找MX记录。先找权重数最小的服务器,如果能连通,那么就将服务器发送过去;如果无法连通此服务器,才将邮件发送到权重更高的mail服务器上。
PTR记录
PTR是pointer的简写,即反向DNS,domain name pointer,是一个指针记录,用于将一个IP地址映射到对应的主机名,也可以看成是A记录的反向,即通过IP访问域名。
SRV记录
即服务定位(SRV)资源记录,用于定义提供特定服务的服务器的位置,如主机(hostname),端口(port number)等。
URL转发
URL转发,是指通过服务器的特殊设置,将当前访问的域名指向另一个指定的网络地址。根据目标地址的隐藏与否,URL转发可以分为显性URL和隐性URL两种。
显性URL:将域名指向一个http(s)协议地址,访问域名时,自动跳转至目标地址,地址栏显示为目标网站地址。
隐性URL:与显性URL类似,但隐性转发会隐藏真实的目标地址,地址栏中显示为仍为此前输入的地址。
共存冲突
记录类型也会有共存冲突,在RR(Resource Record)值相同的情况下,同一条线路下,在几种不同类型的解析中不能共存(X为不允许):
- X:在相同的RR值情况下,同一条线路下,不同类型的解析记录不允许共存。如:已经设置了www.example.com的A记录,则不允许再设置www.example.com的CNAME记录;
- 无限制:在相同的RR值情况下,同一条线路下,不同类型的解析记录可以共存。如:已经设置了www.example.com的A记录,则还可以再设置www.example.com的MX记录;
- 可重复:指在同一类型下,同一条线路下,可设置相同的多条RR值。如:已经设置
www.example.com
的A记录,还可以再设置www.example.com
的A记录。
解析步骤
可提供域名服务的包括本地缓存、本地域名服务器、权限域名服务器、顶级域名服务器以及根域名服务器。DNS主机名解析的查找顺序是,先查找客户端本地缓存,如果没有成功,则向DNS服务器发出解析请求。本地缓存是内存中的一块区域,保存着最近被解析的主机名及其IP地址映像。由于解析程序缓存常驻内存中,所以比其他解析方法速度快。当一个主机发出DNS查询报文时,这个查询报文就首先被送往该主机的本地域名服务器。本地域名服务器离用户较近,当所要查询的主机也属于同一个本地ISP时,该本地域名服务器立即就能将所查询的主机名转换为它的IP地址,而不需要再去询问其他的域名服务器。每一个区都设置有域名服务器,即权限服务器,它负责将其管辖区内的主机域名转换为该主机的IP地址。在其上保存有所管辖区内的所有主机域名到IP地址的映射。顶级域名服务器负责管理在本顶级域名服务器上注册的所有二级域名。当收到DNS查询请求时,能够将其管辖的二级域名转换为该二级域名的IP地址。或是下一步应该找寻的域名服务器的IP地址。根域名服务器是最高层次的域名服务器。每一个根域名服务器都要存有所有顶级域名服务器的IP地址和域名。当一个本地域名服务器对一个域名无法解析时,就会直接找到根域名服务器,然后根域名服务器会告知它应该去找哪一个顶级域名服务器进行查询。
递归查询
最常见也是默认的一种解析方式。如果客户端配置的本地域名服务器(Local DNS服务器)不能解析的话,则后面的查询过程全部由本地域名服务器代替DNS客户端进行查询,直到本地域名服务器从权威域名服务器得到正确的解析结果,然后由本地域名服务器告诉DNS客户端查询的结果。
递归解析的查询过程大致如下:
- 客户端向本机配置的本地域名服务器发起DNS域名查询请求
- 本地域名服务器收到请求后,会先查询本地缓存,如果有记录值会直接返回给客户端;如果没有记录,则本地域名服务器会向根域名服务器发起请求
- 根域名服务器收到请求后,会根据所要查询域名中的后缀将所对应的顶级域名服务器(如
.com
、.cn
等)返回给本地域名服务器 - 本地域名服务器根据返回结果向所对应的顶级域名服务器发起查询请求
- 对应的顶级域名服务器在收到DNS查询请求后,也是先查询自己的缓存,如果有所请求域名的解析记录,则会直接将记录返回给本地域名服务器,然后本地域名服务器再将记录返回给客户端,完成整个DNS解析过程
- 如果顶级域名服务器没有记录值,就会将二级域名对应的服务器地址返回给本地域名服务器,本地域名服务器再次对二级域名服务器发起请求,如此类推,直到最终对应区域的权威域名服务器返回结果给本地域名服务器。然后本地域名服务器将记录值返回给DNS客户端,同时缓存本地查询记录,以便在TTL值内用户再次查询时直接将记录返回给客户端
在整个递归查询过程中,除一开始客户端向本地域名服务器发起查询请求外,其余各个环节均是以本地域名服务器为中心进行迭代查询,DNS客户端一直处于等待状态,直到本地域名服务器发回最终查询结果。相当于,在整个查询环节中本地域名服务器承担中介代理的角色。
迭代查询
迭代查询则是指所有查询工作全部由客户端自己进行,除此之外,整个查询路径和步骤与递归查询没有太大区别。
首先客户端向本地域名服务器发起请求,如果本地域名服务器没有缓存记录,客户端便会依次对根域名服务器、顶级域名服务器和二级域名服务器等发起迭代查询,直到获得最终的查询结果。
在以下条件之一满足时,就会采用迭代解析方式:
- 在查询本地域名服务器时,如果客户端的请求报文中没有申请使用递归查询,即在DNS请求报文中的RD字段没有设置为1
- 客户端在DNS请求报文中申请使用递归查询,但所配置的本地域名服务器禁止使用递归查询,即在应答DNS报文头部的RA字段设置为0
对比
递归查询的查询方式为:当用户发出查询请求时,本地服务器要进行递归杳询。这种查询方式要求服务器彻底地进行名字解析,并返回最后的结果——IP地址或错误信息。如果查询请求在本地服务器中不能完成,那么服务器就根据它的配置向域名树中的上级服务器进行查询,在最坏的情况下可能要查询到根服务器。每次查询返回的结果如果是其他名字服务器的IP地址,则本地服务器要把查询请求发送给这些服务器,故进一步的查询。
迭代查询的查询方式为:服务器与服务器之间的查询采用迭代的方式进行,发出查询请求的服务器得到的响应可能不是目标的IP地址,而是其他服务器的引用(名字和地址),那么本地服务器就要访问被引用的服务器,做进一步的查询。如此反复多次,每次都更接近目标的授权服务器,直至得到最后的结果——目标的IP地址或错误信息。
根域名服务器为众多请求提供域名解析,若采用递归方式会大大影响性能。
常见问题
- DNS解析修改后没有立即生效
DNS解析完成后不会立即生效,全球刷新生效需要等待一定的时间。如果只是修改解析记录,刷线时间根据设置的TTL值而定。修改DNS解析服务器,则需要等待24-48小时才能实现全球服务器的同步生效。
- 添加解析记录失败,显示记录已存在
域名解析记录重复添加,删除相同的条目后,重新添加即可。为了避免出现此问题,最好是删除全部的默认记录之后,再重新添加。
- 解析后访问域名,显示的不是自己的网站
可能有多方面原因:1.设置URL转发,检查下解析记录中是否有该类型记录;2.可能遭到DNS劫持,先检查解析记录是否被篡改,认真核对解析记录,编辑更正有问题的项目,或删除记录重新添加;3.修改解析记录还没有生效,这种情况在确认解析记录无误之后,等待解析生效或刷新本地DNS缓存再试。
- 解析后访问域名,显示无法访问此网站。
查看域名指向的IP是否为网站所在主机的IP地址(即解析记录里设置的IP)。如正确,则问题可能出在网站方面;如不正确,可能有两方面原因:一是解析问题,检查核对解析设置;二是解析未生效,刷新本地DNS缓存,查看IP是否变为正确的了,不行的话等一会儿,等待解析生效后再试。
安全
DNS在设计之初只考虑实用性,没有相应的验证机制,安全性较低,经常成为网络攻击的重点对象。
针对DNS的攻击主要有两种:
- DNS DDoS攻击:Denial-of-service attack,拒绝服务攻击,对DNS服务器发动攻击,造成DNS服务器的线路拥堵或宕机。DNS服务器发生故障,将无法及时回应递归服务器发起的解析请求,从而会导致其所管辖的所有域名都无法正常解析,这样造成的危害比单独针对web服务器发起攻击要大得多
- DNS劫持:通过错误的域名解析记录代替正确的记录返回给客户端,将客户端引导至错误的IP地址,达到流量劫持,获取非法收益的目的。DNS劫持可通过DNS缓存投毒、修改NS记录等方式达成。
提升DNS安全的策略:
- 构建DNS外部安全防护体系:将边界路由器、防火墙策略、端口管理、负载均衡等软硬件防护策略结合起来,构建起坚实的外部安全防护体系
- 设置DNS内部安全策略:使用最新版的bind,可以消除软件设计上的明显漏洞,大大提升DNS安全性;通过DNSSEC安全协议为解析数据进行加密,从而确保DNS解析数据不被篡改
- 使用高防DNS:高防DNS,通过弹性宽带功能,可以有效抵御超大流量解析访问和恶意的DNS DDoS攻击,此外高防DNS具备流量清洗、健康监测和DDoS防火墙改功能,可以对DDoS攻击形成有效的清洗和防御
DNS劫持
DNS劫持的危害是双向多面的。对于用户而言,它通过将用户引导至与原网站十分相似的网站,并诱导用户输入账号、密码、身份证等敏感信息,从而造成个人信息泄露、财产损失等风险。对于企业机构而言,它会让企业机构失去对域名的控制权,导致站点不能访问,正常流量流失,业务无法正常运行,进而对企业形象和经济利益造成影响。
当客户端发起域名请求时,本地递归服务器(大多数情况下为运营商DNS)或公共DNS会通过向根域名服务器、顶级域名服务器到权威域名服务器一级一级查询,并将最终查询结果返回给客户端。
除了这种典型解析流程外,由于DNS缓存的存在,当客户端发起请求时,浏览器缓存、hosts文件、本地递归服务器DNS缓存会先将本地储存的解析记录直接告知客户端,从而省去全球递归查询的步骤。
从上面DNS解析流程中可以看出,一次完整的DNS查询具备以下两个特点:
- 链路长,查询过程包含多次、多级网络通信;
- 参与角色多,查询过程涉及客户端(浏览器缓存、hosts文件)、递归解析服务器、权威解析服务器等角色。
在一次完整DNS查询链路的各个环节,都可以通过技术手段将域名解析记录进行篡改,将域名指向劫持到错误的IP地址上。
类型
- 本地DNS劫持
- DNS解析路径劫持
本地DNS劫持是指发生在客户端侧的各类DNS劫持:
- 通过木马或恶意程序入侵客户端,篡改DNS缓存、hosts文件、DNS服务器地址等DNS相关配置
- 利用路由器漏洞入侵路由器,并针对路由器中的DNS缓存进行篡改
DNS解析路径劫持
指发生在客户端和DNS服务器网络通信间的DNS劫持方式。通过对DNS劫持报文在查询阶段的路径进行划分,又可将DNS劫持分为四类:
- DNS请求转发:通过中间盒子、软件等技术手段将用户发出的DNS请求重定向到由攻击者控制的流氓DNS服务器,从而将其重定向到恶意站点
- DNS请求复制:将DNS查询复制到网络设备,并在用户发起请求时先于正常应答返回DNS劫持的结果,这种方式表现为一个DNS查询抓包返回两个不同的应答
- DNS请求代答:通过利用网络设备或软件代替DNS服务器对DNS查询进行应答
- DNS缓存感染:指攻击者在递归解析服务器投入错误的缓存信息,当访问者发起解析请求时,递归服务器就会从DNS缓存中将错误的解析记录返回,从而将用户引导至错误的网站。
DNS污染
DNS污染又称域名服务缓存投毒,是指通过制作域名服务数据包,将域名指向不正确的IP地址。在正常的DNS解析过程中,下一级域名服务器会将从上游域名服务器获得的解析记录保存一段时间,当在TTL值失效之前,有相同域名的解析请求时,就会直接将解析记录告知客户端,而无需进行全球范围的递归查询,这样既加快查询时间,也降低服务器工作压力。
但在这个过程中,如果局域域名服务器的缓存受到污染,就会告知客户端错误的解析记录,从而将用户指向错误的网站。这种攻击方式,被称为DNS污染。
使用场景
- 某些网络运营商为了达成某些目的,对DNS进行某些操作,就会导致使用ISP正常上网设置无法通过域名访问正确的IP地址
- 如果掌握部分国际DNS根目录服务器或镜像,也可通过DNS污染方式,屏蔽对特定网站的访问,如Google、YouTube等
解决DNS污染
- 需要能够替换DNS解析服务器。通常,域名注册企业提供免费的DNS解析服务。域名提供商可以提供许多免费的DNS解析服务,并且其解析速度非常快,多组DNS服务器,可以更好地避免被DNS污染。
- 使用第三方DNS解析服务及CDN服务,CDN服务商会提供他们的DNS服务器解析服务和CDN的网络IP地址。
考题
主机PC对某个域名进行查询,最终由该域名的授权域名服务器解析并返回结果,查询过程如下。不合理之处为(A)。
A. 根域名服务器采用递归查询,影响性能
B. 根域名服务器采用迭代查询,影响性能
C. 中介域名服务器采用迭代查询,加重根域名服务器负担
D. 中介域名服务器采用递归查询,加重根域名服务器负担
参考
- 一文读懂DNS解析原理和流程
- 如何提升DNS解析安全?