DNS or hosts ?
1、dns解析的流程
作为一名IT
攻(dǎ)城(gōng)狮(rén),肯定会听过、看过或者在你最初的面试中遇到过这个经典的问题:
当我在浏览器输入www.baidu.com
并回车后,直到显示百度的首页,这中间经历了什么?
这里的答案中的第一大步骤就是将域名解析成ip
的过程,具体来说其中在本地环境的流程如下:
当我们输入这个网址回车的时候,浏览器会首先查询浏览器的缓存,这个缓存存活时间可能只有1
分钟,如果没找到,则去查询本地的dns
缓存和hosts
文件,如果有www.baidu.com
这个域名对应的ip
,则直接通过这个ip
访问网站服务器。如果本地的dns
缓存和hosts
文件没找到,这时候就会把请求发送给网卡配置信息里的dns
服务器,默认有两个,只有当dns1
不能访问时,才会使用dns2
。我们也称网卡配置信息里的dns
为local dns
,这时候local dns
会先查询它的缓存,有没有www.baidu.com
相应的记录,如果有,则返回给用户,如果没有,就会访问根域名服务器进行后续的解析请求及响应流程
上面的流程提到了dns
缓存和hosts
文件,其中通过浏览器去访问网站时,涉及到在浏览器缓存和操作系统OS
缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问OS
缓存
2、dns缓存怎么处理
那么dns
缓存和hosts
文件,谁又排在前面呢?
答案当然是缓存,因此往往会出现尽管修改了hosts
文件,但是有时候并不会生效,发现还是会解析成之前的地址
不同的操作系统可以按照下面的方法去清除缓存
- Windows
ipconfig /displaydns # 查看当前已经缓存的域名
ipconfig /flushdns # 清空dns缓存
- Mac
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder # 不同版本可能会有区别
- Linux
现在很多Linux
发行版都没有内置DNS
本地缓存,在Linux
下无需刷新,因为除了做DNS
服务端的服务器之外,大多数本身并没有缓存(一种观点是服务器稳定运行时并不会有多少dns
请求)
这个观点不是本文重点,没有深究
当然,如果非要缓存刷新,可以安装nscd
,然后刷新这个守护进程
# Ubuntu
apt-get install -y nscd
# CentOS
yum install -y nscd
# 使用
service nscd restart
3、一个不常用的文件
前面聊到的都是常见的话题,本节提到的是关于linux
中一个不常用但很实用的内容
那就是在不考虑dns
缓存的情况下,hosts
文件/etc/hosts
和dns
配置文件/etc/resolv.conf
到底是先解析hosts
文件还是先解析dns
服务器呢
结论当然是hosts
文件为大,hosts
文件只要配置了某条解析记录,就不会去按照dns
的相关配置请求dns
服务器了
其实不然,我们是可以去通过某些配置控制这个顺序的,其重点就在于/etc/nsswitch.conf
文件
nsswitch.conf
(name service switch configuration,名称服务切换配置)文件位于/etc
目录下,由它规定通过哪些途径以及按照什么顺序以及通过这些途径来查找特定类型的信息,还可以指定某个方法生效或失效时系统将采取什么动作nsswitch.conf
中的每一行配置都指明了如何搜索信息,每行配置的格式如下:
Info: method[[action]] [method[[action]]…]
其中,info
指定该行所描述的信息的类型,method
为用来查找该信息的方法,action
是对前面的method
返回状态的响应,action
要放在方括号里
这个文件的工作原理:当需要提供nsswitch.conf
文件所描述的信息的时候,系统将检查含有适当info
字段的配置行。它按照从左向右的顺序开始执行配置行中指定的方法。在默认情况下,如果找到期望的信息,系统将停止搜索。如果没有指定action
,那么当某个方法未能返回结果时,系统就会尝试下一个动作。有可能搜索结束都没有找到想要的信息。
4、如何控制解析顺序
nsswitch.conf
文件的搜索顺序是从左到右,对于每一种信息类型,都可以指定下面的一种或多种方法
files | 搜索本地文件,如/etc/hosts |
---|---|
nis | 搜索NIS数据库,也叫yp |
dns | 查询DNS(只查询主机) |
compat | passwd、group和shadow影子文件中的±语法 |
修改配置很简单,替换两者顺序即可
# vim /etc/nsswitch.conf
hosts: file dns myhostname # 先hosts,再dns(file指的就是hosts文件)
# hosts: dns file myhostname # 先dns,再hosts
关于nsswitch.conf
文件的配置不深究,这里仅分析是否配置dns
及hosts
,以及此文件修改不同的顺序给dns
解析带来的情况
-
如果
hosts
未配置,DNS
也未配置,必定会报unknowns hosts
-
如果
hosts
未配置,DNS
配置,可能会报unknowns hosts
,因为DNS
服务器可能会解析慢导致unknown hosts
,或者会有些超时 -
如果配置
hosts
,DNS
配置,但是nsswitch
解析顺序是DNS
在前,hosts
在后,则情况和上面一样 -
如果配置
hosts
,DNS
配置,且nsswitch
解析顺序是hosts
在前,DNS
在后,则这种是比较好的配置方式,即默认方式
5、小结
在实际应用中,如果hosts
文件中有很多内容不方便维护,但又想去掉hosts
解析进行dns
拦截的效果,就可以仅通过简单修改nsswitch.conf
文件来达到目的
See you~
参考: