在我们写代码的过程中,尤其是模拟线上环境的时候,我们经常接触到hosts文件。

域名是如何定位到资源的

域名和IP

IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

我们可以通过一个IP地址去寻找到一台主机,或者说一台主机对应一个IP地址。

例如我们访问220.181.38.148这个IP,可以进入百度的首页。类似的,我们也可以通过访问其他网站的IP进入其首页。
然而通过IP地址访问网站门户具有很多的缺陷和问题,例如:

  • IP地址不便记忆
  • IP地址无法表现出网站门户的主要业务或性质。例如我们知道www.gov.cn是中国政府网,但是我们无法确认IP116.162.121.91是干嘛的。
  • 一个网站门户的IP地址在某些情况下会更换。如在负载均衡场景下,一个网站门户可以拥有多台主机,即拥有多个IP,在此场景下,如果有一台服务器挂掉,那么该主机的IP就无法正常为用户提供服务。
  • ......

出于种种原因,人们设计出域名,即用一串用点分割的名字组成的一台或计算机组的名称,可以解决上述缺陷和问题。

域名解析系统(DNS,Domain Name System)

能够寻找到主机的只有IP,而域名无法寻找到主机,为了解决这个问题,人们设计出DNS系统。
该系统可以将域名和IP地址相互映射,使人们可以通过域名直接映射到IP地址,从而定位到相应的资源或服务。

DNS系统是如何工作的

通常,在一台计算机上会有DNS服务器设置。
DNS服务器是一台专门提供DNS服务的服务器,当人们在计算机上通过域名访问某网站时,会映射到对应的IP。通常DNS服务器不止一个配置。

在计算机上,有一个特殊的文件——hosts,该文件的作用可以充当本地DNS服务器。
当人们通过域名访问某网站时,会首先去hosts文件中查找是否有对应的映射,如果没有则去DNS1(第一个DNS服务器配置)、DNS2DNS3...中寻找映射,直到找到为止。
即优先级为:hosts文件、DNS1DNS2...

如果找不到,则会出现DNS_PROBE_FINISHED_NXDOMAIN错误。

2dns错误

hosts文件

在任意一种支持网络的操作系统中,都存在hosts文件。
在Windows操作系统中,hosts文件存在于C:\Windows\System32\drivers\etc目录中;在类Unix系统中(Max OS、Linux等),hosts文件存在于/etc目录中。

其格式为:

127.0.0.1   localhost localhost1
172.18.0.2  master hadoop_master master.net

IP和域名中间使用TAB分割,如果一个IP需要解析到多个域名,域名之间使用空格隔开。

通过修改hosts文件,可以达到本地IP映射到域名的效果,模拟线上环境;同时也可以满足某些服务的特殊要求,如Hadoop的namenodeweb端,需要通过域名访问才可以正常上传。

修改hosts文件不生效的情况(系统代理)

一些同学有懂得都懂的上网需求,使用系统代理的软件,如Clash等。在使用系统代理时,由于通过域名访问的网站都会直接走系统代理的解析,会直接越过hostsDNS配置,因此不会生效。

解决方案:

方法一:更换软件,可以使用PAC代理模式的软件,如V2rayshadowrocketwin to ray等。

方法二:更改Clash的配置文件

3clash

点击Open Folder打开Clash的配置文件目录,找到config.yaml文件中cfw-setting字段或者cfw-setting.yaml文件,在bypassText字段下添加通过hosts文件自定义解析的域名:

4cfw

Nginx 反向代理不生效也可以用同样方法解决。