DNS是域名系统,相当于互联网地址电话簿,DNS将baidu.com这样的域名解析为机器可以识别的服务器IP
DNS系统
DNS建立在UDP协议上
域名服务器
-
根域名服务器: .或者.root,一般都省略root直接是.
-
顶级域名服务器:
- 国家顶级域名: cn , jp , us等
- 通用顶级域名: com表示工商企业,net表示网络提供商,org表示非盈利组织,edu表示教育
-
二级域名/权威域名: baidu这种
-
www这种是二级域名下的一个主机名
工作模式:
- 一开始浏览器,操作系统和路由器都没有DNS缓存
- 你后面访问的网站会先访问浏览器,操作系统,路由器的DNS缓存,如果有的话就直接访问
- 如果没有就从根域名服务器拿顶级域名服务器的位置,这样一路拿下去
- 拿到之后把这个ip加缓存并访问
- 这些操作是由电脑配置的本地DNS服务器帮我们做的,电脑先在缓存中查,没查到向本地DNS请求,本地DNS在向各级服务器查
- 电脑请求本地DNS是递归查询,本地DNS请求各级服务器是迭代查询
工作过程:
- 浏览器向本地DNS发请求得到目标服务器的地址,然后三次握手和目标服务器建立连接(如果是HTTPS,还会多一个TLS握手)
- 请求的结果两种情况第一种是返回200,表示直接就是页面资源,就可以直接解析
- 第二种是返回301/302,这是重定向状态码,他会给你另一个重定向的url,电脑再去访问新的url,直到得到200
DNS劫持
DNS解析是域名=>ip的解析过程,DNS劫持就是在这个解析过程动手脚来让DNS解析指向错误的ip地址,往往是钓鱼网站或病毒下载源
- 本地DNS: 篡改你本地电脑或路由器的DNS缓存
- 中间人攻击在网络链路上拦截DNS请求并返回虚假的DNS响应,往往在公共WIFI网络中风险较高
- DNS服务器劫持,攻击DNS服务器
- 域注册商劫持:篡改域注册商的记录
检查:
- 如果网站支持HTTPS,会提示证书错误
- dig 域名来检查对比已知的正确IP是否一致
- 临时把DNS更换为公共DNS(如8.8.8.8或1.1.1.1),如果问题消失是本地运营商DNS被劫持
防范:
- 使用加密DNS
- 修改路由器默认密码来加固路由器
- 优先访问HTTPS
- 使用信誉良好的公共DNS
浏览器预解析
浏览器会扫描当前页面中所有的显式域名,进行预解析
但是隐藏域名,即某些域名由js控制着在特定时间,交互时才会显式,这种浏览器不会预解析,需要前端手动进行预解析
往head中添加预解析标签
vue中一般在加载组件时再进行预解析,注意必须添加到head中,所以是
const link = document.createElement('link')
link.rel = 'dns-prefetch'
link.href = `//${domain}`
document.head.appendChild()