设置路由表使国内IP不走VPN线路

Yuliang Jin

国内绕过网络审查的方式多种多样,其中我认为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.


16 Responses to “设置路由表使国内IP不走VPN线路”

  • arthur Says:

    找了很久愣没找到你的留言板在哪里,就在这里回了,to top的教程贴出来分享一下啊!效果很不错!(晕哦!提交评论让我做这样这样难的数学题 541+1813)

    [Reply]

    Yuliang Reply:

    @arthur, 哈哈,就是插件Dynamic “To Top” Plugin的效果。
    那个数学题是为了屏蔽垃圾回复,这里每天都有机器评论,加上这个就清净了,哈哈。

    [Reply]

  • 英文SEO Says:

    一直用GAE翻,有空时再来翻阅此文好好研究一下。
    同上,“626 + 154”,博主不仅能屏蔽一些垃圾评论,同时也能阻止13岁一下用户评论,哈哈~

    [Reply]

    Yuliang Reply:

    @英文SEO, 哈哈,原来我设置的是G+标准啊~

    [Reply]

  • 套图部落 Says:

    好方法,受益匪浅

    [Reply]

  • Dong Says:

    改用fedora了,或说为啥vpn不用openvpn呢?

    [Reply]

    Yuliang Reply:

    @Dong, 用了很久了啊,哈哈~主要是实验室机器上用的,笔记本上的Debian刚换成f15~

    [Reply]

    Yuliang Reply:

    @Dong, 我刚弄好一个openvpn,不过还没测试明白呢,哈哈~

    [Reply]

  • louxiu Says:

    VPN还是没时间弄,最近ssh好像开始不好用了

    [Reply]

    Yuliang Reply:

    @louxiu, 我一直想抽空弄一下openvpn,这个客户端在你的gentoo上应该好配置~~不过这周我的任务已经排满了啊,你有空看看咱们一块儿弄吧,哈哈~

    [Reply]

  • xianzai Says:

    如果我是用network-manager来管理vpn的连接,那么
    /etc/ppp/ip-pre-up
    /etc/ppp/ip-down.local
    这两个脚本是不是不会执行的?

    [Reply]

    Yuliang Jin Reply:

    @xianzai, 会的,我基本也是在用network-manager管理连接。连接后route命令会显示我的路由表已经增加了许多条目,使用国内的IP查询网站例如www.ip138.com,就会显示国内IP,再用国外的例如www.whatismyip.com就会显示VPN的IP~

    [Reply]

  • doupi88 Says:

    太深奥了,看不懂,vpn全局,所以还是用ssh好点…

    [Reply]

    Yuliang Reply:

    @doupi88, 哈哈,看来我写的还是不够易懂啊,其实就是设置路由表,不同的IP分走不同的线路。

    [Reply]

  • agon Says:

    ip-pre-up文件里有很多类似下面的命令,必须用root才能运行

    route add -net 1.0.1.0 netmask 255.255.255.0 gw 网关

    用普通账户运行会得到’SIOCADDRT: 不允许的操作‘的报错,造成无法自动运行这个脚本,只能root 手动运行,请问如何解决上面报错问题

    [Reply]

    Yuliang Jin Reply:

    @agon, ip-pre-up是ppp的配置文件,我用NetworkManager启动连接VPN的时候不需要手动去执行它。不知道是不是你连接VPN的方式跟我不一样。

    [Reply]

Leave a Reply

What is 748 + 868 ?
Please leave these two fields as-is:
IMPORTANT! To be able to proceed, you need to solve the following simple math (so we know that you are a human) :-)