使用 Proxy 突破网管的限制

背景

公司网络限制了网易云音乐的使用,网页和客户端皆不可使用,虽然QQ音乐没有禁用(难道网管对网易有偏见?),但是实在觉得QQ的推荐功能不如网易的,遂决定想法子突破网管的限制。

尝试

首先想到的是通过代理服务器绕过公司网络的监管,因为这样就不是直接请求“163.com”这个域名。在VPS配置了一个正向代理,设置云音乐客户端使用自己的代理服务器,发现还是不行,请求被不断的302重定向回来。

猜测

通过使用Wireshark抓包发现,发往代理服务器的数据中还是有“163.com”这样的信息,估计公司网络是根据这些关键信息进行拦截,于是猜测将发往代理服务器的数据加密就可以绕过监测了。

再次尝试

本来打算自己实现一个这样的代理服务器,搜索后发现已经有一个具备这样功能的用Golang实现的开源项目Proxy,下面是官方的特性介绍:

  • 链式代理,程序本身可以作为一级代理,如果设置了上级代理那么可以作为二级代理,乃至N级代理。
  • 通讯加密,如果程序不是一级代理,而且上级代理也是本程序,那么可以加密和上级代理之间的通讯,采用底层tls高强度加密,安全无特征。
  • 智能HTTP,SOCKS5代理,会自动判断访问的网站是否屏蔽,如果被屏蔽那么就会使用上级代理(前提是配置了上级代理)访问网站;如果访问的网站没有被屏蔽,为了加速访问,代理会直接访问网站,不使用上级代理。
  • 域名黑白名单,更加自由的控制网站的访问方式。
  • 跨平台性,无论你是widows,linux,还是mac,甚至是树莓派,都可以很好的运行proxy。
  • 多协议支持,支持HTTP(S),TCP,UDP,Websocket,SOCKS5代理。

等等。更多介绍可以到码云上浏览,这里只用到了上面这些特性。

原理

为了绕开公司网络的监测,需要加密本地发往代理服务器的数据,然后由代理服务器解密数据,再发往真正的服务器,因些我们需要两级代理,原理如下图所示(盗用官方的一张图):

使用 Proxy 突破网管的限制

这里选用socks代理,因为它只是简单的传输数据,而不关心是何种应用协议,因此比其他应用层代理要快得多。

实践

安装

本机(Windows)下载Windows版解压,VPS(Linux)下载Linux版解压即可。

生成证书

在本机或者在VPS生成都可以,但是要保证两端的证书文件是一样的。下面演示在Linux上生成证书文件:

./proxy keygen -C proxy

执行命令会在当前目录下生成proxy.key和proxy.crt两个文件,将这两个文件复制到本机的Proxy安装目录中。

运行

在VPS上执行命令:

./proxy socks -t tls -p ":3333" -C proxy.crt -K proxy.key --daemon --forever --log proxy.log
  • socks:开启socks5代理
  • -t tls:使用TLS传输协议
  • -p ":3333":监听3333端口
  • -C proxy.crt -K proxy.key:指定证书文件
  • --daemon:后台运行
  • --forever:proxy会fork子进程,然后监控子进程,如果子进程异常退出,5秒后重启子进程
  • --log proxy.log:指定日志文件

本机打开Proxy安装目录中的“bootstrap.bat”文件,将“proxy.exe ...”这一行修改为:

proxy.exe socks -p ":3334" -t tcp -T tls -P "IP:3333" -C proxy.crt -K proxy.key --debug

其中小写"p"表示本机监听端口,大写“P”表示VPS端监听地址,小写“t”表示本机使用的传输协议,大写“T”表示VPS端使用的传输协议。保存文件后,双击“bootstrap.bat”即可启动Proxy。注意本机和VPS要开启相同的代理类型,例如必须同是http代理或者同是socks代理。

修改黑白名单

黑名单保存在安装目录下的"blocked"文件中,白名单保存在“direct”文件中,一行一个域名,匹配规则是最右匹配,比如:baidu.com,匹配的是 ..baidu.com。黑名单的域名直接走上级代理,白名单的域名不走上级代理,如果域名同时存在于黑白名单中,以黑名单的为准。因此我们还要检查白名单文件中是否有我们需要代理的域名,如果有的话,将其从白名单中删除,或者添加到黑名单中,否则这些请求就不会走代理了。

设置客户端

现在只要将客户端的代理类型设置为“socks5”,代理地址设置为“127.0.0.1:3334”即可绕过网管的监视了<( ̄3 ̄)> !

讨论数量: 3

用这个是不可以代理访问谷歌了

1周前 评论

@lovecn 至少需要一台国外的服务器,但是我未实际尝试过,不知道是否可行。

1周前 评论

@lovecn 是可以的--但是需求一台国外的服务器,可以自己试着实现一个代理服务 :+1:

1周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!