Total Pageviews

Saturday, 13 July 2013

Linux/mac桌面系统下,火狐使用Webvpn翻墙

自从知道了翻墙有了Webvpn协议之后我一直很好奇,如何才可以在Linux使用它,因为我发现它只能够在Chrome浏览器上正常使用,而且教程大多是在Chrome上用的,所以一心想知道如何才可以在火狐上使用这个代理,今天终于找到了方法。
这里我们先从Webvpn的原理说起(我不是专业人员,说的不准,请不要喷我),Webvpn我开始以为就是pac的变种,因为他一样是通过pac那一栏进行代理,于是我就把代理地址填进了pac那一栏,后来发现没有,今天才发现原来他的原理就是https的原理:
它像HTTPS 那样,使用 TLS 协议连接到代理服务器,然后再进行 HTTP 请求。
这个就是Webvpn的原理,知道了原理我们也就容易解决问题了。
解决方法:
因为firefox不支持直接使用这种https代理,我们需要把代理的https链接还原成http链接,再把本机发送的http链接加密成https链接,这里我推荐使用socat软件进行加/解密
安装:

sudo apt-get install socat
现在socat也就安装好了,接下来就是进行连接的加/解密了:
1socat tcp-listen:7082,fork openssl:vps-ip:8081,verify=0
介绍一下几个参数的用处: tcp-listen:7082,fork:这个参数中的7082就是本地端口,这个端口你可以根据你的意愿随便更改,主要的参数是fork,他的用处是当出现新的连接的时候他会创建一个新的进程来处理链接,不然的只要处理一个链接他就会自动退出。
openssl:vps-ip:8081,verify=0:其中vps-ip:8081就是代理服务器的ip地址和端口,verify=0这个参数很重要,如果不启用他的话就会导致socat检查证书,有可能导致连接不上代理服务器。

火狐的设置:
火狐的设置很简单,只要上面的正常,那么在代理中新建一个http proxy就行了,地址是127.0.0.1,端口就是之前设置的端口7082.当第一次使用代理的时候就会弹出一个窗口,提示你输入帐号和密码,输入你的帐号和密码就可以了.然后,火狐即可翻墙。

这样设置后,可以成功翻墙,看youtube也不慢。
---------------------------------------------
mac下,用brew install socat不太好,容易遇错.如果遇错,建议用编译的方法进行安装。详见
https://briteming.blogspot.com/2013/03/linux-vpssocatvps.html
----------------------------------------------

使用TLS/SSL加密你的HTTP代理

HTTP 代理是明文的,这导致实际访问的 URL 可以被他人监测到。即使使用 HTTPS 协议,经过 HTTP 代理时会发送CONNECT请求,告诉代理要连续到远程主机的指定端口。于是,访问的目标域名暴露了。
有没有办法将传输内容加密呢?比如像 HTTPS 那样,使用 TLS 协议连接到代理服务器,然后再进行 HTTP 请求。很遗憾的是,我在 ziproxy 的配置里没有发现这样的选项。在 shlug 邮件列表里询问后,Shell Xu 提到了 stunnel 这个工具。以前我试过用它把 HTTP 的网站转成 HTTPS 的,但是网站后端程序无法知晓用户实际上使用的是 HTTPS,有些郁闷,就没管它了。
这次再次请出 stunnel,在代理服务器上执行如下命令:
1
sudo stunnel -d 0.0.0.0:8081 -r localhost:8080 -p /etc/stunnel/stunnel.pem
这样,所有到服务器的 8081 端口的请求,都会经过 TLS 解密后传递给 8080 端口。同时响应的数据也会被加密后再返回请求方。
接下来的问题是,浏览器无法直接使用这种代理。实际上除了拿 openssl 命令手动连接外,我不知道任何程序能够使用这种代理。那好,本地弄个反过来加密/解密的服务好了。还是使用 stunnel。不过出了点意外:Arch Linux 的 stunnel 是第四版,不再用命令行参数,转而使用配置文件了。于是参考这篇 Upgrading to stunnel 4,写了份 stunnel4 的配置文件:
1
2
3
4
5
6
7
8
9
10
11
compression = zlib
foreground = yes
output = /dev/stdout
client = yes
pid = /tmp/stunnel.pid
# or will output to syslog :-(
output = /tmp/stunnel.log
[name]
accept = 8082
connect = vps-ip:8081
这样在本地 8082 端口监听,把所有请求加密后转发到vps-ip的 8081 端口。同时响应的数据会被解密后再返回。
现在,所有与代理服务器传输的数据都被加密了,不怕被偷窥啦。
后记:
后来,我发现其实代理服务器和我本机都装了两个版本的 stunnel,只是名字中不带版本号的一个是第三版而另一个是第四版而已……
再后来,我猛然想起神器 socat——这家伙是支持 OpenSSL 的!比如客户端这边,像下边这样子就可以了:

socat tcp-listen:8082,fork openssl:vps-ip:8081,verify=0
socat 真是神器啊,cat、netcat、rinetd、stunnel 的功能都覆盖了!
这样使用的时候,每次来新请求时,socat 会 fork 一个新进程来处理。有点浪费资源。不过略微查看了下,stunnel 似乎也一样。

 FROM http://lilydjwg.is-programmer.com/2012/10/25/secure-your-http-proxy-with-tls-ssl.36107.html

------
https://github.com/iiiiiii1/Socat