为了维护共产主义的纯洁性,为了阻挡资本主义万恶势力的入侵,我大中华局域网平地拔起,多少互联网用户搜索是用百度,看新闻是用新浪、QQ,社交是用人人微博之流,但总有一份不安分子想要使用Google、Facebook等一些不纯净的网站,以窥探资本主义的罪恶,为了满足这些用户的好奇心,VPN服务营运而生
vpn简介¶
=== 在没有使用VPN的时候,我们访问网站的数据线路大致是这样的,我们以百度举例
- 你在浏览器输入www.baidu.com,DNS服务器给你解析出对应的ip
- 你的路由器将你的请求转给下一个路由器,下一个路由器再转给下下个路由器,一直到百度的服务器
- 百度服务器接收到请求,将百度的网页打包传给你,并带上你的ip
- 再经过一层层路由器的转发,百度返回的数据包回到你电脑上,由浏览器展示成网页的形式
如果你想知道你访问百度经过了哪些路由跳转,可以通过如下命令查看到
- Linux:
traceroute www.baidu.com
-
windows(Dos界面下):
tracert www.baidu.com
-
同样,你访问国外的网站比如Google的时候也是通过以上的线路,只不过在你的请求数据到达Google服务器之前,要经过国内的统一出口,这个出口检测到你要访问Google,它可能会给你拦截下来,至于为什么,开篇已经说了,大家都懂的。这种拦截可能是根据ip拦截(比如facebook),也可能是根据你访问的数据内容拦截(比如Google),要知道HTTP请求是没有加密的,如果别人截获了你的HTTP请求,是可以知道你访问的具体内容的
但是并不是所有访问国外的请求都会被拦截,比如访问who.is就没事,于是VPN就有了用武之地。VPN主机可以理解为国外没有被拦截的服务器,当你连上VPN再访问国外网站比如google时,它的数据线路大致是这样的
- 你的请求通过国内出口到达VPN主机,这时你的数据是经过加密的,所以无法通过内容来过滤你的请求
- VPN主机从数据里解密,知道你要访问Google,VPN主机再向Google发起请求,这时由于VPN主机和Google服务器都在国外,不会被拦截
- Google服务器将数据返回给VPN主机,VPN主机将数据加密,再返回给你的电脑
所以我们有了VPN,就可以去一窥万恶的资本主义网络世界到底是个什么样子了。要连VPN,得知道VPN主机地址,有免费的也有收费的,为了用的心安理得我一直都是用收费的,我是在vpnso.com这个网站买的服务,支持Mac、windows、Android、IOS等设备,经济又实惠
VPN分流¶
=== 但是有了VPN问题又来了,上面说到我们的所有请求都会通过VPN主机,也就是说我们如果连上VPN之后再访问百度,也要绕那么一大圈,这样既耗流量又浪费时间。但是聪明的程序员也想到了解决的办法,那就是设置路由表来分流
执行¶
大致的原理就是通过一些命令设置电脑的路由表,每次访问时系统会先去路由表查一下,如果在路由表里则不通过VPN访问,不在才走VPN,这样就可以实现访问国内国外网站的分流了。github上有一个项目专干这事儿,地址在https://github.com/jimmyxu/chnroutes。下面我简要列出主要操作
- 首先下载chnroute.py
- Mac下执行
python chnroutes.py -p mac
,生成ip-up和ip-down两个文件,将文件cp到/etc/ppp目录下,如果目录不存在则新建一个 - windows下执行
python chnroutes.py -p win
,生成vpnup.bat和vpndown.bat,由于很多windows电脑没有装Python,可以直接去下载vpnup.bat和vpndown.bat两个文件,然后执行vpnup.bat。vpndown.bat其实没什么用,它是用来清除路由表的,但是电脑关机后自动清除 - 完成上面操作后再连上VPN,就可以实现分流了
测试¶
通过访问网站
分别访问www.123cha.com和who.is,如果显示你的ip不同,那么就成功了。前者显示的是你国内的ip,后者显示的是你VPN主机的ip
通过命令行
通过前面介绍的traceroute和tracert命令,我们以windows下的tracert命令举例
在DOS下执行tracert www.baidu.com
,第一跳ip地址应该是192.168.xx.xx
执行tracert www.google.com
,第一跳地址应该是10.10.xx.xx
可能遇到的问题¶
这里列举一个我遇到的问题
在公司内部大家都在一个局域网里,有时候为了方便共享会在自己机器上搭建Apache服务,然后把地址给别人访问,比如我的局域网ip是192.168.32.91,别人的是192.168.7.35,别好奇为什么最后两个域值不一样,那是因为我们不是连在同一个路由器上,这时候如果我连上了VPN,就无法访问到对方的主机,甚至ping都会失败。为什么呢,很简单,因为请求都是走VPN的,而VPN主机是无法访问公司内部局域网的ip的,所以就会失败
解决办法
在前面提到的路由表里添加一行记录,我们以windows平台为例,打开vpnup.bat文件,建议不要用记事本,可以装一个editplus,编辑文本文件很方便。在最后按照他的格式添加一行记录,路由地址配192.168.0.0,子网掩码配255.255.0.0。断开VPN,重新执行vpnup.bat(注意这时候可能会显示路由表已添加,因为你前面已经执行过一次vpnup.bat,不要管它,一直让它执行到最后一条),再连上VPN,看看是不是可以访问了