DNS详解

3 阅读3分钟

DNS是域名系统,相当于互联网地址电话簿,DNS将baidu.com这样的域名解析为机器可以识别的服务器IP

DNS系统

DNS建立在UDP协议上

域名服务器

  1. 根域名服务器: .或者.root,一般都省略root直接是.

  2. 顶级域名服务器:

    1. 国家顶级域名: cn , jp , us等
    2. 通用顶级域名: com表示工商企业,net表示网络提供商,org表示非盈利组织,edu表示教育
  3. 二级域名/权威域名: baidu这种

  4. www这种是二级域名下的一个主机名

工作模式:

  1. 一开始浏览器,操作系统和路由器都没有DNS缓存
  2. 你后面访问的网站会先访问浏览器,操作系统,路由器的DNS缓存,如果有的话就直接访问
  3. 如果没有就从根域名服务器拿顶级域名服务器的位置,这样一路拿下去
  4. 拿到之后把这个ip加缓存并访问
  5. 这些操作是由电脑配置的本地DNS服务器帮我们做的,电脑先在缓存中查,没查到向本地DNS请求,本地DNS在向各级服务器查
  6. 电脑请求本地DNS是递归查询,本地DNS请求各级服务器是迭代查询

工作过程:

  1. 浏览器向本地DNS发请求得到目标服务器的地址,然后三次握手和目标服务器建立连接(如果是HTTPS,还会多一个TLS握手)
  2. 请求的结果两种情况第一种是返回200,表示直接就是页面资源,就可以直接解析
  3. 第二种是返回301/302,这是重定向状态码,他会给你另一个重定向的url,电脑再去访问新的url,直到得到200

DNS劫持

DNS解析是域名=>ip的解析过程,DNS劫持就是在这个解析过程动手脚来让DNS解析指向错误的ip地址,往往是钓鱼网站或病毒下载源

  1. 本地DNS: 篡改你本地电脑或路由器的DNS缓存
  2. 中间人攻击在网络链路上拦截DNS请求并返回虚假的DNS响应,往往在公共WIFI网络中风险较高
  3. DNS服务器劫持,攻击DNS服务器
  4. 域注册商劫持:篡改域注册商的记录

检查:

  1. 如果网站支持HTTPS,会提示证书错误
  2. dig 域名来检查对比已知的正确IP是否一致
  3. 临时把DNS更换为公共DNS(如8.8.8.8或1.1.1.1),如果问题消失是本地运营商DNS被劫持

防范:

  1. 使用加密DNS
  2. 修改路由器默认密码来加固路由器
  3. 优先访问HTTPS
  4. 使用信誉良好的公共DNS

浏览器预解析

浏览器会扫描当前页面中所有的显式域名,进行预解析

但是隐藏域名,即某些域名由js控制着在特定时间,交互时才会显式,这种浏览器不会预解析,需要前端手动进行预解析

往head中添加预解析标签

vue中一般在加载组件时再进行预解析,注意必须添加到head中,所以是

const link = document.createElement('link')
link.rel = 'dns-prefetch'
link.href = `//${domain}`
document.head.appendChild()