惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
C
Check Point Blog
B
Blog RSS Feed
Y
Y Combinator Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
小众软件
小众软件
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
GbyAI
GbyAI
The Cloudflare Blog
博客园 - 叶小钗
S
SegmentFault 最新的问题
博客园 - Franky
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
B
Blog
Jina AI
Jina AI

cuihao->blog

留言板备份 - cuihao->blog 局域网中通过 TUN 和软路由实现链路聚合 - cuihao->blog 网页中的 <body> 和 <html> 元素及其样式 雾霾中的星空 - cuihao->blog 把 /usr/share 压成 squashfs,以及写 systemd 的 mount 单元 负整数的整除和取余运算 - cuihao->blog 一些关于读书的事 - cuihao->blog Archlinux on ThinkPad L430 - cuihao->blog 【火狐三则】增强组件的PKGBUILD;不错的dial插件;同步profile到内存盘 - cuihao->blog unzip 6.10b测试版,解决ZIP乱码问题 - cuihao->blog 最后还是堕落到宋体了 - cuihao->blog
NetworkManager 配合使用 chnroutes (至少适用于 Arch)
cuihao · 2012-10-28 · via cuihao->blog

高三很忙,好久没写东西了。不过也快熬出头了。今天就写点儿啥吧。

VPN是个好东西,翻那个啥效果不错,比goagent之类的要稳定。但如果不配置路由的话,VPN就会成为默认网关,包办所有对外连接。这反而会导致访问国内网站速度变慢,而且也挺浪费流量的。我搜了一下,找到了chnroutes这个工具:

chnroutes
利用来自APNIC的数据生成路由命令脚本,让VPN客户端在连接时自动执行。通过这些路由脚本,可以让用户在使用VPN作为默认网关时,不使用VPN访问中国国内IP,从而减轻VPN负担,并提高访问国内网站的速度。

如果使用openvpn之类的命令连接VPN的话,按照其readme配置即可。但我还是偏好GUI,想用NetworkManager来管理连接。NetworkManager的VPN连接程序是自带的,并不使用命令行工具的配置文件。

Google到了这篇文章:《Ubuntu 9.10下使用Network-manager 配置openvpn 》

简要转述 chnroutes 使用方法:

  1. 克隆代码:
    git clone git://github.com/GutenYe/chnroutes.git
  2. 终端下切到代码目录,执行:python2 chnroutes.py
  3. 接下来会生成 vpn-up.sh、vpn-down.sh。vpn-up.sh 需要修改一下(原因参考上面提到的文章),把开头的 “OLDGW=$(...” 那一行删掉,改为:
    OLDGW=$(ip route show | grep '^[^d].*proto static' | grep -v 'dev\s*tun' | awk 'NR==1' | sed -e 's/.*via \([^ ]*\) .*/\1/')
  4. 把 vpn-up.sh 随便放到个合适的地方吧(我放到了 /etc/openvpn/ )

Arch 的 NetworkManager 没 Ubuntu 那个名为 01ifupdown 的 dispatcher 。简单研究一下,发现dispatcher也不是啥复杂的玩意儿。要点如下:

  1. 接入/断开连接时,会依次调用 /etc/NetworkManager/dispatcher.d/ 下的 shell 脚本
  2. NetworkManager 会给脚本传入(至少)两个参数,第一个是连接名称,第二个是动作
  3. 动作有(至少)四种:up—接入普通连接,down—断开普通连接,vpn-up、vpn-down—接入/断开VPN连接

照葫芦画瓢写了个(请保存到 /etc/NetworkManager/dispatcher.d/10chnroutes):

#!/bin/sh -e

case "$2" in
    vpn-up)
    exec /etc/openvpn/vpn-up.sh
    ;;
    vpn-down)
    exit 0
    ;;
esac

exit 0

额,弱爆了是吧……别的发行版应该也能用。

按说vpn-down时应该执行一下vpn-down.sh的,但我发现加上了反而会导致一个(无伤大雅的)错误,而且不执行也没啥影响,VPN断开后路由表确实自动恢复了。这方面我不太懂,反正事实就是这样。

到这里,NetworkManager 连接 VPN 时就能自动配置路由了。在VPN连接后,找个国内看IP的网站测试看看吧。

另外,对 Ubuntu 用户的附注。那篇参考文章提到的 01ifupdown,在最新的Ubuntu里变复杂了,要修改成下面这样:

    up|vpn-up)
        export MODE="start"
        export PHASE="post-up"
        /etc/openvpn/vpn-up.sh
        exec run-parts /etc/network/if-up.d
    ;;