我们日常访问么个网站或者么个服务时,必须要知道对方IP地址才能通信。但是我们一般很难记住哪个IP地址对应的是哪个服务。为了方便我们区分哪个IP对应的提供了什么服务,便发明了域名。我们通过域名来访问我们想要的网站,例如www.baidu.com。但是域名不是IP地址,前面我们说想要上网需要指定具体的IP地址,这个时候就引入了我们的主角DNS,他的作用就是解析IP地址和域名的对应关系。
域名按照从右到左的顺序来划分层次结构,最右边的是最高级的根域,根域就是所谓的”.”,其实我们的域名www.baidu.com在配置当中应该是www.baidu.com.(最后有一个点),一般我们在浏览器里输入时会省略后面的点,浏览器会自动帮助我们加上。接下来就是顶级域又称一级域,一级域之后还有二级、三级域。如何区分当前域名是几级域,举个例子如:www.baidu.com
DNS服务器是能提供域名解析的服务器,域名每一层域都会有一堆域名(DNS)服务器,以上述案例www.baidu.com的为例:
根据域名服务器所起的作用,可以把域名服务器划分为以下四种不用的类型:
1、根域名服务器根
域名服务器是最高层次的域名服务器,所有根服务器都知道所有的顶级域名服务器的域名和IP地址,互联网上的根域名服务器只是用13个不同IP地址的域名(注意不是13台机器,一个IP通过负载均衡有很多服务器提供服务)。
2、顶级域名服务器
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答。
3、权威域名服务器
负责一个区域的服务器,例如上述中负责解析baidu的服务器就是权威服务器(只负责解析baidu的域)
4、本地域名服务器
我们上网的时候为了提供查询速度一般会先访问本地域名服务器
假如我们现在要访问www.baidu.com,流程如图所示:
首先,浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。其次,如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置(C:WindowsSystem32driversetchosts),如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
其中本机向本地域名服务器的查询一般称之为递归查询,本地域名服务器象根域名服务器等的查询称之为迭代查询。
在我们日常工作中,如果频繁的修改本地host文件,会出现因为存在dns缓存,从而导致修改的host文件没有生效,不能正确的解析域名。清除缓存的方法如下:
//展示系统缓存的域名解析
ipconfig /displaydns
//清除系统缓存的域名解析
ipconfig /flushdns
如图所示,用nslookup来查看域名www.163.com的解析情况:
SOA记录:域权威记录,说明本机服务器为该域的管理服务器图示案例因为访问的是本地dns服务器,所以显示非权威应答
A记录:又称正向解析记录把域名解析为IP
PTR记录:又称反向解析记录IP地址到域名的映射
cname记录:又称别名和linux系统中命令的别名,简化命令是一样的作用图示中的www.163.com.163jiasu.com和www.163.com.bsgslb.cn就是别名,访问这两个域名和访问www.163.com效果是一样的,即访问同一台机器(前提是服务端配置能允许访问这两个域名)
现在做个假设:假如攻击者劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致用户对该域名地址进行访问的时候,由原来的IP地址转入到修改后的IP地址。结果就是让正确的网址不能解析或者是被解析到另一个网址的IP,实现获取用户资料或者破坏原有网址正常服务的目的。
大家试想一下,如果2.2.2.2这台服务器上的www.qq.com和qq官方的页面做的一模一样(可以拷贝浏览器代码实现),那么我们登录QQ的时候,是不是就把自己的QQ帐号和密码透露给了黑客呢?
好在及时黑客真的攻陷了本地dns服务器,影响的范围也只是使用该被攻击的dns服务器的群主,不会有大范围的影响(根域名dns服务器除外)。
解决办法:(本地DNS服务器都是运营商分配的)1、直接用此IP代替域名后进行访问2、手动指定信任的/没有被攻击的DNS服务器
这里只介绍了dns的工作常识,关于dns如何在linux上部署或者想更深入学习dns(cdn相关的认识)的朋友可以参看书籍《DNS与BIND》