哀差闷最近在学习drupal8和symfony2,需要去国外看一些资料,所以需要一把梯子,首先想到的是vpn啦,但是vpn只能全局代理,这样就比较尴尬啦,连上vpn后,qq掉线了,音乐没有了,打开国内网站巨慢!随后想尝试SSH代理,但这次哀差闷选择付费爬梯,SSH代理和VPN相比也便宜不了多少,但是在安全性上和稳定性上就要差许多。随后了解到了chnroutes这个开源的项目。可以实现智能爬梯。
最终哀差闷选择了GreenVPN的包年套餐,随便比较了下其他提供商性价比还算可以,最主要的是注册后有200M的试用流量,可以试试看看网络怎么样。
由于哀差闷的网络比较复杂,宿舍的端口可以连接电信的网和学校的网。所以直接尝试chnroutes失败,国内的网站会转到校园网登录的页面。被墙的网站可以正常访问。先来研究下网络环境!
网络环境
先看一下网卡接口(此时没连vpn):
ICHARMdeMacBook-Air:ppp icharm$ ifconfig en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 options=6b<RXCSUM,TXCSUM,VLAN_HWTAGGING,TSO4,TSO6> ether f0:76:1c:22:31:d0 inet6 fe80::f276:1cff:fe22:31d0%en0 prefixlen 64 scopeid 0x4 inet 10.163.11.48 netmask 0xffff0000 broadcast 10.163.255.255 nd6 options=1<PERFORMNUD> media: autoselect (100baseTX <full-duplex,flow-control>) status: active ppp0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1480 inet 222.94.242.223 --> 222.94.242.1 netmask 0xffffff00
刚开始很好奇为什么没有连VPN会有一个VPN的接口ppp0,刚开始以为是之前连接VPN残留的,所以运行sudo ifconfig ppp0 delete删除了这个接口。然后悲催的事情发生了,电信的网断了,怎么连也连不上了,赶紧重启。幸好重启后又正常了,然后又出现了这个ppp0接口,于是想到了电信的网其实是在校园网的基础上套了一层VPN。于是赶紧看一下路由跳
ICHARMdeMacBook-Air:ppp icharm$ traceroute www.baidu.com traceroute: Warning: www.baidu.com has multiple addresses; using 180.97.33.108 traceroute to www.a.shifen.com (180.97.33.108), 64 hops max, 52 byte packets 1 222.94.242.1 (222.94.242.1) 2.311 ms 2.500 ms 2.488 ms 2 221.226.71.9 (221.226.71.9) 4.857 ms 4.483 ms 3.822 ms 3 218.2.182.33 (218.2.182.33) 5.022 ms 4.907 ms 3.968 ms 4 202.102.69.118 (202.102.69.118) 5.103 ms 6.652 ms 4.049 ms
发现第一跳为222.94.242.1这正是ppp0接口的网关地址。证明上面的猜测不错!
chnroutes
https://github.com/fivesheep/chnroutes
chnroutes的使用方法在github上面已经写得非常清楚了,所以这里就不在介绍了。哀差闷是使用PPTP的VPN连接方式。
这里介绍下chnroutes的原理,由于VPN是全局代理,所有流量都会走VPN。所以chnroutes提供的脚本会生成2个shell脚本吧(windows下是批处理命令,不过都差不多吧!),这两个shell的脚本的作用是向本机的路由表添加路由规则和删除添加的路由规则,即将国内的地址罗列出来,一一添加路由规则走本地网络,其他地址则走默认的VPN。
哀差闷是OS X系统,运行python chnroutes.py -p mac生成ip-up和ip-down两个文件,首先使用vim打开ip-up看看:
#!/bin/sh export PATH="/bin:/sbin:/usr/sbin:/usr/bin" OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\([0-9\.]*\) .*/\1/' | awk '{if($1){print $1}}'` if [ ! -e /tmp/pptp_oldgw ]; then echo "${OLDGW}" > /tmp/pptp_oldgw fi dscacheutil -flushcache route add 10.0.0.0/8 "${OLDGW}" route add 172.16.0.0/12 "${OLDGW}" route add 192.168.0.0/16 "${OLDGW}" route add 1.0.1.0/24 "${OLDGW}" route add 1.0.2.0/23 "${OLDGW}" route add 1.0.8.0/21 "${OLDGW}" route add 1.0.32.0/19 "${OLDGW}" route add 1.1.0.0/24 "${OLDGW}" route add 1.1.2.0/23 "${OLDGW}" route add 1.1.4.0/22 "${OLDGW}" .... ....
上面第四行就是获取本地网络的网关地址给OLDGW,后面就开始添加路由规则了,将国内的地址指向“OLDGW”网关。
先在终端运行下:
ICHARMdeMacBook-Air:ppp icharm$ netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\([0-9\.]*\) .*/\1/' | awk '{if($1){print $1}}' 10.163.0.1
所以访问国内的地址都被chnroutes的路由规则指向了10.163.0.1(本地网络,校园网的网关),于是出现了访问国内网站转向了校园网的登录页面。
既然知道了问题的所在,那么解决方法就很简单了。
解决方法
解决方法即是让OLDGW获取到的地址为电信VPN的网关地址222.94.242.1
将上面命令的第二个管道后面的grep -v 'ppp' 改为 grep 'ppp0'即可,如下:
OLDGW=`netstat -nr | grep '^default' | grep 'ppp0' | sed 's/default *\([0-9\.]*\) .*/\1/' | awk '{if($1){print $1}}'`
OK,测试一下,一切正常。爽了,google和百度都是秒开,开心!QQ,网易云音乐都能正常联网。
DNS劫持
一般来说设置了VPN的DNS后,所有的DNS请求应该是通过VPN代理出去的,但是有一些情况下任然是使用原网络的DNS。http://www.cnblogs.com/hancong/archive/2012/02/07/2341342.html可以查看这篇文章中的情况。
按照上面的搞完了,发现,youtube有时打的开,有时打不开。facebook也是。于是想到了电信的DNS劫持,抓包看看,果然是使用电信的DNS服务器。即使在网络-高级-DNS中修改为8.8.8.8和114.114.114.114,但仍然还是使用电信的DNS。
这里哀差闷是这样解决的:编辑/Library/Preferences/SystemConfiguration/preferences.plist将里面所有有关DNS的选项的值修改为8.8.8.8和114.114.114.114
可以连上VPN后访问这个网站https://www.dnsleaktest.com/ 点击测试,可以查看哪些国家的ISP监视你的请求。从而判断DNS请求是否通过VPN代理出去。
上面的方法没有奏效很长时间,迫不得已哀差闷已经放弃PPTP协议连接VPN转而使用OpenVPN协议。因为在OSX下,所以使用了TunnelBlick这款开源的OpenVPN客户端。配合chnroutes实现智能爬梯。目前感觉比较稳定.
总结
OS X终端命令:
traceroute www.baidu.com #查看访问百度过程路由跳 ifconfig en0 down/delete/up #关闭en0网卡接口/删除en0网卡接口/开启en0网卡接口 netstat -r #查看路由表
Comments | 1 条评论
沙发