vpn简介以及国内外分流设置


作者:littlewhite

为了维护共产主义的纯洁性,为了阻挡资本主义万恶势力的入侵,我大中华局域网平地拔起,多少互联网用户搜索是用百度,看新闻是用新浪、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,可以直接去下载pre-generated-bat-for-win.zip解压之后得到vpnup.bat和vpndown.bat两个文件,然后在DOS下执行vpnup.bat。vpndown.bat其实没什么用,它是用来清除路由表的,但是电脑关机后自动清除
  • 完成上面操作后再连上VPN,就可以实现分流了

测试

通过访问网站:
分别访问www.123cha.comwho.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,看看是不是可以访问了

vpn简介以及国内外分流设置》上有6条评论

  1. Bo Liu

    你好,按照上面的方法进入teminal 执行命令python chnroutes.py -p mac不会生成那两个文件,反而会报错, [Errno 2] No such file or directory
    liumatoMacBook-Air:~ yoha$ python chnroutes.py -p mac。请问知道这样发生的原因和解决办法么?谢谢

    回复
  2. Brook

    生成的两个文件拷贝到/etc后,再连VPN国内国外都上不去了,同一个VPN账号用iPad能上,反复试了好几次,重启也不行。/etc下删掉那两个文件后,电脑上跟国外彻底断了,能连上但上不去网,iPad照常。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注