Sunday, March 2, 2008

ssh+privoxy组建socks转http代理服务器

来源: http://initiative.yo2.cn

这几天获得了PlanetLab在UESTC的2台node的TC权限,可以用ssh登录,所以心生邪念做了个ssh代理,可惜TheWorld2不支持socks代理(最新版已经支持了),于是用privoxy做了一个socks转http的代理。

环境

我所在的网管会办公室是202.115.22.x的网段,有一台装有debian的服务器,地址是202.11x.2x.135,准备用来做代理。

原理

Internet -> PlanetLab -> CERNET -> SSH://uestc1.6planetlab.edu.cn:22 -> HTTP://202.11x.2x.135:13500 -> 网管会的电脑
也就是从 SSH -> SOCKS代理(SSH Tunnel) -> HTTP代理(Privoxy)
Privoxy本来的作用是提供一个本机的代理来过滤广告和管理cookie,这里用到的是它的socks转http功能(Tor+Privoxy是黄金组合啊)
不清楚ssh端口转发可以去wikipedia看看。简单的说,有ssh的帐号相当于有一个准socks代理服务器(所以很多人用DreamHost的ssh来突破GFW)

准备

下载privoxy(截至est写这篇blog为止最新版本是3.0.6),用命令dpkg -i privoxy_3.0.6-0.sarge.1_i386.deb安装。

配置

用命令vim /etc/privoxy/config编辑privoxy的配置,这里逐条说明

#绑定地址202.11x.2x.135,端口13500作为HTTP代理服务器地址。如果是个人主机,不想让他人使用这个代理可以把改成127.0.0.1:13500
listen-address 202.11x.2x.135:13500

#限定只能网管会的电脑能访问这个代理
permit-access 202.115.22.128/26
#润新公寓的IP
permit-access 211.95.166.158

#使用ssh的端口转发做为二级socks代理。最后那个英文半角的点“.”表示把http请求转换为socks请求,很关键。
forward-socks4 / 127.0.0.1:13501 .

socks4和socks4a的区别:

socks4:先在本地DNS解析域名,再通过代理服务器请求页面
socks4a:在代理服务器DNS解析域名

启动代理服务

用命令ssh -CfNg -i /home/est/est_rsa -D 127.0.0.1:13501 -l site_admin uestc1.6planetlab.edu.cn后台连接到PlanetLab的节点上,各个参数的含义为:

ssh
-C 传输时压缩数据
f 输入密码登录后,ssh进入后台运行。这样我们才可以用ssh建立一个长时间不断的Tunnel
N 在ssh2协议中表示:不执行任何命令。我们需要的只是ssh的端口转发(tunnel)功能,所以并不需要一个shell
g 允许远程主机连接ssh转发的端口
-D 设置socks代理地址和端口。由于只是本机访问,所以设置为127.0.0.1:13501。如果需要在任意网络的计算机访问,可以设置成202.11x.2x.135:13501。其中13501是socks代理的端口
-l ssh登录名。
-i 指定ssh登录用的私钥

然后/etc/init.d/privoxy restart重启privoxy,好了,我们在另一台网管会电脑上试试telnet 202.11x.2x.135 13500,如果连接成功端口开放,那么我们的代理架设就离成功不远了!再在TheWord里设置代理为202.11x.2x.135:13500@HTTP#DormForce135,然后访问http://whois.ipcn.org/,显示 您的IP是: 219.243.200.81 您来自: 北京市 教育网 。我们的代理服务器架设成功了!

结束

开始享受PlanetLab在教育网访问国外网站的高速代理了,怎么一个爽字了得啊,呵呵。最开始调试SSH代理的时候发现PuTTY总是20秒断一次,很诡异,后来发现是DrCom的反代理功能,只要是socks代理就要20秒强行reset一次,晕!不过现在好了,youtubeBBCGoogleLastFM这些网站速度都十分理想,不比在润新寝室的联通速度慢哦。以后我还打算利用CERNET_UESTC Node的IP段,设计一个调用CoDeeN的程序(这个程序经开始和FourTFantanux等人筹划了,项目名字叫NetUnion CDN,主页暂时在http://code.google.com/p/nucdn/),那么我们的代理实现就是 Internet -> PlanetLab -> CoDeeN CDN -> CERNET_UESTC Node -> DormForce,不仅速度可以和一些收费VPN相比,而且完全没有CoDeeN的默认限制(例如不能POST,只能80端口等等)了,呵呵,这个跳板真是复杂~~