Pages

Thursday, 3 September 2015

搭建 Spdy SSL Proxy(不错,我测试成功。需要修改一些地方才行)

 随着 GFW 的不断升级, 很多原来可行的爬墙方法都出了问题: pptpvpn , openvpn 被彻底的干掉了(static key 仍然还可以), ssh 隧道会出现间歇性的断开, shadowsocks 最近也爆出问题. goagent 背靠 google 这颗大树, 暂时还可用,但是因为其用的 gae 公共云, 国外很多网站都已经将其 ip 放入了黑名单了.


最近在特推上看到了一篇介绍 spdy 协议的文章,其中比较吸引我的是其基于 ssl 加密的特性; 而且目前 chrome 已经实现了对 ssl 加密代理的支持. 这样通过自己搭建 spdy proxy 代理服务器就可以用 chrome 实现安全的爬墙. 
对于 spdy proxy 介绍的一篇文章: SPDY & Secure Proxy Support in Google Chrome
如上图所示,我们需要在墙的外面搭建一个 spdy proxy 服务, 通过为 chrome 设置 ssl 代理实现安全加密访问. 在 spdy proxy 的实现细节上,我们有几种办法:
1. 基于 node.js 实现的 spdyproxy,(https://www.npmjs.com/package/spdy), 参照教程
2. 基于 Shrpx  和 squid3  实现的 spdy-proxy.
3. 基于 Shrpx  和 apache traffic server 实现 spdy-proxy.
4. 基于 nginx  和 squid3  实现的 spdy-proxy

除了以上几种方法,还可以使用 haproxy 等其他软件, 前提是需要支持 spdy 协议就可以了. 后端代理可以不支持 spdy ,但是必须支持 ssl 加密才可以.
(from  http://blog.chaiyalin.com/2013/07/spdy-ssl-proxy-1.html)

这里我主要介绍一下我的尝试, Shrpx + Squid3 实现的 Spdy SSL Proxy 代理.

先介绍一下 Shrpx , 它是 spdylay项目中的一个组件. spdylay 是一个用 C 语言实现 SPDY 协议的库. 点击这里查看spdylay github 地址 . 在 spdylay 库之上有 spdycat:一个支持 spdy 协议的命令行客户端, 类似于 wget.  spdyd: 一个spdy 协议完全实现的 web server. Shrpx: 一个支持 spdy 协议的 reverse proxy server. Shrpx 是 Spdy/Https reverse proxy 的简称.

(编译完成spdylay后,会生成可执行文件shrpx。
root@localhost:~# which shrpx
/usr/local/bin/shrpx
root@localhost:~# )
为 chrome 设置 ssl 代理地址和端口后, 其通过 spdy/https 加密的方式连接到 Shrpx 服务器, 并将访问请求发给 Shrpx , Shrpx 将收到的请求再转发给后端的proxy(在这里使用的是squid3), 然后由后端的proxy获取请求的内容后再由 Shrpx 通过加密通道返回给 chrome客户端.

我进行测试的环境: 256m ubuntu 12.04  美国 vps 一枚. 首先编译安装 Shrpx, 安装和配置过程很简单.可以参考spdylay github 的说明.
cd ~
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout private.key -out public.crt
(所有步骤的问题可以一律回车。
/root/下就会生成private.key和public.crt这2个文件.)

下面给出我的 Shrpx 配置文件 shrpx.conf:
(自己创建shrpx.conf文件,比如在/root/下)

frontend=0.0.0.0,456
backend=127.0.0.1,3128
private-key-file=/root/private.key
certificate-file=/root/public.crt
spdy-proxy=yes
workers=2


配置文件很简单, frontend 就是你要设置的代理的地址和端口, backend 是后端代理工作的ip 和端口.  另外因为 spyd 需要 ssl 加密, 所以必须要设置证书和私匙, 这里你可以自己签发证书, 当然在使用的时候, 浏览器会发出警告,你必须忽略警告,并必须把你所自签发的证书文件(public.crt)下载到本地的WINDOWS机器,然后导入该证书文件到CHROME浏览器的
"受信任的根证书颁发机构"才可以正常使用.( 其实根本不需要导入证书到CHROME浏览器)。 关于如何自签发ssl加密证书,点这里. 另外配置文件里 spdy-proxy=yes 这个一定要有,否则你的 spdy proxy 只是个反向代理. 无法将请求转发给后端的squid.

配置完成后, 运行shrpx --conf /root/shrpx.conf 就可以启动 shrpx. 或者运行shrpx --conf=/root/shrpx.conf -s --daemon
记得修改/etc/rc.local文件,加入shrpx --conf=/root/shrpx.conf -s --daemon
(如何验是否成功的运行了呢. 这里需要安装一个 chrome 的扩展程序. spdy-indicator 它可以显示所浏览的网站是否支持 spdy 协议. 在浏览器里打开你说配置的 shrpx 的frontend 的ip 和端口, 如果在浏览器你的地址栏的最右侧看到一个绿色的小闪电标志,那就表明你的shrpx 配置成功了.)

关于后端代理squid 的安装配置就更简单,直接 apt-get install squid3 就安装好了. 对于配置文件的修改, 主要是端口(当然也可不改)和监听 ip 的修改. 在 /etc/squid3/squid.conf 里面修改 http_port 这项为127.0.0.1:3128 就可以了.  然后重启 squid.

下面就是要测试我们的spdy ssl proxy 是否成功了: 新建一个 chrome 的快捷方式, 然后右键属性, 在"目标" 这行里添加上你的代理的地址和端口:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=https://your-vps-ip:456 --ignore-certificate-errors"

注意:一定要加上--ignore-certificate-errors这段参数,否则无法成功翻墙。
改完后保存, 然后双击打开 chrome, 然后在地址栏里面输入 twiter.com  试一下, 保证翻墙成功.

from  http://blog.chaiyalin.com/2013/07/spdy-ssl-proxy-2.html

related post:
http://briteming.blogspot.jp/2015/08/nghttpx-http2.html (本文的内容几乎就是这个帖子内容的翻版)
http://briteming.blogspot.jp/2012/08/nodejsspdyproxy.html

http://briteming.blogspot.com/2015/08/spdylay.html
---------------------------

关于SPDY Proxy


SPDY是HTTP接替者,能减少网站加载的时间,SPDY协议能通过SSL加密通信的所有内容,令浏览器更加安全。
作为网站来说要想支持SPDY协议可以使用mod-spdy项目(Apache SPDY module)或者Strangeloop Site Optimizer服务(一个反向代理),作为用户要想知道访问的网站是否在使用SPDY协议可以通过SPDY indicator扩展查看(Chrome下载、Firefox下载)。
SPDY协议可以直接使用ssl加密代理而无需额外的软件。众所周知,我们在浏览器中设置使用普通http/https代理是没有加密的,GFW很早就可以检测其连接,当使用此http/https代理访问域名含有关键词的网站时就会被断开连接,也就是说其本身已经无法用来完成翻墙了(特殊端口除外)。而SPDY Proxy能通过SSL加密通信的所有内容,能轻易绕过GFW检测,达到翻墙的目的。
现在Chrome和Firefox两大浏览器都已经支持了SPDY协议,据我博客统计在众多翻墙用户中Chrome+Firefox的份额已经超过72%的比例,所以研究和部署SPDY Proxy有着很大的现实意义,这也促使我不得不说说SPDY Proxy。
SPDY Proxy的实现需要有支持SPDY协议的浏览器和支持SPDY协议的代理配合完成(详情):
代理服务器端可以使用stunnel加密普通代理,比如使用命令
stunnel -f -d 443 -r localhost:8080 -p cert.pem
也可以使用最新的Squid软件(其已经支持了代理的加密功能),需要在配置文件中设置:
https_port [ip:]port cert=certificate.pem [key=key.pem] [mode] [options…]
还可以使用其他软件,比如SPDY daemon.
Chrome浏览器的代理设置可以使用.pac脚本,脚本内容
function FindProxyForURL(url, host) { return “HTTPS vps-ip:443”; }
或直接使用如下命令启动
chrome --proxy-server=https://vps-ip:443
本文仅是一个自己认知简单的介绍并不是教程也可能存在谬误,具体SPDY Proxy的实现还需有心者研究。不过其加密代理可以直接设置或制作成扩展使用,比较方便易用,相信会有较大发展前途,也许有人正在使用研究
-------------------------

Secure Web Proxy


Introduction


A secure web proxy is a web proxy that the browser communicates with via SSL, as opposed to clear text.  In insecure public networks, such as airports or cafes, browsing over HTTP may leave the user vulnerable to cookie stealing, session hijacking or worse.  A secure web proxy can add a significant layer of defense in these cases.

Using a Secure Web Proxy with Chrome


To make use of a secure web proxy, Chrome needs to be configured to use a proxy auto-config file(http://en.wikipedia.org/wiki/Proxy_auto-config) which specify the HTTPS proxy type.  For example:


function FindProxyForURL(url, host) { return "HTTPS secure-proxy.example.com:443"; }


This pac file can be specified by starting Chrome with the --proxy-pac-url=... command line argument, or through the settings dialog.  Please be aware that other browser do not support the HTTPSproxy type in a .pac file, so modifying the system-wide proxy configuration to use such a .pac file might be inadvisable.


Alternatively, a secure web proxy can be specified by using the --proxy-server=https://<proxy>:<port> command line argument.  For example:


chrome --proxy-server=https://secure-proxy.example.com:443


Since the communication between Chrome and the proxy uses SSL, next protocol negotiation will be used.  If the servers supports SPDY, then the proxy will act as a  SPDY Proxy.(http://www.chromium.org/spdy/spdy-proxy)


Running a Secure Web Proxy


While all the details of running a secure web proxy are out of scope for this document, here are two suggestions.  If you are already running a web proxy, you use stunnel to convert it into a secure web proxy.  For example:


stunnel -f -d 443 -r localhost:8080 -p cert.pem 


This would cause stunnel to listen for SSL connections on port 443 and send any HTTP requests to the web proxy running on port 8080.


Alternatively, the popular proxy program Squid appears to offer support for running as a secure web proxy via the https_port directive.(http://www.squid-cache.org/Doc/config/https_port/)


from http://www.chromium.org/developers/design-documents/secure-web-proxy