简介
DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住IP。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传从而保证可靠性。在两种情况下会使用 TCP 进行传输:
- 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。
- 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。
DNS查找过程
DNS解析是一个递归查询的过程。
- 浏览器访问 www.baidu.com
- 查找浏览器缓存
- 查找dns解析器缓存host
- 查找本地dns服务器缓存
- 查找根dns服务器缓存,找到了返回对应后缀的dns服务器地址ip(比如com DNS服务器)
- 查找com dns服务器,返回baidu.com的dns服务器ip
- 查找baidu.com dns服务器ip
- 得到baidu.com服务器ip,写入缓存。
- 浏览器拿到ip进行访问。
首先在本地域名服务器中查询IP地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com顶级域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到google的IP地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: com -> google.com -> www.google.com。但是你是否发现少了点什么,根域名服务器的解析过程呢?事实上,真正的网址是 www.google.com.,并不是我多打了一个.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上,所有网址真正的解析过程为: . -> .com -> google.com. -> www.google.com.。
使用的协议
- TCP:与服务器建立TCP连接
- IP:建立TCP协议时,需要发送数据,发送数据在网络层使用IP协议
- OSPF:开放最短路径优先协议,是由Internet工程任务组开发的路由选择协议
- ARP:路由器在与服务器通信时,需要将ip地址转换为MAC地址,需要使用ARP协议
- HTTP:在TCP建立完成后,使用HTTP协议访问网页
DNS的记录类型
其中CNAME解析就是将域名解析到另一个域名。
DNS负载均衡
不知道大家有没有思考过一个问题: DNS返回的IP地址是否每次都一样?如果每次都一样是否说明你请求的资源都位于同一台机器上面,那么这台机器需要多高的性能和储存才能满足亿万请求呢?其实真实的互联网世界背后存在成千上百台服务器,大型的网站甚至更多。但是在用户的眼中,它需要的只是处理他的请求,哪台机器处理请求并不重要。 DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。大家耳熟能详的CDN(Content Delivery Network)就是 利用DNS的重定向技术,DNS服务器会返回一个跟用户最接近的点的IP地址给用户,CDN节点的服务器负责响应用户的请求,提供所需的内容。
DNS劫持与污染
DNS劫持
DNS决定的是我们的域名将解析到哪一个IP地址的记录,是基于UDP协议的一种应用层协议。这种攻击的前提是攻击者掌控了你的本地DNS服务器
攻击者劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致用户对该域名地址进行访问的时候,由原来的IP地址转入到修改后的IP地址。结果就是让正确的网址不能解析或者是被解析到另一个网址的IP,实现获取用户资料或者破坏原有网址正常服务的目的。
简单来说就是就是ip解析请求发送到了其他DNS服务器了,给你返回了一个错误的ip。
DNS污染
又称域名服务器缓存投毒(DNS cache poisoning),它和DNS劫持的不同之处,在于污染针对的是DNS缓存,是在查询信息到达目标DNS服务器前,经过的节点上做手脚,而劫持是DNS服务器中记录的是错误的内容。