平时经常使用网易云音乐听歌,但是经常遇到“版权受限”的提示也够烦人的。要解决这个问题,简单的做法可以直接去装一个Unblock Youku的插件,复杂一点的可以用GoAgent加上放在国内PaaS上的服务器端搭一个本地代理。这两种办法的本质差不多,都是绕经国内的代理服务器进行访问。虽然这些方法都能work,但是都有一个共同的缺点,那就是普适性不高。Unblock Youku和其它代理性质的扩展有冲突,虽然并不是完全不能解决,但是折腾起来也是够呛;而GoAgent的PaaS实现在移动端上几乎不可用,我在Android平台上找了好久都没有找到一个能用的办法,更不要提iOS了。如果要说最好的解决方法,就是能在大陆有一个能放代理的服务器。这样PC端可以用ProxySwitchy来切换,Android有ProxyDroid,iOS则可以直接在系统设置里设置全局代理。
以目前国内的网络环境来看,单独拥有一台常规VPS的成本并不低,每个月费用大约在几十到上百不能,如果只是用来做偶尔的Unblock的话,未免成本太高。我知道的一个低价的,接近VPS的解决方案,是使用百度的BAE 3。
BAE 3相当于一个没有root权限的VPS,前提是你能申请到Port权限。所谓Port就是一个能在百度的IP上给你做端口转发的服务,能够在一定程度上将原本只能使用HTTP访问到的虚拟机,暴露给外部的网络。如果能够申请到Port服务,就可以用SSH登录到虚拟机上,虽然没有root权限,但是跑一个Python写的HTTP/SOCKS/SS代理还是没什么问题的,如果偷懒直接跑SSH也不是不行。由于负载很低,我们选择最便宜的128M内存Python Worker配置,加上端口服务每天的费用是0.3元,这样一个月9块钱,基本上啥都能做了。
BAE 3的缺点在于目前Port服务还在测试中,如果要使用的话需要额外申请。我当初申请的时候,还不算很难,现在的话就不太清楚了。不管难度如何,需要额外申请毕竟是一道门槛,不算普适性的解决方案。
仔细思考了一下,对于像我这样在搬瓦工上有VPS的情况,一个廉价、方便的解决方案并非没有。其实我大概想到了两个解决办法:
- 在国内的PHP空间或者PaaS上部署GoAgent的服务器端,然后在搬瓦工的VPS上部署客户端,让客户端监听广域网上的请求,这样就相当于有了一台出口IP在国内的HTTP代理服务器。
- 在国内的PaaS上部署一个“反向代理”客户端。这里的“反向代理”,并不是指Nginx这一类的反向代理,而是指让服务器主动连接客户端的代理服务。由于大多数的PaaS服务大多只会暴露一个经过层层转发只能跑HTTP的80端口,根本监听不到任何客户端发来的Socket请求,所以没有办法做代理服务器。但是,通常情况下PaaS对于从代理服务器出来的Socket连接往往没有什么限制。因此我们只要在PaaS上部署一个反向代理,让PaaS主动连接搬瓦工的VPS并建立Socket连接,再在搬瓦工上建立一个转发服务,将某个端口上的流量转发到这个PaaS连过来的Socket连接上,我们就相当于有了一个端口在搬瓦工VPS出口却在国内的代理服务器。
两种方法各有优劣:
第一种方法:优点是实现起来比较简单,比如GoAgent就算一个Implementation,自己基本不需要写什么代码,只要搭一下就好了。此外对于两头的环境要求不高,国内端找个能跑PHP的空间就行,PHP基本上是个PaaS都会支持,就算去淘宝上买一个也很物美价廉;而VPS端只要能支持Python即可,Python又是几乎所有Linux发行版里都自带的组件。两头的环境都是非常常见,非常好弄的。缺点在于只支持HTTP,HTTPS的话就要导入根证书,有潜在的安全风险,Socks的话则根本不支持。
第二种方法:优点是支持什么协议都可以。由于是建立在Socket上的,不管是HTTP、HTTPS还是SOCKS甚至Shadowsocks,想支持都是可以的。缺点在于国内端不如第一种方法来的方便,PHP肯定是不行了,得是能跑Worker的Python或者是Java才行。此外这种方法网上并没有现成的实现,得自己写代码(目测大概得1000行左右)。
两相比较之下我选择了第一种方法,毕竟从现在的需求来看,对两头环境的宽容度比较重要。虽然只支持HTTP协议,但是目前国内的网站很少有强制HTTPS的,在可预见的时间范围内,应该不存在不够用的情况。
具体到实现上,虽然GoAgent是我一开始想到的做法,但实际上比较之后我还是选择了WallProxy. 原因有二,一是GoAgent本身还是给GAE用的,PaaS的部分只是顺带做了一下,支持的并不完善;相较之下WallProxy则要好得多。二是WallProxy在浏览器代理端支持使用用户名密码进行验证,虽然只是一个防君子不防小人的验证但毕竟总比把代理端口直接暴露在广域网上要好一些。
总体而言部署还是很容易的,首先去Github把WallProxy的repo给checkout出来:https://github.com/wallproxy/wallproxy,注意选择master分支。然后在国内端只要把WallProxy里的index.php放到空间里去即可,为了防止被滥用也可以在index.php的头部设置一个密码。VPS端跑的相当于是WallProxy的客户端,需要对proxy.ini进行一定的修改。
由于我们并不需要使用WallProxy的GAE特性,那些所有和GAE,PAC有关的功能统统可以关掉了。我们要关注的其实只有两个地方,第一节是[listen]段
ip = 0.0.0.0
port = 8086
username = xxx
password = xxx
其实就这么几个参数,ip改成0.0.0.0让它能监听广域网请求,端口看着设,用户名密码则是代理端需要输入的,随便设就好了——HTTP的代理用户名密码都是明文传输的,这也是我说这玩意防君子不防小人的原因。另外一个原因是如果不设置用户名密码的话,被搬瓦工看到你有一个公开的代理端口会被直接关端口,所以还是设一个比较好。
[paas]
enable = 1
password = 123456
;listen = 8088
fetchserver = http://demo1.app.com/
[paas]这一节设置成enable, 密码设置成和之前php里一致即可,listen注释掉,我们在之前[listen]一节里已经设置了监听端口,这里的listen端口就不需要了;fetchserver设置好php的地址,再把剩下的所有配置节中,包含enable的全部设置成0,也就是disable掉所有其它的feature,我们的VPS端也就配置好了。只要用
python startup.py
一个用VPS中转的,出口IP在国内的HTTP代理服务器就搭建完成了。当然还有一些扫尾工作可以做,比方说在开机脚本里把刚才的命令加进去等等,就不多说了。
PHP这一端我用的是新浪的SAE,IP就是北京电信的。整个系统的结构就是SAE的PHP做服务器端,搬瓦工VPS做客户端,代理端口暴露给外网,我们访问的时候,浏览器会先访问VPS上的代理客户端,然后转发到PHP上,PHP再访问目标服务器,整个访问过程变成了3段。
回到正题。搭建完代理服务器只是第一步,第二步是配置浏览器让它能够Unblock Everything。简单粗暴的做法就是把整个浏览器的代理直接设置成这个,当然我们有更优雅的做法,比方说利用rule来减少代理流量,加快速度(毕竟代理绕了3圈)。我用的插件是ProxySwitchy,当然现在已经改名叫SwitchyOmega,在Auto Switch中添加几条rule即可。我一般常用的就是网易云音乐和优酷,URL分别是
http://music.163.com/*
http://v.youku.com/player/getPlayList/*
Unblock Youku的Pac文件里有更多的规则可以参考,我因为一般需要的就是这两个,所以就配置了这两个Rule,其它的Rule用到了再配。不常用的Rule也可以到时候手动切换走全局代理,也不是什么大问题。