当你有多个设备在家时,要让每个设备都翻墙往往是很麻烦的。电脑上有ssh、vpn等多种方案,而Android上常用goagent,iPhone不越狱的话则只能依赖vpn或APN Proxy。而且这些方案往往在稳定性、流量控制、速度上各有各的问题。于是就有聪明人发明了从路由器级别搞定翻墙的办法。对所有设备透明,稳定,流量耗用小。

当然,我不是那个发明人。只是前些日子家中拉了一条20M的宽带,顿时觉得有必要充分利用,这才亲身实践了一次,历经磨难,查了N多资料才搞定。发觉网上没有一个真正完整的教程指导,于是索性在此写一篇。欢迎有志之士参考实践,或提出修改意见。

基本原理:让路由器刷上开源固件dd-wrt,再配置路由器自动连接openvpn,最后利用autoddvpn,自动让被墙ip段的请求添通过vpn发送。

路由器的选择

首先,dd-wrt有这么一个页面[http://www.dd-wrt.com/wiki/index.php/Supported_Devices]列出了所有支持的路由器。也就是说,路由器必须被列在这个页面中才可以刷dd-wrt。

其次,能刷dd-wrt并不意味着就能拨openvpn。openvpn支持需要路由器最好拥有8MB Flash或更多,RAM最好32MB以上。按照这个标准,你又可以过滤掉一大片选择。最后,如果你不想太折腾的话,注意表格最后一列Notes,最好上面不要有奇怪的说明。

我推荐Buffalo家的路由器。便宜(相对Linksys来说),稳定,外观带感,配置不坑爹,最关键的是,Buffalo官方就有dd-wrt的固件支持——每个路由器都会提供两种固件,其中一种就是dd-wrt。当然,刷dd-wrt网站的固件自然也没问题。

注意,不要买Buffalo的WHR系列,没有OpenVPN支持。

我目前用的是Buffalo WZR-HP-G300NH2,如果你有米,也可以考虑Linksys E4200之类。

dd-wrt的版本选择

像Buffalo这样的厂商虽然会发布直接用于对应路由器的固件,但功能也未必和dd-wrt官方相同。所以推荐用dd-wrt官方固件。

最靠谱的查找对应路由器的dd-wrt固件的办法就是,去这个ftp[ftp://ftp.dd-wrt.com/others/eko/BrainSlayer-V24-preSP2/2012/],进入最新的build文件夹,按照找你的路由器名字的文件夹,里面就是固件了。

但在刷dd-wrt之前,请前往此处[http://www.dd-wrt.com/wiki/index.php/Installation#Hardware-specific]查看关于你的路由器品牌或型号的说明。

只要按照说明操作,基本上你不会需要去了解一些终极治疗术。(当你的路由器完全死翘翘的时候你会需要,诶嘿

因为后续要支持autoddvpn,所以你需要一个支持jffs的版本,也就是说至少是V24preSP2级别的版本。V24SP1和V24都因为组件兼容性问题移除了jffs。上面我给的ftp地址就是V24preSP2的所以不用担心。(有资料提到很老的版本也有jffs但那真的太老了。。

你可能还看到有资料中提到什么mega版本啊vpn版本啊mini版本啊,不过因为刷这些版本都需要用到tftp这样的麻烦工具,所以最好不要去尝试,乖乖用std就好了。

OpenVPN的配置方式

刷好dd-wrt后,先让他能正常访问网络/然后我们就要开始在这上面配置OpenVPN了。

选择有两个:

  1. 通过dd-wrt的web界面中的“服务”->“OpenVPN”页面来直接配置。
  2. 通过telnet进路由器后,在命令行下手动上传配置文件+脚本的方式来配置。

第一中方案看似简单,但其实配置选项很多很专业,而我们往往从VPN商家拿到的都是直接的配置文件,要亲自读懂配置文件再去修改web页面的每一项,其实非常难。而且,这种方案下,要加上autoddvpn的支持还稍嫌麻烦。最坑爹的是这种方案调试极其无力。

所以我选择的是第二种方案。第二种方案下,配置OpenVPN可以直接参照autoddvpn的这份文档[http://code.google.com/p/autoddvpn/wiki/OpenVPNManualStartUP],并且请密切注意文档下放的“注意”部分,并记住我们是要用graceMode,以及配置文件结尾一定要加上 script-security 3 system。文档结尾的设置openvpncl_enable=0的部分一定不要忘记。并且一定要测试连接是否成功。

但是:在你上传前,需要先打开dd-wrt的jffs支持。参考这份文档[http://code.google.com/p/autoddvpn/wiki/jffs]中的《如何打開jffs支持》这一小段。注意,只需要参考这一小段即可,下面的部分都不需要看,也不需要操作。后续自然会讲到。

另外如果你的OpenVPN连接遇到问题,可以加上reneg-sec 0这一句试试。以及配置文件中不要加auth-nocache,否则很可能会每小时openvpn客户端就错误退出。

 autoddvpn

这个项目的地址在此:http://code.google.com/p/autoddvpn/ ,不过他的文档写的真的很乱。你可以完全不管不看。

刚才如果你按照上一步中的autoddvpn的文档已经写好了OpenVPN配置文件,那里面就包含了在VPN连接和断开后对autoddvpn脚本的调用命令。所以我们只需要做一步,把autoddvpn的文件搞到对应位置即可。具体操作按照这份文档[http://code.google.com/p/autoddvpn/wiki/graceMode],直接看《設置方式(以OpenVPN為例)》部分,包括设置DNSMasq和SSH进入路由器后执行的几行命令。当然,不用ssh,用telnet也可以。

如果你会使用到基于bonjour的服务,比如iPhone的Wi-Fi同步,那么在“服务”->“服务”的DNSMasq中建议不要启用 本地DNS。

在这份文档中还讲到了通过创建vpnup_custom文件来增加一些没有被包含在自动翻墙列表中的ip段。可以参考使用。

调试

确保你的文件都乖乖放在/jffs/openvpn/下了,并且没有吃饱了去修改名字。确保你的路由器的DNS设置是按照上文说的那样做。然后就是那么几条命令方便你自己调试:

在当前终端连接openvpn并显示连接日志:openvpn --config /jffs/openvpn/openvpn.conf

连接openvpn并且放在后台:openvpn --config /jffs/openvpn/openvpn.conf --daemon

结束所有openvpn进程:killall openvpn

显示当前运行的所有进程:ps

查看当前autoddvpn的log:tail -f /tmp/autoddvpn.log

守护脚本

OpenVPN再稳定都有意外挂掉的情况。这种时候我们就需要通过系统的cron来设置每隔2分钟,就运行一个脚本检查一次OpenVPN进程当前是否在运行,不在的话就再运行一个OpenVPN。

脚本文件内容如下:

#!/bin/sh
ISRUN=`ps|grep "openvpn"|wc -l`
if [[ $ISRUN -lt 4 ]]
then
echo "Not running, start!"
openvpn --config /jffs/openvpn/openvpn.conf --daemon
else
echo "Openvpn is already running."
exit
fi

假定保存到/jffs/openvpn/openvpnDaemon.sh位置,那么我们就在dd-wrt的web界面的“管理”->“管理”下启用Cron,并且在附加任务中输入:

*/2 * * * * /jffs/openvpn/openvpnDaemon.sh

于是就大功告成。

注意,如果你不是保存在/jffs/openvpn/openvpnDaemon.sh位置,那么相应的,要在上面的脚本文件内容中,把 -lt 后面的数字进行修改,这取决于你最后保存的位置的字符串中有几个“openvpn”。如果有n个,那么那个数字就改称n+2。

好了。写完了。有什么问题尽管提。

 

Sid 晓 星期六, 五月 5th, 2012 02:20 上午 GMT +8

再过不久,我就要离开腾讯,去往上海。

在腾讯所处的日子,扳指一数,快有一年半了。回过头细想,自己居然没有做出什么不错的产品,很是不好意思,也自觉有愧于那些将我招进来的前辈们。

幸运

能进入腾讯,我是幸运的。

原本按照我的过去,很一般的学校,半吊子的成绩,更没有什么项目经验,绝无可能进入大企业,更不要说腾讯这样的互联网巨鳄。只因为自己偶然的兴趣,在国内微博刚兴起时写了一篇角度微妙的微博的数据价值讨论的博文,恰巧被贵人相中,才得以进入腾讯实习。

在腾讯的第一个leader,是我在产品设计上的启蒙老师。虽然在校时自己有看过交互设计的不少书,但他给了我完全不同高度的视野,让我第一次明白设计方法论的含义,而渐渐不再停留在纠结无谓细节的阶段,也让我明白,什么是产品的灵魂,什么是有品位的设计。

而同时,对新人来说,腾讯亦是非常不错的试练场。负责的导师,完备的制度,明确的职能划分,标准的团队,严格的管理流程,非常适合新人学习“如何做事”。另一方便,公司给员工的待遇也很不错,各类消费、班车之类的福利,即使在国内的大公司之间相比,也算中上游的了。

更难能可贵的是,我还有到了一群非常好的同事。年轻、快速成长是整个公司的氛围。

冲突

后来,leader就离开了腾讯。今天回过头来看,这几乎是必然的。leader是深受Apple设计哲学熏陶的人,他追求的创新的设计,有品位的产品,与腾讯的文化始终格格不入。在这样的剧烈文化冲突中,显然无法诞生成功的产品——我们就这样一而再再而三的失败,团队也走的很艰难,产品设计也总与大方向格格不入。

腾讯的一些做法一直在业内饱受诟病——对安心做事的人来说,这或许并不算问题——山寨盛行。对腾讯山寨的说法在互联网界已经人尽皆知,我多插一句也毫无意义。只是,在这样一个公司,很难诞生真正有品位的设计和有灵魂的产品。

价值观

在这段说长不长说短不短的时间里,我最大的收获,就是在前leader的影响下形成了自己的产品设计价值观。而价值观的碰撞,确实是最无奈且无法妥协。之所以选择离开,很大一部分原因,是我不能认同下面的这些价值观。

用“微创新”来代替“创新”的价值。如果说以前腾讯所宣传的“微创新”还是拿人东西来加以改进,今天的“微创新”已经变成了 做自己人没做过的东西。看看每月的“微创新”评奖,我很难不看得暗自脸红。这与真正的创新南辕北辙。

一切遵循别人走过的路的思路。从项目运作上,遵循一个新市场的引领者的道路,固然是保守但稳妥的,只要在前者的基础上稍加改进,再利用强大的QQ推广,基本上战无不胜。但,这是对产品设计师的侮辱。走这样的道路并不需要真正的产品设计师,只需要文档撰写员——不需要动脑,只要找出对方的优缺点,再略加改进,只要时机把握好,便是一份100%制胜的新产品提案。

用户要什么,我们给什么 的设计思想。许多人动辄就是要做亿级用户的产品,一开始就奔着用户量去推广。实质都是多年做QQ给惯坏的。任何产品一出生就奔着用户量去,那我毫不怀疑它的功能迟早会堆叠臃肿,它的品位会低俗不堪,它的推广手段更少不了弹窗广告、诱骗下载、挟持注册,但更重要的是,产品本身永远只是个毫无气质的app。如果要让你的产品真正matter,那你就要让“他们”喜欢你,而不是讨好everybody。“做减法”是每个人都会挂在嘴边的话,但几人明白为何做减法。

中庸的设计。cnbeta上常常有人说腾讯的设计团队是中国最好的。但事实是,中国的设计师平均水平太差,才衬托腾讯的好而已。许多中国的UI设计师,缺少在各个设计领域的知识沉淀,对建筑设计的构建、工业设计的材质缺少扎实的理解,仅仅依靠熟练的PS技术和色彩知识外加设计范例的临摹,再熟读原研哉之流的大师讲谈作品,居然就成为了视觉设计师,或者交互设计师。这是可笑的。缺少对结构的精确把握,缺少对设计所传达的可供性与情感的认识,凭借自己熟记的范例的感觉来做设计,此时的设计不过是一种经验的比拼——比比谁做过更多此类设计,更熟悉各类规则,更能丢出各种专业术语。与国外的设计师相比,他们还差得太远。

封闭的心态。在腾讯,发生的最多的事情其实是“重复的发明轮子”。对开源和第三方组件的夸张的不信任感,使得在大多数项目上,开发们都倾向于花费时间、精力,重新发明一套“更适合于产品需求”的框架。诚然,许多框架在面对海量用户时并不具备支撑性,但即便是很小用户量的产品,往往也抱着同样的封闭心态。更不要说使用开源项目并且反哺回去了。而自己设计多年的成熟框架,也永远是抱着往死里掖着的心,不分享一丝一毫到外界,生怕被人发现漏洞钻了空子。而在产品设计上,心态的封闭更是随地可见——可参考那个开放平台的质量。

成长

离开的另一个原因是,我渴望更快速的成长,渴望能够早一天达到我认同的职场生涯第一阶段的目标。

在腾讯,即使是我这样的年轻员工,也总会时不时接到猎头的电话,询问是否有跳槽的机会,而他们给的职位,也往往都是国内其他大公司里还不错的职位。虽然说起来好像很有面子,但我心里很清楚,今天猎头们络绎不绝的打电话,并不是因为我真的有名或有才,而仅仅因为“我是腾讯的员工”。

我渴望能尽早摆脱这样的腾讯光环,而希望有一天猎头找上门,仅仅是因为是我,而不是其他的任何光环。

——

我知道自己还很稚嫩。青春嘛,总要装着稚嫩的样子,把生命的所有可能性去尝试一遍。倘若不在这个时候还原它最本来的颜色,那老来回忆起自己灰蒙蒙的二十三四岁,总会后悔的。

Posted from Shenzhen, Guangdong, China.

Sid 晓 星期四, 三月 1st, 2012 12:44 上午 GMT +8

距离上一篇博客,又飞快的过去了一个多月。本想着在年底前多写几篇,但时间总是这样不留情面,丝毫不为我的懒惰踌躇留下一个半个借口。于是就在这恍恍惚惚中,我走进了2012。

现在回想这过去的一年里的种种,有些事依然层次分明,有些人却已轮廓模糊,眼看快要被记忆磨灭。便笃生危机感,催促自己记录下来。

2011年的记忆,是从3月份开始的。在此之前的记忆,似乎已被水浸透,无可寻觅。

一场地震。带来一阵海啸,一次核事故,和一只惊慌的koka。

4月伊始。收拾行囊,回到深圳,回到兵荒马乱的团队。看着曾经半年的产品交给别人。看hengdm最后离开。最后一场酒会,曲终人散,为曾经的潘多拉画上并不圆满的句点。

夏至未至。拾起许多年未更新的产品,一切重新再来。遇见从美国跨越太平洋来实习的chacha。真心羡慕她。羡慕那些可以离开这个国度的人,他们有更明亮的未来。

6月,炎热的南方。和传说中的cihine与liang,吃了一顿饭。见到了一种人,一种生活。从此渐渐发觉,许多一直坚持的价值已不知觉间崩塌,那些一直支持着自己一个人走过的信念已分崩离析。于是在那个蝉鸣阵阵的月份里,挥手和一直苦苦经营的自己做告别,和一直以来崇敬与羡慕的他们做告别。然后,狼狈不堪的在心里目送cihine返回美国。

南方没有秋天。依旧炎热的8月末9月初。尝试每天早起锻炼。绕着偌大的小区慢跑,用Nike+ GPS记录路线;或是在空荡荡的客厅做锻炼,配合Nike Training做指导。晚上10:30便爬上床,用iPad静静读一会儿书再入睡。每天从没如此清醒与精神,似乎渐渐找回10年前的活力。

在这期间,hela离开了深圳。走前一天的晚上,一起去吃了烧烤。才知道她一直住在我小区对面。那晚上说的话,大概比我认识她以来说的所有话加起来还要多。然后在天桥目送她回家。

直到那个月的某天,右手猝然的紫癜,血液病的可能性。短短48小时内,内心的颠簸仿佛经历了世界末日一般。第一次在内心直面死亡的恐惧。从此时时记住自己将会死去的事实,并在这前提下,做了许多决定。其中之一,便是学钢琴。

另一个决定是,把一直以来想做的App都完成。自从读了「Do you matter」一书,萌发的许多idea,想慢慢一步一步将他们实现。于是开始着手从小做起。

10月,彷徨。试图触及那些美好,最终明白,人与人终归存在阶层的隔阂,那是无可逾越的障碍,因为它的属性是时间。

于是就这样,生命继续浪费着。到了年末,开始偶尔刮几阵寒风,小区茂密的树林也偶尔会多出几片枯叶,散落在蜿蜒的小道上。从Javacafe走出来,时常不自觉的戴上帽子。窗外和煦而冰冷的阳光,冬日暖阳。这才想起,冬天不知不觉已经到来。

或许不是每个人都会经历这样的阶段。害怕着自己随时会死去,因而憎恨着过去挥霍生命的自己,否定浪费了自己生命的一切过去,渴望着未来的时间以及时间附带的美好未来,却又对时间的缓慢流动无能为力。在这漫长的等待过程中,怀着期待,也怀着对终点一点点迫近的惧怕。因为意识到,时间,是自己唯一的财富。

这一年,唯一教会我的,是时间。一刻不停的侵蚀生命,一刻不停的阻止成长,一刻不停的推向终点。它让已经过去的美好黯然失色,让已经流逝的光阴倍显珍贵,让拼命追求的美好地角天涯,让曾经熟悉的世界衰老消失。

背负着如此的后悔、痛苦、恐惧,容我再一次轻声问:

荒耶,你追求的是什么?

真正的睿智。

荒耶,你在哪里追求?

只在自己的体内。

这便是我的支撑。

最后,在这2012新年伊始,为我的博客换上新的主题。自己模仿Path而做的主题Overpath(不兼容IE啥的)。希望会有人喜欢。

最后的最后,感谢一直陪伴我的你们。

————

附上一首歌。Secret Garden的新专辑White Poem中的一首歌。Mary's Lament

 

Posted from Shenzhen, Guangdong, China.

Sid 晓 星期三, 一月 4th, 2012 01:26 上午 GMT +8