设置路由表使国内IP不走VPN线路
国内绕过网络审查的方式多种多样,其中我认为SSH隧道和VPN是两种最安全和最流行的方法了。我自己就在一个美国VPS上配置了自己的VPN服务,我的这篇文章里有配置方法。
通常情况下,VPN连接是全局的。也就是说一旦连接上VPN,所有的网络流量都将通过VPN网络。但是显然国内IP不会被防火墙封锁,因此我们希望上国内网站时不走VPN,这样速度上也会有很大的优势。
网友的力量是无穷的,开源项目chnroutes就是一个通过设置路由来达到上述目的的解决方案。这个项目提供了一个Python脚本,运行这个脚本时,它会利用APNIC提供的country-ipv4.lst文件,自动找到国内IP列表,并使用这个列表生成两个Bash脚本。这两个Bash脚本就可以用于在VPN连接前和断开后设置内核路由表,来区分国内IP和国外IP走不同线路。
这里以我使用的PPTP VPN为例。首先,下载Python脚本chnroutes_ovpn_linux到Linux客户机。给这个脚本增加执行权限并运行:
chmod +x chnroutes_ovpn_linux
./chnroutes_ovpn_linux运行完毕将会在当前目录生成两个脚本,vpnup和vpndown。为它们也加上执行权限:
chmod +x vpnup vpndown拷贝这两个文件到ppp配置目录的合适位置,并命上合适的名字:
cp vpnup /etc/ppp/ip-pre-up
cp vpndown /etc/ppp/ip-down.local然后,断开并重连VPN,这时你和国内IP的网络通讯就会不再走VPN线路,而是直连到服务器了。可以使用route命令查看一下内核路由表,条目非常多。
Chnroutes这个项目支持openVPN和PPTP,并且在Mac、Linux和Windows均可部署。我只在Fedora 14上使用它,目前为止并没有发现什么问题。
(This post is also available in English: Link)
© 2011, Yuliang Jin. All rights reserved.
This post is under a Creative Commons Attribution-ShareAlike 3.0 Unported License.


August 9th, 2011 at 6:44 AM
找了很久愣没找到你的留言板在哪里,就在这里回了,to top的教程贴出来分享一下啊!效果很不错!(晕哦!提交评论让我做这样这样难的数学题 541+1813)
[Reply]
Yuliang Reply:
August 9th, 2011 at 6:50 AM
@arthur, 哈哈,就是插件Dynamic “To Top” Plugin的效果。
那个数学题是为了屏蔽垃圾回复,这里每天都有机器评论,加上这个就清净了,哈哈。
[Reply]
August 9th, 2011 at 4:11 PM
一直用GAE翻,有空时再来翻阅此文好好研究一下。
同上,“626 + 154”,博主不仅能屏蔽一些垃圾评论,同时也能阻止13岁一下用户评论,哈哈~
[Reply]
Yuliang Reply:
August 9th, 2011 at 4:13 PM
@英文SEO, 哈哈,原来我设置的是G+标准啊~
[Reply]
August 20th, 2011 at 4:53 PM
好方法,受益匪浅
[Reply]
September 24th, 2011 at 3:08 PM
改用fedora了,或说为啥vpn不用openvpn呢?
[Reply]
Yuliang Reply:
September 25th, 2011 at 3:24 PM
@Dong, 用了很久了啊,哈哈~主要是实验室机器上用的,笔记本上的Debian刚换成f15~
[Reply]
Yuliang Reply:
September 25th, 2011 at 3:25 PM
@Dong, 我刚弄好一个openvpn,不过还没测试明白呢,哈哈~
[Reply]
October 19th, 2011 at 5:22 AM
VPN还是没时间弄,最近ssh好像开始不好用了
[Reply]
Yuliang Reply:
October 19th, 2011 at 8:40 AM
@louxiu, 我一直想抽空弄一下openvpn,这个客户端在你的gentoo上应该好配置~~不过这周我的任务已经排满了啊,你有空看看咱们一块儿弄吧,哈哈~
[Reply]
October 25th, 2011 at 7:13 PM
如果我是用network-manager来管理vpn的连接,那么
/etc/ppp/ip-pre-up
/etc/ppp/ip-down.local
这两个脚本是不是不会执行的?
[Reply]
Yuliang Jin Reply:
October 25th, 2011 at 7:22 PM
@xianzai, 会的,我基本也是在用network-manager管理连接。连接后route命令会显示我的路由表已经增加了许多条目,使用国内的IP查询网站例如www.ip138.com,就会显示国内IP,再用国外的例如www.whatismyip.com就会显示VPN的IP~
[Reply]
December 3rd, 2011 at 4:12 PM
太深奥了,看不懂,vpn全局,所以还是用ssh好点…
[Reply]
Yuliang Reply:
December 3rd, 2011 at 8:10 PM
@doupi88, 哈哈,看来我写的还是不够易懂啊,其实就是设置路由表,不同的IP分走不同的线路。
[Reply]
February 2nd, 2012 at 10:43 PM
ip-pre-up文件里有很多类似下面的命令,必须用root才能运行
route add -net 1.0.1.0 netmask 255.255.255.0 gw 网关
用普通账户运行会得到’SIOCADDRT: 不允许的操作‘的报错,造成无法自动运行这个脚本,只能root 手动运行,请问如何解决上面报错问题
[Reply]
Yuliang Jin Reply:
February 3rd, 2012 at 2:29 PM
@agon, ip-pre-up是ppp的配置文件,我用NetworkManager启动连接VPN的时候不需要手动去执行它。不知道是不是你连接VPN的方式跟我不一样。
[Reply]