聊聊host中ip/域名映射记录的解析规则

今天宝叔突然在群里发了个问题;
host做如下配置,a.com会指向哪里?或者说ping一下a.com结果会是什么?

127.0.0.1 a.com
192.168.4.106 a.com
192.168.4.105 x.com a.com
192.168.4.107 a.com x.com
127.0.0.1 a.com

what?host自上而下解析啊,这不妥妥的127.0.0.1么,一测试,啪啪啪的打脸了。。。输出的是192.168.4.106,为啥?


以下结论仅针对windows系统,linux系统的暂时还未测试,后面补充


先上结论

首先先上一下经过自己测试总结得出的结论,解决你的问题,如果你有兴趣,可以再往后看具体的解决流程(图有点多)
host配置:

ip 域名a 域名b 域名c

先看下基本测试结论

1、host的解析首先是自上而下的
2、同域名多条记录的时候,首域名记录(域名a这种)的优先级高于非首域名记录(域名b/c这种)
3、同样紧邻ip的 多条同域名记录,优先级遵循第一条,且 非127.0.0.1的优先于127.0.0.1的
4、同域名多条记录且均不紧邻ip的,遵循第一条
5、0.0.0.0 会产生主机记录但ping不通,因此不计入优先级计算范围

然后我们在细看一下

首先host文件会解析出多种域名ip的映射记录,大致有“A(主机)记录”记录、“CNAME”别名记录、PTR记录等。前两种用于域名正向解析,即从域名到ip,后面一种用于ip逆向解析即从ip找域名。今天说的主要是正向解析,暂时忽略PTR记录,来看下A主机记录和CNAME别名记录,如下

a.com
----------------------------------------
记录名称. . . . . . . : a.com
记录类型. . . . . . . : 1
生存时间. . . . . . . : 0
数据长度. . . . . . . : 4
部分. . . . . . . . . : 答案
A (主机)记录  . . . . : 192.168.4.106

a.com
----------------------------------------
记录名称. . . . . . . : a.com
记录类型. . . . . . . : 5
生存时间. . . . . . . : 0
数据长度. . . . . . . : 8
部分. . . . . . . . . : 答案
CNAME 记录  . . . . . : b.com

A主机记录即首域名(紧邻ip的域名)映射产生的记录,别名记录即非首域名映射到首域名上的记录。这两类记录大致遵守以下规则:
1、记录生成顺序自上而下且不覆盖,
2、同一域名可能产生多条主机记录和别名记录,
3、主机记录优先级高于别名记录,
4、多条主机记录中,非127.0.0.1和0.0.0.0的ip主机记录优先级最高,其次是127.0.0.1的,最后是0.0.0.0,但是当仅有0.0.0.0的记录时,你会发现是ping不通的;

再回头看一下之前的基本结论就比较容易理解了~~,然后根据这个结论在看前面的问题就很明显了,妥妥的192.168.4.106


再看过程

接着我们聊一下我们的探寻思路。
首先,host文件的作用大家都清楚的,加速及实现域名解析。说加速可以从浏览器解析域名的流程的角度来理解,正常情况下浏览器输入一个url之后会去做域名解析找到对应的IP,这个解析过程一般会经过

  • 浏览器DNS缓存
  • 本地host配置
  • DNS服务器
  • 上层root server

等几个流程(前面一个流程解析到了就返回)。在host中配置之后相当于提前了一步域名的解析,也就是我们说的加速。解析就不必说了,实现域名到ip的转换,比如一些内部域名,没有做外网解析,这个时候如果系统内部没有相应的DNS服务器去做解析,那就去配host吧。

日常开发中,改host一般就是新加一条

192.168.4.106 a.com

但是,经常改的话就会出现最前面的问题,一堆重复的配置,最终究竟该解析到哪里?

怎么解?第一个想到的肯定是测试啊,清空host(记得备份。。。),只保留一下配置

127.0.0.1 a.com

这个时候,在命令行窗口输入ipconfig /displaydns,这个命令会显示DNS解析程序缓存的内容(windows下的),下一篇说下相近的几个命令,要不这里太长了。。。
这是可以得到如下结果

这个时候我们ping一下a.com,会发现a.com指向了127.0.0.1。接下来我们再改下host

127.0.0.1 a.com
192.168.4.102 a.com

再命令行先输入ipconfig /flushdns清一下dns的缓存,再ipconfig /displaydns会发现

在ping一下

继续改host

127.0.0.1 a.com
192.168.4.102 a.com
192.168.4.103 a.com

继续清DNS缓存,查DNS缓存


从这几个,我们就可以得出我们的前两条结论
host的解析首先是自上而下的
非127的优先于127.0.0.1的

然后我们继续改,继续打脸。。。

127.0.0.1 a.com
192.168.4.102 test.com a.com
192.168.4.103 a.com

你猜输出啥,上图


这个时候a.com解析到了两个部分里面,一部分是红色圈出的“A(主机)记录”,一部分是“CNAME”记录,主机记录也就是默认解析了。CNAME记录又是啥?CNAME记录意味着多个域名映射到了一个IP上,这时只有ip后面紧邻的域名(首域名)会生成“A(主机)记录”,而其他后续的域名会解析成首域名的别名记录,也就是CNAME记录。而CNAME记录在dns解析中的优先级是低于“A(主机)记录”的。
这也就得出了另一条结论,
同域名多条记录的时候,域名紧邻ip(域名1这种)的优先级高于非紧邻的(域名2/3这种)
然后,继续改host

127.0.0.1 a.com
192.168.4.102 test.com a.com
192.168.4.103 c.om a.com

在改

127.0.0.1 a.com
0.0.0.0 a.com
192.168.4.102 test.com a.com
192.168.4.103 c.om a.com

在改

0.0.0.0 a.com
127.0.0.1 a.com
192.168.4.102 test.com a.com
192.168.4.103 c.om a.com

我就不截图了,有点多,可以发现
0.0.0.0的映射虽然可以产生一条主机记录但是本身不起作用的,只配置0.0.0.0 a.com的时候,是ping不到a.com的

综上我们就大致的出了本文的结论啦,大家有兴趣可以自己在试一下,如有错误欢迎指出~


posted @ 2018-07-19 21:26  木子墨  阅读(14058)  评论(0编辑  收藏  举报