简单科普下 hosts 文件原理与制作

3,582
原文链接: laod.org

hosts文件是一个用于储存计算机网络中各节点信息的计算机文件。这个文件负责将主机名映射到相应的IP地址。hosts文件通常用于补充或取代网络中DNS的功能。和DNS不同的是,计算机的用户可以直接对hosts文件进行控制。

为了方便用户记忆,我们将IP变成一个个的域名来输入到浏览器进行访问。而这使得访问网站时要先将其域名解析成 IP 。DNS (Domain Name Server) 的作用就是进行 IP 解析,把域名对应到 IP。
在 Great FireWall 的 5 种封锁方法中,有一种简单而效果很好的方法是 DNS 污染。GFW 会对 DNS 的解析过程进行干扰,这会使对某些被干扰的域名返回一个错误的 IP 地址给你的主机,使你无法正确连接到你要的服务器上读取正确的信息。

Hosts 文件本来是用来提高解析效率。在进行 DNS 请求以前,系统会先检查自己的 Hosts 文件中是否有这个地址映射关系,如果有则调用这个 IP 地址映射,如果没有再向已知的 DNS 服务器提出域名解析。也就是说 Hosts 的请求级别比 DNS 高。当你的 Hosts 文件里面有对应的 IP 时,它就会直接访问那个 IP,而不用通过 DNS。

所以,当我们直接将 Google、Twitter、Facebook 之类的 IP 放入 Hosts 文件后,就可以跳过 DNS 的解析这一步,直接就行 IP 访问,不受 GFW 的 DNS 污染干扰了。

补充一条,就是为什么 Hosts 的 IP 要时不时更改,为什么 FB、Twitter 会仍旧上不去。是因为 GFW 的第二个大招,IP 封锁。比如访问国外一个 IP 无法访问,Ping 不通,tracert 这个 IP 后发现,全部在边缘路由器 (GFW) 附近被拦截。换言之,GFW 直接拦截带有这个 IP 头的数据包。所以,如果你更改的 IP 被封锁了,就算你过了 DNS 这一关,也仍旧不能翻过 GFW。

所以hosts才会频繁的更新新的ip、域名。

有很多人问:“怎么制作Google hosts?”

首先要弄明白https、“google.com”(域名)、ip地址、ping都是做什么的。

1、先说https,Hypertext Transfer Protocol Secure是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。简单的说就是加密的http协议。说到http协议,大家应该都知道默认是采用80端口,而https协议默认为443端口。

2、域名,简单说就是ip地址的名字,好记呗。上面问题中的“google.com”还 不算是完整域名,而是一个域 的名字(简称域)。有人说前面要加的“www”前缀,又叫主机,与域形成完整域名“www.google.com”。这就是为什么要加”www”,因为“google.com”是一个域,只有指出某一主机才能ping。问题又来了,可为什么有时只用域,如“google.com”也能ping,也能打开网页呢?这是因为在DNS中特别设置了主机解析记录。(个人自认为做了这个设置的都是注重细节的好网站)跑偏了。。。

3、ip地址,估计不需要多说了。

4、ping,网络测试工具,当然用来获得ip是可行的。

5、GoGo Tester寻找IP作为最后解决方案(目前成功率很低)

http与https

http是HTTP协议运行在TCP之上。所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份。

https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。

封域名/内容过滤,用http协议发送数据的时候,墙检测到你要发送的域名,然后给你过滤掉,返回空或者出错等。用https可以解决这个问题,因为墙不知道你发送的是什么数据。如果用了https,因为无法检测内容,所以墙会在dns解析的时候,返回给你错误ip,dns没有加密,所以同样虽然用了https,但由于dns解析错误,还是无法访问网站。所以在hosts给域名指向正确的ip,那么我们就可以跨越过“长城”了。

https 网站如何制作hosts?如获得https://google.com 的ip地址,ping命令不行。
从1中可知,http和https都是协议,区别只是对应端口不同。那么ip呢?其实“http://google.com“与“https://google.com“在ip解析时是一样的,只是指向了不同端口,这个端口是TCP端口。
所以在ping时,是不需要加协议前缀的。只需要ping域名就ok。
hosts中同理。