1. 什么是DNS
1.1 DNS
DNS,英文全称Domain Name System
,中文全称:域名系统。它作为将域名和IP地址相互映射的一个分布式数据库
,能够使人更方便地访问互联网。
DNS基于C/S架构
,同时使用TCP
和UDP
的53
号端口,当前,对于每一级域名长度限制是63个字符,域名总长度则不能超过253个字符。
区域传输
时使用TCP
,因为数据同步传送的数据量比一个请求和应答的数据量要多得多,因此为了保证数据的正确性,则使用基于可靠连接的TCP
。
域名解析
时使用UDP
协议,端口为53
。客户端向DNS服务器查询域名,一般返回的内容不超过512字节(UDP报文最大长度为512字节),用UDP
传输,不经过TCP
三次握手,大大提高响应速度。
1.2 DNS数据库的结构
DNS数据库的结构类似于UNIX文件系统
的结构。整个数据库(或文件系统)被描绘成一个倒置的树,root
节点在树的顶端。
在DNS中,root
通常被写为一个点号(.
),而且这个点号通常被省略了。
1.3 域命名空间
DNS的分布式数据库通过域名来进行索引。每个域名本质上就是一个大型逆向树的一条路径
。这棵逆向树被称作域命名空间
。
1.4 域
一个域(domain)
就是域命名空间中的一棵子树。
域的级别
-
顶级域是root的子域。
通用顶级域(generic top-level domains,gTLDS)
开始只有7个:com
/edu
/gov
/mil
/net
/org
/int
。后来还有aero
/biz
/coop
/info
/museum
/name
等国家代码顶级域(country-code top-level domains)
,指某一国家的顶级域。- 更多的顶级域
-
一级域也是
root
的子域(一级域和顶级域是同一概念
)。 -
二级域是一级域的子域,依次类推。
授权
通过授权(delegation)
,将域进一步划分成子域,每个子域都可以被授权给他组织来管理。被授权组织负责维护子域的所有数据。父域仅保留指向子域数据来源的指针,父域便可将查询者引到对应的子域管理者。
1.5 域名服务器和区域
存储域命名空间信息的程序被称作名称服务器(nameserver,简称NS)
或域名服务器
。NS
通常只拥有域命名空间
某一部分的完整信息。这一部分被称作区域(zone)
,区域的内容是从文件或另一个NS
加载而来。加载过后,这个NS便可宣称对该区域具有权威(authority)
。一个NS可以同时对多个区域具有权威。
DNS规范定义了两种域名服务器:
primary master 域名服务器
。从主机上的文件中读取区域数据secondary master 域名服务器
,现叫slave域名服务器
。从master域名服务器读取区域数据。
解析器
解析器(resolver)
就是访问NS
的客户端程序。
根域名服务器
根域名服务器知道每个顶级域的权威域名服务器的位置。顶级域域名服务器知道其子域的权威域名服务器的位置。依次类推。
目前有13个根域名服务器。根域名服务器对于解析来说十分重要,所以DNS提供了诸如缓存(caching)
等机制来减轻根域名服务器的负载。
2. DNS查询过程
-
在浏览器中输入
www . baidu.com
域名 -
先检查浏览器
DNS缓存
或本地的hosts文件
是否有这个网址映射关系,有则完成域名解析,无则下一步 -
查询设置的
本地递归域名服务器
,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。 -
如果要查询的域名,不由本地递归域名服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
-
如果本地递归域名服务器本地区域文件与缓存解析都失效,则根据本地递归域名服务器的设置(是否设置
转发器
)进行查询, -
如果未用转发模式(根提示模式),本地递归域名服务器把请求发至13台根域名服务器,根域名服务器返回该域名所在顶级域名(.com)的域名服务器地址,本地递归域名服务器把请求发至该顶级域名服务器,顶级域名服务器返回二级域名(
baidu.com
)的域名服务器地址,依次迭代查询下去,直到找到www.baidu.com
的映射。 -
如果用的是
转发模式
,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根域名服务器或把转请求转至上上级,以此循环。
不管是转发,还是根提示,都是把结果返回给本地递归域名服务器,本地递归域名服务器再返回给客户机
。
注意:本地域名服务器在向这些权威域名服务器发送查询请求时,都是查询的原始域名!
域名与IP之间的对应关系,称为记录(record)
。根据使用场景,"记录"
可以分成不同的类型(type)
,前面已经看到了有A记录
和NS记录
。
常见的DNS记录类型如下。
(1)A
:地址记录(Address)
,返回域名指向的IP地址。
(2)NS
:域名服务器记录(Name Server)
,返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。
(3)MX
:邮件记录(Mail eXchange)
,返回接收电子邮件的服务器地址。
(4)CNAME
:规范名称记录(Canonical Name)
,返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。
(5)PTR
:逆向查询记录(Pointer Record)
,只用于从IP地址查询域名。
3. 传统DNS中存在的一些问题
DNS劫持
又叫域名劫持
,就是在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则直接返回假的IP地址或者什么也不做使得请求失去响应,其效果就是对特定的网址不能访问或访问的是假网址。
利用DNS服务器进行DDOS攻击
正常的DNS服务器递归询问过程可能被利用成DDOS攻击。
假设攻击者已知被攻击机器IP地址,然后攻击者使用该地址作为发送解析命令的源地址。这样当使用DNS服务器递归查询后,DNS服务器响应给最初用户,而这个用户正是被攻击者。那么如果攻击者控制了足够多的肉鸡,反复的进行如上操作,那么被攻击者就会受到来自于DNS服务器的响应信息DDOS攻击。
DNS信息劫持
传统的DNS查询,使用udp协议
进行通信,如果在请求过程中攻击者对DNS的解析结果进行篡改,会导致DNS劫持。
DNS重定向
在请求时,攻击者将DNS查询请求重定向到流氓DNS服务器,也会导致DNS劫持。
DNS缓存中毒
DNS缓存中毒(也称为DNS欺骗,DNS污染)是一种利用域名系统(DNS)中的漏洞将 Internet 流量从合法服务器转移到虚假服务器的攻击。DNS缓存中毒通过欺骗DNS服务器保存伪造的DNS条目来起作用。黑客和破解者使用 DNS 缓存中毒将特定网站的访问者重定向到他们定义/期望的网站。
参考
[1] DNS 原理入门
[2] 知乎 - DNS解析的过程是什么,求详细的?
[3] 计算机网络