当你身在洞里,你不可能看到真相

两个礼拜前在朋友圈里我发了个路由器的照片,配文说“折腾一天的结果是把它变成了砖”。当时干的事情是先刷了DDWRT,然后又刷OpenWRT,结果路由器就不能用了。后来我找万能的某宝,直接买了一个刷好OpenWRT的路由器,想配置配置软件总是方便,结果这俩礼拜的周末都在折腾路由器了,但到现在还是没完全搞定,一方面感叹自己这IT是白干了,另一方面也为牛X的网络环境而折服。

那咋就这么难折腾呢,周末我给乐妈做了一段尽量通俗的解释。

上网干的事情就是根据名字知道地址(DNS服务),然后再找到一条通往该地址路。先说查地址服务,比如英国首相府(相当于谷歌),在唐宁街10号(一串IP地址),前者是名字,后者是地址,我要邮局帮我送封信给英国首相,邮局得知道它的地址。由于每天都会拆楼盖楼,名字和地址的对应关系时刻在变,各邮局之间信息需要同步,我们肯定会选就近的邮局提供服务,只可惜邮局提供的可能是假地址(DNS污染);那如果邮局不可信,我换个英国当地可信的邮局行不行,当然行,但是还可能碰到个国内的骗子邮局(DNS劫持);或者再给你增加打电话咨询真实邮局的难度,10次断9次(丢包),慢慢拖死你。等你千辛万苦终于查到地址后,信总算寄出去了,你又惊奇地发现此路不通,比如说两岸通邮前的信都需要经香港转。所以这时你还得找个在香港的亲戚,建立一个私人通道(VPN),先把信寄给他,然后再让他帮你把信转寄到英国。还有等到私人通道建立后,不幸的是你发现所有寄出的信都先到香港去兜了一大圈,包括你同城的信件,所以还得想办法自己在做个分拣工作,什么信从香港走,什么信不走香港。

在这个过程中,你需要斗智斗勇,层层剥离其中的陷阱。要在以前乐妈肯定会觉得折腾,搞这玩意干啥,上网不是好好的嘛!微信、QQ、百度(由于其无耻精神渐渐被淘汰)、淘宝、亚马逊、优酷,该有的也都有,facebook, twitter, youtube传说中的网站她本来就没听说过。但实际上作为一个普通的家长,在你认真地陪孩子学习中,由于网络的便利会给你带来更广阔的视野,更优秀的教育服务。即使抛开Google搜索,维基百科不说,就拿孩子学英语来说:
Raz-kids有很好的分级阅读教材,但国内访问很慢,经常发现QQ群中父母们交流如何翻墙;
Vocabulary.com 一个很好用的英英翻译,提供原汁原味的例句,整理的单词列表还可以做选择题测试,也是时用时不能用;
Voicetube 台湾的一个英语学习视频网站,在斯莱特林英语学习时,我较多选择了其中的内容,但它的视频都来自Youtube,常规是根本看不到的。

于是一个个普通的家庭干起了“翻墙”的勾当,学起了更复杂的IT知识,而他们的本意只是希望能快速地访问一个英语应用。网络创造了便利,而我们却神奇地发现前方有一道不可逾越的墙。

当然还是很多朋友会说:“折腾它干什么呢?即使不翻墙不也是好好的嘛。”

正好晚上给小乐念《极简欧洲史》,说到了柏拉图的经典比喻,我把给小乐念的一部分摘了过来。

直到今天,柏拉图依然是一个哲学核心问题的起点:我们的感官经验是不是真能引导我们走向真实?柏拉图相信,我们在世间的所见所感,只是存在于另一个崇高灵魂界中的完美形体的影子。世界上有普通的桌子,但有一张完美形体的桌子一直存在于某个别处。即使是个抽象的观念,例如正义和良善,也是以完美的形体存在于某个他处。人类便是来自那个灵魂界,必须透过心智和精神的锻炼,才能重新发现这个完美。

很抽象哦,没关系,柏拉图还有一个生动有力的比喻,这个才是重点。

想象一群人,被囚禁于一个幽暗洞穴之中,而且全部被锁链绑住手脚。他们背对高墙镇日坐着,看不到背后,只能面对另一面的穴壁。洞穴外头有一条路,路的尽头有一个大火炬,路上若有其他人、动物和车辆经过,火炬就会将这些东西的影子投射在他们面对的穴壁上。这些穴居人看到的唯一事物就是这些影像;他们替阴影命名、品头论足;针对它们推理辩论;他们相信,这些影子是世间真实的存在。 后来,其中一人意外被解开锁链,从山洞走到露天处。一开始,强烈的光线照得他睁不开眼,等他看到阳光下五彩缤纷、美好的立体世界,不禁又惊又疑。可是,他说,在山洞里,我们以为…… 没错,当你身在洞里,你不可能看到真相。

“没错,当你身在洞里,你不可能看到真相。”

还记得许巍的《蓝莲花》吗?“没有什么能够阻挡,你对自由的向往。”人总是向往自由的。我们受的教育不是说,老一辈无产阶级革命家抛头颅,洒热血,所要争取的不就是这一点嘛。

为Mac OS设置国内外地址不同的访问路由

环境越来越恶化,这两天到处都是Gmail彻底被墙的消息。我等屁民只有迎难而上,把vpn,ssh给用好。

原先一直都是在用Chrome+SwitchySharp+ssh的方式,但这个方式不爽的是只支持http/https,很多时候git或brew更新时都会出问题,到时就只有祭起VPN大棋,但VPN的问题呢又在于走的是全局路由,包括国内的站点也都走了VPN,既慢又费流量。以前偶尔用用,一直懒得折腾,今天研究了一下,可以根据国内外地址设置不同的访问路由。这真是一个折腾的时代。

在mac下需要的几个工具:修改路由的chnroutes和开源的OpenVPN客户端Tunnelblick,原理就是:

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

如果你VPN服务使用PPTP,mac下很简单,参照chnroutes说明即可,可惜我的VPN提供商PPTP,L2TP,Cisco IPSecVPN几种连接方式相继被GFW干扰,目前只有采用OpenVPN的连接方式,参见Mac OS X通过Viscosity连接OpenVPN,不过Viscosity不是免费的,我就找个开源的Tunnelblick替代。

说明一下过程和注意事项:

  • 下载chnroutes
  • 在目录下执行python chnroutes.py -p mac ,生成 ip-up 与 ip-down 两个文件。
  • Tunnelblick中导入你的vpn服务提供商提供的配置文件。
  • 修改Tunnelblick的连接配置文件,增加

up {your directory}/ip-up
down {your directory}/ip-down
networksetup -setdnsservers "Ethernet" 8.8.8.8 8.8.4.4
networksetup -setdnsservers "Wi-Fi" 8.8.8.8 8.8.4.4
  • Tunnelblick中的设置里Set DNS/WINS为“Do not setnameserver”,由前面的配置文件来指定。
  • Tunnelblick连接VPN,连接成功后,可以访问ip138.comip.cn,前者为访问国内站点的ip地址,后者为访问国外站点的地址,两者应该不同。

– 12月30日更新:
发现连上VPN后,公司内网无法访问,参考如何在连接国外 VPN 翻墙的同时,访问公司内网服务 - Alsotang’s blog在ip-up/ip-down中增加公司的域名以及内网地址即可。对于Chrome来说可能需要清除缓存,否则总指向到该死的189so。

参考的文章有:

使用带有obfuscated handshake的ssh



连不上ssh有一段时间了,因要出去玩,也就没在意它,回来后发现还是如此,看来是哪里出问题了。

服务器地址说明,多了个混淆SSH端口,是443和2222,一开始没在意混淆的概念,以为就是端口地址变了,就在命令上指定了“-p 443”,但还是连接不上。

再细注意,发现还有个混淆加密密钥,而man ssh居然没有这个obfuscated。才感觉需要探究一下这混淆是啥意思呢?

DZF上有一篇Obfuscated ssh的安装说明,而在obfuscated-openssh介绍到Handshake obfuscation,握手混淆,通过混淆加密key来加强了初始的SSH握手。越来越复杂了。

obfuscated-openssh在openssh客户端上增加了obfuscated handshake协议,客户端会多两个-z,-Z的参数。不管那么多,按提示先装一个:

$ wget -o ofcssh.zip https://github.com/brl/obfuscated-openssh/archive/master.zip
$ unzip ofcssh.zip
$ cd obfuscated-openssh-master
$ ./configure
</pre> 结果不幸出现错误如下: <pre>
checking OpenSSL header version… 90812f (OpenSSL 0.9.8r 8 Feb 2011)
checking OpenSSL library version… 90818f (OpenSSL 0.9.8x 10 May 2012)
checking whether OpenSSL’s headers match the library… no
configure: error: Your OpenSSL headers do not match your
library. Check config.log for details.
</pre> 又是这该死的openssl,之前记得用brew装过openssl: $ brew list openssl 果然,还是1.0.1e版,重新配置: <pre>
$ ./configure –with-ssl-dir=/usr/local/Cellar/openssl/1.0.1e/
$ make
</pre> 又出错了: <pre>
Undefined symbols for architecture x86_64:
“_res_9_dn_expand”, referenced from:
_getrrsetbyname in libopenbsd-compat.a(getrrsetbyname.o)
_parse_dns_rrsection in libopenbsd-compat.a(getrrsetbyname.o)
“_res_9_getlong”, referenced from:
_parse_dns_rrsection in libopenbsd-compat.a(getrrsetbyname.o)
“_res_9_getshort”, referenced from:
_getrrsetbyname in libopenbsd-compat.a(getrrsetbyname.o)
_parse_dns_rrsection in libopenbsd-compat.a(getrrsetbyname.o)
“_res_9_init”, referenced from:
_getrrsetbyname in libopenbsd-compat.a(getrrsetbyname.o)
“_res_9_query”, referenced from:
_getrrsetbyname in libopenbsd-compat.a(getrrsetbyname.o)
ld: symbol(s) not found for architecture x86_64

需要修改Makefile,在LDFLAGS后增加lresolv,总算编译成功。

$ make install

如果涉及权限问题,自行加上sudo。安装后的程序在/usr/local/bin,使用带有obfuscated handshake功能的ssh:

$ /usr/local/bin/ssh -NT -f -D 1080 -p 443 -Z obfascatedkey username@sshhost

大功告成,亲个嘴吧。

有需要购买ssh的话,点击我的推广链接