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。我们也称网卡配置信息里的dnslocal 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/hostsdns配置文件/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文件的配置不深究,这里仅分析是否配置dnshosts,以及此文件修改不同的顺序给dns解析带来的情况

  • 如果hosts未配置,DNS也未配置,必定会报unknowns hosts

  • 如果hosts未配置,DNS配置,可能会报unknowns hosts,因为DNS服务器可能会解析慢导致unknown hosts,或者会有些超时

  • 如果配置hostsDNS配置,但是nsswitch解析顺序是DNS在前,hosts在后,则情况和上面一样

  • 如果配置hostsDNS配置,且nsswitch解析顺序是hosts在前,DNS在后,则这种是比较好的配置方式,即默认方式

5、小结

在实际应用中,如果hosts文件中有很多内容不方便维护,但又想去掉hosts解析进行dns拦截的效果,就可以仅通过简单修改nsswitch.conf文件来达到目的

See you~

参考: