深入理解 DNS
简介
DNS(Domain Name System)域名系统,它是一个将域名和 IP 地址相互映射的一个分布式数据库,把容易记忆的主机名转换成主机 IP 地址。
DNS使用 TCP 和 UDP 端口 53。当前,对于每一级域名长度的限制是 63 个字符,域名总长度则不能超过 253 个字符。
DNS备份
为防止服务中断和网络攻击,全球共有13台根DNS服务器,严格意义上来说不是13台,而是13个服务集群,为什么是13?
专有名词
- FQDN:完整合法域名,也就是根域(绝对域名)
- NS:权威域名服务器
- 顶级域:用来指示某个国家 / 地区或组织使用的名称的类型名称,例如 .com
- 二级域:个人或组织在因特网上使用的注册名称,例如 google.com
- 子域:已注册的二级域名派生的域名,一般就是网站名,例如 www.google.com
- 主机名:标识网络上的特定计算机,例如 h1.www.google.com
DNS的基本解析流程
- 以客户端浏览器访问
www.lbinin.com
域名为例,首先,它会去检查当前浏览器缓存,如果有,就直接响应,如果没有,就继续往下找 - 接着,操作系统会去检查自己的 host 文件,如果从中没找到对应关系,会再到系统 DNS 缓存中查,如果缓存中有,就直接返回该域名所对应的 IP
- 如果缓存中没有,则会向我们事先设置好的 DNS 服务器 [ 一般有两个, 主 & 备 ] 去请求,即所谓的
递归查询
,DNS 服务器首先会到自身解析数据库中去查 - 如果 DNS 服务器在自己的解析库中也没找到,它就会自动帮我们向根发送询问请求
- 此时,根看到要请求的是
com
的后缀,就会把com
所在的 ns 服务器告诉我们的 DNS - 然后,我们的 DNS 服务器就会去请求
com
所在的 ns 服务器(权威域名服务器) - 当请求到达
com
ns 服务器时,com
一看域名是在lbinin
这个域下的,就会把lbinin
所在的 ns 服务器再告诉我们的 DNS 服务器 - 再然后,我们的 DNS 服务器就会去请求
lbinin
这个域的 ns 服务器 lbinin
这个域的 ns 服务器一看是要访问www
就直接找到了www
对应的「A记录」的 IP,并把它丢给我们的 DNS,上面逐个询问的过程,即迭代查询
- 最后,我们的 DNS 再把最终解析到的这个 IP 丢给我们的客户端,然后客户端就直接拿着去访问了。
流程总结
浏览器缓存 👉🏻 host 文件 👉🏻 系统 DNS 缓存 👉🏻 DNS 服务器进行「迭代查询」
其中上面 1-3 为递归查询。4-10 为迭代查询。
递归查询和迭代查询的区别
递归查询
客户端收到的是最终的查询结果
递归查询是一种 DNS 服务器的查询模式,在该模式下 DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果 DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。
迭代查询
客户端中途会收到下一台服务器地址
DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的 DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台 DNS 服务器地址,客户机再向这台 DNS 服务器提交请求,依次循环直到返回查询的结果为止。
资源记录类型
- A 记录 (Address Record)** **:FQDN -> ipv4
- AAAA 记录:FQDN -> ipv6
- NS (Name Servers)** 记录**:名称服务器;标明当前区域的 NS 服务器是谁
- MX (Mail Exchanger)** 记录**:邮件服务器;标明当前域内谁是邮件服务器
- PTR (Pointer Record)** 记录**:IP -> FQDN,反向区域解析
- SOA (State Of Authority Record)** 记录**:起始授权机构;一个解析库有且只有一个 SOA 记录,且必须为解析库的第一条记录
- CNAME 记录:别名,如:web.admin.org. IN CNAME www.admin.org. 表示当访问 web.admin.org. 时就直接解析到 www.admin.org.
TTL
Time to Live 即生存时间,就是一条域名解析记录在 DNS 服务器中的存留时间。
当各地的 DNS 服务器接受到解析请求时,就会向域名指定的 NS 服务器(权威域名服务器)发出解析请求从而获得解析记录;
在获得这个记录之后,记录会在 DNS 服务器(各地的缓存服务器,也叫递归域名服务器)中保存一段时间,这段时间内如果再接到这个域名的解析请求,DNS 服务器将不再向 NS 服务器发出请求,而是直接返回刚才获得的记录;到期则重复请求过程。
DNS 劫持
DNS 劫持又称「域名劫持」,是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的 IP 地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能访问或访问的是假网址。其实本质就是对 DNS 解析服务器做手脚,或者是使用伪造的 DNS 解析服务器可以通过下图来展示。
解决办法
不使用运营商的 NDS 解析,使用自己的或者著名的 DNS,如:114.114.114.114
和 8.8.8.8
内容劫持
其实内容劫持一开始的出发点是好的,是运营商为了加快用户的访问速度同时减少自己的流量损耗而做的一个缓存机制。
用户在像服务器请求数据的时候运营商会把用户的请求转移到这个缓存池中,如果缓存中有就直接返回,没有的话再去向服务器请求。然后运营商拦截并缓存服务端给用户的回调数据,这样一来可以极大的降低运营商像服务器请求的次数,也能加快用户的访问,所以出发点是好的。
但是一些非法的商家对缓存池内部做一些处理就是直接对返回的内容进行修改,这样一来我们就会接受到错误的数据。
常用命令
nslookup 域名
参考资料
DNS 深度理解 一 - klion’s blog
欢迎转载,转载请注明出处!
独立域名博客:flywill.com
欢迎关注公众微信号:Java小镇V
分享自己的学习 & 学习资料 & 生活
想要交流的朋友也可以加微信号备注入群:EscUpDn