change-hosts-for-wall

【2.1】修改HOSTS文件实现翻墙的原理及方法

得以前上网需要到墙外的时候,我总依赖于 VPN,比如蓝灯,赛风,总的来说这两款翻墙软件使用起来的相对简单,轻轻松松就翻到墙外。但缺点也很明显,比如他们的访问速度比较慢,偶尔也会抽抽风,有时候会出现不能使用的情况。关键的一点还是每个月都有流量限制,比如蓝灯每个月限制 800 M,这点流量用来查一些资料勉强能够支撑一个月,但是如果你需要看一些视频的话,那么你就只能付费了。因此,后来我也放弃使用VPN,直接使用 HOSTS文件翻墙。

读完本文,你将了解到:

  1. 修改 HOSTS 文件实现翻墙的原理
  2. 修改 HOSTS 文件实现翻墙的方法
  3. 如何获取现成的 HOSTS 文件

一、 修改 HOSTS 文件实现翻墙的原理

1.1   当你输入某个域名并回车的时候,浏览器都帮你做了什么?

想理解清楚修改 HOSTS 文件实现翻墙的原理,我们还得从这里说起,首先你要明白当我们输入某个我们想要访问的域名之后发生了什么?比如说我们现在想访问简书首页的话,那我们在浏览器上输入域名:http://www.jianshu.com/ ,这个时候,浏览器帮我们做了以下几件事:

第一步:域名解析

穿梭在互联网上的数据包基本都是以 IP 包的形式,如果你想访问简书首页的话,那么你就需要 简书服务器的 IP 地址。因此,浏览器第一步要做的就是把你刚才输入的域名解析成服务器的 IP 地址。解析成 IP 地址并不是一步到位,他包括以下几个步骤:

1) DNS 进程先检查浏览器程序的缓存(这里的缓存主要存放IP和域名的键值对,用于提高访问速度,将 IP 保存在内存中有助于下次需要时可直接使用,而不需要继续进行第二步),如果有[ http://www.jianshu.com/ ]所对应的 IP 的话,那么直接返回该域名的 IP 地址给浏览器。如果没有的话,则跳到 2)

2) 检查本地的 HOSTS 文件( windows 系统下,HOSTS 文件存放的路径为: C:\Windows\System32\drivers\etc ,linux下的存放路径为:/etc/hosts 。文件内部的存储结构如下,以键值对的形式存放着 IP 地址和域名,他们中间以空格隔开),如果有的话,则将查找到的 IP 地址告诉浏览器,并保存在缓存中,方便下次使用。如果还是没有的话,那么就必须请求本地 DNS 服务器了,跳到第 3 )。

3) 检查本地的 DNS 服务器,如果本地 DNS 服务器中有该域名对应的 IP,那么直接返回,如果没有的话,则继续4)。这个 DNS 通常是给你提供本地互联网接入的一个 DNS 服务器,即互联网的应用接入商,一般是电信或者联通。如浏览器缓存一样,这个 DNS 服务器中也有自己的缓存,他会把每次向上级服务器申请得到的域名即 IP 地址保存在自己的缓存中,以便下次如果有相同的申请的话可以直接返回。

4) 如果在本地的 DNS 服务器中仍没有查找我们想要的 IP 地址的话,那么直接到 Root Server 域名服务器即根域名服务器中请求解析。根域名服务器返回给本地服务器一个所查询到的主域名服务器IP地址,本地服务器再层层返回直到IP地址落入浏览器的手上,那么本次的域名解析结束。

1.2  我们为什么上不了外网?

看到这里你也许会有个疑问,既然 Root Server 总会返回一个IP地址,也就是说我们能与想要访问的服务器建立连接,那为什么我们还需要翻墙上外网呢?这一切还是 Great FireWall(防火长城)的功劳,具体是什么请自行百科。下面简单介绍下 Great FireWall 几个简单的工作原理:

  1. IP封锁 :IP封锁是指防火墙中维护一张IP黑名单,一旦发现发有黑名单中地址的请求数据包,那么就直接将该包丢弃,这也导致了我们的请求得不到目标主机的及时响应而引发超时,从而达到屏蔽对目标主机的访问的目的。

  2. DNS污染 : 域名服务器缓存污染,又称域名服务器缓存投毒,是指一些刻意制造或无意中制造出来的域名服务器封包,把域名指往不正确的IP地址,你可以理解为本来我想访问的是简书的首页,那么他应该返回给我一个简书首页的IP地址,结果他却给我返回一个新浪首页的地址。一般来说,在互联网上都有可信赖的域名服务器,但为减低网络上的流量压力,一般的域名服务器都会把从上游的域名服务器获得的解析记录暂存起来,待下次有其他机器要求解析域名时,可以立即提供服务。一旦有关域名的局域域名服务器的缓存受到污染,就会把域名内的电脑导引往错误的服务器或服务器的网址。

通过以上的两个技术,其他还有其他一些技术,如果有兴趣可以自行百科,当我们发送某个国外网站的请求的时候,DNS服务器总会返回给我们一个错误的IP地址或者这个请求被丢弃导致timeout,我们也因此无法访问国外的网站。

二、 修改 HOSTS 文件实现翻墙的方法

前面的域名解析部分已经讲得很清楚了,假如我们想访问一个外网的域名如【 www.youtube.com 】,如果我们不修改 hosts 文件的话,那么这个解析过程就必须经过一个以上的  DNS 服务器,那么返回给我们的总是一个错误的 IP 地址,也就是说你永远访问不了外网,永远被关在墙内。那么如果我们想到墙外的话,我们就必须抢在第三步之前,即在第二步中,我们在 hosts 文件中添加这个域名所对应的IP地址,当我们需要访问这个域名的时候,我们就有了指向目标服务器的正确 IP 地址,即我们可以访问这个域名对应的服务器(前提你添加的 IP 地址也要正确)。说了这么多,我们下面来做一个简单的例子:

在没有修改hosts文件之前,如果我想访问 www.youtube.com 网站的话,会出现以下这个结果:

我们可以看到的是,我们根本无法访问这个网站。那么,按照刚才的思路,我们往 hosts 文件中添加一行:

216.58.200.192  www.youtube.com 

保存之后,神奇的事情就发生了,我们可以正常访问 youtube 主页了。原理其实也很简单,就是上面我们所说的当第一步没有关于 www.youtube.com 域名对应的缓存的时候,于是到第二步hosts文件中去查找,因为hosts文件中存在 www.youtube.com 的IP于是返回告诉浏览器,这时候我们就不用到第三步和第四步去查找,也就不会发生DNS混淆了,我们也就能正确访问youtube主页。

        同理,当你想访问其他网站因为墙的问题而访问不了的话,那么你可按照上面的步骤,到网上搜到该域名对应的IP,然后添加进 hosts 文件即可。

注意:

修改hosts后生效方法:

Windows

开始 -> 运行 -> 输入cmd -> 在CMD窗口输入
ipconfig /flushdns

Linux

终端输入

sudo rcnscd restart

对于systemd发行版,请使用命令

sudo systemctl restart NetworkManager

如果不懂请都尝试下

Mac OS X终端输入

sudo killall -HUP mDNSResponder

Android

开启飞行模式 -> 关闭飞行模式

通用方法

拔网线(断网) -> 插网线(重新连接网络)

如不行请清空浏览器缓存(老D建议不要使用国产浏览器,请使用谷歌Chrome浏览器)。前面解析域名的时候我们说过,第一步中程序缓存存在着之前访问过的域名的IP,如果你更新了 HOSTS 文件而不刷新缓存的话,那么你此次更新还是无效的,得等到你下次刷新 DNS 缓存的时候。

如何获取某个域名可用的 IP

关于这点,其实查找起来是比较困难的,至少我用的方法是这样,如果你有更好的办法,欢迎私信告诉我。下面我们以 www.youtube.com 为例:

  1. 第一种比较简单的方法,进入命令行,输入 nslookup -vc www.youtube.com 8.8.8.8(如果你想查找别的域名,替换掉域名即可),这个时候,显示的结果如下:

我们看到 Addresses 行,如果你用的是学校的网的话,那么二话不说你直接可以将第一行的IPV6 地址写到 hosts文件 中,格式同 IPV4 的一样,这样子一定可以运行。

如果你不是教育网的话,那么就得把下面的 IPV4 地址一个一个试了,因为并不是每个 IP 都能用的,有的可能被封掉了,那么你如何判定一个IP可用呢?

telnet + IP + 443 端口,如何页面跳到一个黑色的页面,那么恭喜这个 IP 是可用的,如果无法打开到主机的连接,那么这个 IP 为不可用,你只能试试别的,下面我来演示一下:

我们测试到 74.125.23.138 地址不可用,那么我们也没必要将他添加进 hosts 文件中。我们可以试试其他的几个,但是经过测试这几个 IP 都是不可用,我们只能从其他途径获取其他 IP。我经常去的网站是  ping.chinaz.com ,输入你想访问的域名,如  www.youtube.com,那么下面会出现一些 IP , 一般超时的话表示这个 IP 对于我们来说不可用,我们必须找其他有响应的 IP 地址,重复 telnet 操作,直到找到能用的 IP . 我们找到其中一个可用的IP :

telnet 一下,如果出现以下黑色的页面,那么就说明这个IP是可用的,你只需要将这个IP和对应的域名写进 hosts 文件即可。

以上即为查找可用 IP 的简单介绍。

三、 如何获取现成的HOSTS文件

有时候你也许会觉得,我只是想翻个墙,上个 youtube 看看视频,上上 Twitter 发发推特,并无其他需求,就这么麻烦?那我还不如直接花钱买个 VPN 算了。是的,没错,有时候找个能用的IP的确很困难,确实要花掉我们很多时间,我们还不如把时间花在正确的事情上。但是,网上也有很多别人已经收集好的 IPV6 文件和 IPV4 文件,他们会不定期更新这些文件,确保当一些 IP 被封掉之后替换成别的能用的IP。你要做的工作也很简单,就是当发现某个网站上不了的话,去更新一份新的文件就行。

在这里我主要介绍两个网站,一个关于 IPV6 的 hosts 文件,另一个关于 IPV4 的 hosts 文件,如果你当前网络支持 IPV6,建议用 IPV6,如果不支持可以用 IPV4.

IPv6(Internet Protocol version 6,互联网通讯协定第6版)是被指定为IPv4继任者的下一代互联网协议版本。Pv6具有比IPv4大得多的地址空间。这是因为IPv6使用了128位元的地址,而IPv4只用32位元。因此新增的地址空间支持2的128次方(约3.4 &TImes;10E38)个IP地址。这种扩展提供了灵活的地址分配以及路由转发,并消除了对网络地址转换(NAT)的依赖。

测试方法一:在浏览器地址栏输入网址“

http://test-ipv6.com/

”,在页面会给出您的ipv6网络测试结果,见下图。

很明显,我的网络现在还不支持ipv6

关于 IPV6: 

https://github.com/lennylxx/ipv6-hosts/blob/master/hosts

你只要将页面复制下来然后粘贴在你的HOSTS文件上就行,记住以管理员的身份打开。

关于 IPV4: 

https://laod.cn/hosts/ 
或
https://github.com/googlehosts/hosts/tree/master/hosts-files 

进去之后找到最新更新的那期,然后下载下来,打开压缩包之后找到里面的可执行文件,根据提示替换掉你原来的hosts文件就行。

记住替换好了之后要刷新一下 DNS 缓存(见上面的步骤)。

上面的两个文件能满足你正常的上网需求,而如果你遇到不可以上的网,那么就按照上面提到的方法在 hosts 文件后面添加你想要上的 IP,能满足你日常的一切需求。

讨论

还有自建梯子的方法

https://mp.weixin.qq.com/s/Tbp43DhwU6hGaXzMgCJi2w

google host file:

https://github.com/googlehosts/hosts/blob/master/hosts-files/hosts

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn