DNS域名系统
前言
web前端你必须了解的DNS,下面讲解DNS的一些过程和由来以及产生的安全问题
关键词:DNS是什么、DNS的分布式、层次数据库、本地DNS服务器、DNS递归查询和迭代查询、DNS缓存、DNS劫持
什么是DNS
DNS即域名系统,全称是Domain Name System。当我们在浏览器输入一个URL地址的时候,浏览器要向这个URL的主机名对于的服务器发起请求,就得知道服务器的IP。对于浏览器来说,DNS的作用就是将主机名转换为IP地址。
DNS是:
- 一个由分层的DNS服务器实现的分布式数据库
- 一个使得主机能够查阅分布式数据库的应用层协议
也就是 DNS是一个应用层的协议,我们发送一个请求,其中包含我们要查询的主机名,他就会给我们返回这个主机名对应的IP。
其次,DNS是一个分布式数据库,整个DNS由分散在世界各地的很多台DNS服务器组成,每台DNS服务器上面都保存了一些数据,这些数据可以让我们查到最终主机名对应的IP
所以DNS的查询过程,本质上就是去向这些DNS服务器访问,直到查到这个IP为止。
分布式、层次数据库
什么是分布式
因为所有的主机不可能全部ip都放在一台dns服务器上面,所以就一台一台分出来,每台存储不同的数据,负责不同的映射。
什么是层次
DNS服务器有三种类型:根DNS服务器,顶级域DNS服务器和权威NDS服务器,
- 根DNS服务器
首先我们要明确根域名是什么?比如www.baidu.com
其实他的根域名是被隐藏的。真正的根域名是www.baidu.com.root
后面的.root
那么根DNS服务器的作用是什么?就是管理他的下一级,也就是顶级域DNS服务器。通过询问根DNS服务器,我们能查到该主机名对应的顶级域的ip是多少,从而继续向顶级域请求了解他的下一层。
顶级域服务器
除了前面提到的com是顶级域名,常见的顶级域名还有cn,org,edu等。然后顶级域管理的是权威DNS权威DNS
由各大厂商负责管理的域名,它可以返回最终的一个IP
服务器之间是如何继续交互的,继续往下看:
本地DNS服务器
上一层没有讲到本地DNS服务器,是因为他严格意义上不属于DNS的层次结构。
什么是本地DNS服务器?
每个ISP都有一台本地DNS服务器,比如小区,大学,机构等。都有一台或多台本地DNS服务器。当主机发出DNS请求的时候,该请求被发往本地DNS服务器,本地DNS服务器代理这些请求,将它们转发到DNS服务器中。好比Nginx
递归查询 迭代查询
其中com是顶级域名 n是权威域名
这个过程中,主机向本地DNS服务器请求就是递归查询
本地服务器向根DNS,顶级DNS和权威DNS发出的请求就是迭代查询
迭代的特点就是所有的都是由本地DNS发出 所有的接收也是回到本地DNS
当然不是所有的DNS查询都是这样的模式 DNS查询可以是递归的,也可以是迭代的 如下图就只是递归的
DNS缓存
为了让我们更快的拿到想要的IP,DNS广泛使用了缓存技术。DNS的缓存原理就是,在一个DNS查询的过程中,某台DNS收到了一个DNS应答的时候,就能将映射缓存到本地,下次查询就能直接用到缓存的内容。
but 缓存不是永久的,他也会定时删除。
所以有了缓存,很多时候都绕开了根DNS,所以需要向根DNS发起的查询请求很少。
DNS解析优化
主要分为两个方案
- DNS预解析
- 减少DNS请求
DNS预解析
DNS解析也需要时间的,可以通过预解析的方式来预先获取域名所对应的IP
link方式:手动解析1
<link rel="dns-prefetch" href="//blog.poetries.top">
meta方式:https自动解析1
<meta http-equiv="x-dns-prefetch-control" content="on">
设置响应头:自动解析1
ctx.set('X-DNS-Prefetch-Control', 'on')
DNS劫持
域名劫持就是在劫持的范围内拦截解析的请求,分析请求的域名,把审查范围之外的请求放行,否则直接返回假的IP地址或者什么也不做使其失去响应,效果就是特定的网址不能访问或者访问的是假的网址
域名劫持会影响用户体验,一方面还有可能被诱骗到冒牌网站进行登陆导致隐私泄漏
DNS可以有本地DNS劫持,路由DNS劫持,攻击DNS服务器
解决方法
- 加强本地的计算机病毒检查,开启防火墙,防止恶意软件,木马感染计算机等。
- 改变路由器默认密码,防止攻击者修改路由器的DNS配置指向恶意的DNS服务器。
- 企业可以准备两个or以上的域名,一个挂了用另外一个
- 用HTTP DNS 代替Local DNS
总结
DNS的内容其实讲深了还是很多的,但是基本的原理和概念还是要清楚,熟悉一下DNS解析的过程以及这个递归和迭代,关于域名这块以后还是会出文章,有购买域名的打算。