得厨神@paveo 的创意,何不将其用在手机等移动设备上?厨神的APN现在已经很成熟并在免费有限量专供中。我今天这里写得,是如何搭建自己的APN Proxy(APN 代理),但在阅读下面内容之前,需要一个刚性要求:一台在国内的Unix-Like的主机(可以是Linux/FreeBSD/Mac Osx Server/Solaris等等)并且是公网IP地址以及在国外的VPS主机(Unix类)。这个要求可以看出成本比较高,所以我看到淘宝上已经有人开 始出售APN代理了,这个可以理解。
第一部分 原理
原理图1
如 上图所示,我们要实现的功能原理是,将上网请求先发送到“国内VPS”,再由“国内VPS”通过SSH隧道转送到国外,最终实现无阻上网。点击查看大图可 以看出,主要配置是在“国内VPS”上,包括配置SSH -D、Squid、Privoxy或者Polipo(socks代理程序你可以选自己喜欢的)。
第二 配置
1 国外VPS
国外VPS上,你需要有一个SSH帐户,并且请注意,使用密钥方式登录你的SSH而非密码,之所以如此,是为了下一步建立长久的SSH以及断线自动重连做准备,这个很重要。关于“SSH 免密码 密钥 登录”请使用google看一下。
这 里有一个小插曲,部分centos 上如果默认的话,SSH帐户会报错,大约 是adminitstatly close之类,这有可能是 openfile数目问题,可以轻松解决。我非Linux爱好者,所以是临时google,并没有记录下来,你只要记得如果遇到同样问题,5分钟之内就可 以google解决。
2 国内VPS
这一节将会是我们的主战场,基本上,我将会按下面的逻辑图来进行配置,这其中会涉及很多文件的配置,需要你注意哦,最后部分我会提供部分配置文档下载,由于我使用的是FreeBSD,因此会有少量差异,我想这不会难倒你,对么?
原理图2
A SSH 隧道
其 实就是我们平时上网用的 SSH -D 方式,在本地打开 7070端口到国外VPS的SSH建立隧道,这样我们出国的流量就经过加密了。我们平时使用 ssh -qN -D 7070 demo@excample.com 来连接,但是现在我们要站在服务器的角度考虑问题:如果SSH -D方式中断了,怎么办?
这 里我们要做的事情是,建立一个机制,使得在SSH隧道出现问题的时候可以自动重启自动连接,有一个现成的工具可以使用 autossh (FreeBSD请使用 whereis autossh ),autossh 可以传递大多数ssh的参数,包含 -D ,然后会监视这个会话连接,如果出现中断就可以自动重连接。
不过,如果 ssh 连接本身没有中断,但是进程卡死,sleep 状态,autossh 也不顶了怎么办?于是又要写一个脚本,定时检查 autossh 进程或者干脆定时重启 autossh 。
以下为脚本
#!/bin/sh
export AUTOSSH_PIDFILE=/var/run/autossh.pid
pidfile=”/var/run/autossh.pid”
if [ -f $pidfile ];then
kill `cat $pidfile`
touch $pidfile
else
touch $pidfile
fi
/usr/local/bin/autossh -M 9000 -f -q -N -D 7070 root@excample.com
######################
#脚本 autossh.sh 结束#
######################
注意上面最后一句 autossh -M ,这个参数是监控端口,大体是通过此端口来判断 ssh 隧道是不是有问题,这个端口你可以随意指定。你也可以将这个脚本加入到 crontab 中(使用crontab -e),比如我,设定半小时执行一次,目的是每半小时无论SSH连接是否正常都会重启一下隧道连接,也可以设定在夜间重启,总之,随你如何了。
接 下来,为了防止假死情况发生(我指autossh本身),我又再次写了一段脚本,用来实时监控 autossh 进程,一旦进程中断,这个新脚本就可以重新启动SSH连接。这个脚本是用来监控进程PID是否存在,PidFile有没有进程号,端口7070存在否。 (注意,这是在FreeBSD写得脚本,因此你需要改成适用于你系统的,比如 sockstat 其他系统没有这个命令,用以查看端口使用,你可以使用 netstat 来取代 )
#!/bin/sh
while :
do
stillRunning=$(ps awx |grep “(autossh)” |grep -v “grep” | awk ‘{print $1}’)
dead=`cat /var/run/autossh.pid`
port=`sockstat -4l | grep :7070`
[ -z "$stillRunning" -o -z "$dead" -o -z "$port" ] && /etc/autossh.sh
sleep 10
done
########################
#mon-autossh.sh脚本结束#
########################
mon-autossh.sh中使用了无限循环,你也可以使用crontab来做定时检测,使用上面的脚本会吃系统资源尽管对于单服务类型的主机来说这一点也不是问题。
做完以上步骤,这时候我们就在本地建立了一个端口映射,即一个 7070端口的 socks5 代理。
我 们即将进行下一步,但有个问题挡在面前,为何我们不直接将这个sokes5代理应用到squid上却非要安装 Privoxy或者polipo?这是因为,squid 虽然支持二级代理,但是要求父代理必须是 HTTP ,因此我们的 ssh 生成的 socks5 代理就不能用了,我们就借助第三方软件来给squid 穿上 ssh 的外衣,这就是即将用到的 privoxy 或者 polipo 中的一种,注意,你只需要安装其中一种,我之所以将两种都写出来,是因二者有不同,希望你能了解个中不同,选择自己需要的。
B 代理转换 Privoxy 或者 Polipo,以及最好用的 3Proxy
1) Privoxy
我 想使用过Tor的人应该很熟悉这个软件,或者使用opera浏览器的人。这个程序强大的地方除了可以将 socks5 代理转为 HTTP 外,还在于它支持按照规则转发(比如将GFW认证的网站与普通网站区分开)、广告过滤。也就是说,Privoxy 这个程序已经可以取代 squid 的功能,所以若你选择了 Privoxy 配置完好,就可以不看下面的部分了(只是认证环节我一直无法搞定)。不多说了,下面附上配置,分为两部分 Privoxy 的 config 和 gfw.action ,前者是全局设定,后者则是只将gfw的网站代理出国,其他网站仍然走国内路由,提高访问速度。
########
#以下是 privoxy 的 config
########
user-manual /usr/local/share/doc/privoxy/user-manual
confdir /usr/local/etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
### 下面这个 block.action 就是默认的过滤规则,可以去广告
#actionsfile block.action
#### 下面 gfw.action 就是我们需要的,只有符合这个规则才走国外代理
#### 请在 config 同目录下创建 gfw.action
actionsfile gfw.action
filterfile default.filter
#filterfile user.filter
logfile logfile
hostname www.chinablock.me
#forward-socks5 / 127.0.0.1:7070 .
# 下面这一行表示 打开 8118端口,你可以用手机直接连接进来
###################################################
listen-address 0.0.0.0:8118
### 下面的配置我不多说,都是必要项,有兴趣的可以日后研究
###
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 5120
#connection-sharing 0
forwarded-connect-retries 3
accept-intercepted-requests 0
allow-cgi-request-crunching 0
activity-animation 1
split-large-forms 0
keep-alive-timeout 0
socket-timeout 120
handle-as-empty-doc-returns-ok 1
#### 配置结束 #######################################
OK了,这个就默认的 Privoxy 的 config 了,接下来我们要定义 gfw.action ,要把 autoproxy 里的那么多网址加进来,会累死你的,幸运地有网友已经提前做好了,请访问这里
然后修改 gfw.action 为 {+forward-override{forward-socks5 127.0.0.1:7070 .}} ,注意 那个“ . ”,很必要。
如果按以上方式,其实你已经配置好了代理,并且打开你的手机,在代理那里输入 IP : 8118 就可以访问世界了。iphone/ipad/touch/需要到app store 下载安装“易apn”这个软件,然后在专网那里自定一个 apn 代理就可以了。当然,选用squid自有选用的道理,配置完之后同样也可以被squid拿来使用。我们接着配置另一个代理 polipo (两个代理软件,你只需要选择一个)
2) Polipo
我 想大家可以注意到 tor的默认组合已经从 tor + Privoxy 转换到了 tor + polipo ,前者我们在上面已经说过优点,缺点就是太难配置了(其实我觉得也不难啊,就是规则写起来麻烦点点),而polipo优点是自带缓存功能,有一定的加速效 果,再者就是可以将几个SSH通道做负载均衡,就是说你可以建立多个SSH -D连接然后绑定到一个polipo上。另一个好处就是配置简单易用,不过过滤功能就比privoxy弱了许多(也可以ad-block,不过真没必 要)。
所以我当前在用的方案就是 Squid + Polipo ,polipo 可以不设置缓存,设置了也不会影响,缓存工作交给squid来就OK。这一部分的配置可以参阅http://xijie.wordpress.com /2011/05/28/squid3polipo-use-sock5/,但是只参阅而不要使用这个配置,除非同时连接多个ssh主机。下面给出我的 polipo配置
#config file for polipo @ /usr/local/etc/polipo/
proxyAddress = “0.0.0.0″ # IPv4 only
proxyPort = 8119
allowedClients = 127.0.0.1,211.161.103.253
allowedPorts=1-65535
proxyName = “APN代理”
socksParentProxy = “localhost:7070″
socksProxyType = socks5
chunkHighMark = 819200
objectHighMark = 128
diskCacheFilePermissions=0640
diskCacheDirectoryPermissions=0750
disableIndexing = false
disableServersList = false
dnsQueryIPv6 = no
disableVia=false
censoredHeaders = from, accept-language
pmmFirstSize = 16384
pmmSize = 8192
maxConnectionAge = 5m
maxConnectionRequests = 120
serverMaxSlots = 8
serverSlots = 4
tunnelAllowedPorts = 1-65535
#End
大体上,如上的配置,就已经成功,同 B 1) 一样,这个时候只要设置代理为 8119 就可以上网了,可以不必向下阅读Squid部分了。
3) 3Proxy
尽管我很喜欢使用polipo,但是在和squid配合使用时会有点点小毛病,而且3Proxy的功能更合乎我的需求:多端口代理,同时开放 socks5和http,并且可以做负载均衡,本例中不介绍,你可以查阅相关文章,我直接附上我的配置
###########################################
#!/usr/local/bin/3proxy
config /usr/local/etc/3proxy.cfg
nserver 8.8.8.8
nscache 65536
timeouts 1 5 30 60 180 1800 15 60
daemon
log /var/log/3proxy.log D
rotate 10
logformat “- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T”
archiver gz /usr/bin/gzip %F
auth iponly
allow * 127.0.0.1,220.161.103.253 * *
parent 1000 socks5 127.0.0.1 7070 #使用父代理SSH -D
proxy -a -p8117 #-a 是指匿名,-p指端口
external 12.34.56.78
internal 12.34.56.78 #你可以在这里改成127.0.0.1,原文档中有说明
allow * * * 80-88,8080-8088 HTTP
allow * * * 443,8443 HTTPS
#####################
## 脚本结束 #####
#####################
需要说明的是,3Proxy的配置文件 3proxy.cfg,你可以加上执行权限,直接就可以运行。这也是目前我在使用的 Squid + 3Proxy 构架,建议各位可以尝试一下这个。
C Squid 配置
如果你可以使用Squid 3.1 ,那么请选择它,但是它的性能不如 Squid 2.7 可是多了一个特性,就是可以限速,这个在 Squid 2.7 上是没有的,我使用的是 Squid 2.7 ,性能最好的一个版本。
我在这里要说的是,使用squid的原因是为了更大的缓存,限速以及更好的根据IP和域名区分国内国外网站从而决定是否走国外代理。所以我摘要解释一下配置,并提供一个配置下载连接。
由于我是squid 2.7 ,有些参数 squid 3.0+已经不再支持 比如 acl all src 0.0.0.0/0 ,这一条如果是在 squid 3.0中就会有问题,需要删除,因为squid 3.0 已经默认 All 这个分组了。
首 先是squid的密码验证,你可以设置也可以不设置,在我的配置文件中已经为你默认注释掉,但是都已经配置好,包括摘要验证digest和基本验证 basic,还有 auth ttl 都已经设定好,需要的话,自己创建一个password文件然后就可以用了,password直接使用明文 plaint_txt 就可以,或者用httpd 一个password生成器(有web端,google 一下就OK)。
然后设定squid 引用我们在 B 中设定的代理,使用:
cache_peer 127.0.0.1 parent 8119 6000 no-query
其中 6000 是一个 icp 端口?反正没什么用,我也不知道。。。。
下面这一句,不用我说你也猜出作用了:
visible_hostname APN-Squid-Proxy-@bao3
http_port 3128
接下来是要求squid按规则区分国内国外路由的文件引用:
include /usr/local/etc/squid/gfw.squid
include /usr/local/etc/squid/proxyroute.squid
好 吧,这两个文件我也已经创建好了,在下载链接里,你去下载吧。接下来是告诉 Squid proxyroute 这个规则中的请求直接走国内的IP,而 gfw 这个规则中的域名则不允许直接走国内IP而是走国外IP。最后 never_direct allow all 是要求所有的未在proxyroute 这个规则中的请求都走国外IP上网。( Proxyroute 这个规则中全是IP地址,而且都是中国IP地址 )
always_direct allow proxyroute
never_direct allow gfw
never_direct allow all
#always_direct allow proxyroute
#never_direct allow proxyroute
#always_direct deny gfw
#always_direct allow all
###################################################################
Squdi 配置文件的最后一部分,是关于cache 参数的,我已经设定好但却是依照我的系统进行的,所以你可以自由调整你的需要
文件 gfw.squid ,是存储了绝大多数被国家GFWed了的域名,当一个新域名被封杀时,你可以手动在下面加入。而 proxyroute 则包含了中国所有的IP地址段,你可以定期到 http://code.google.com/p/chnroutes/ 自己手动更新,但是请注意,默认生成的route.txt并不使用squid使用,需要使用vi/emacs/sed/awk 等等自己更正。
https://t.co/0ywZ57Ey Squid 配置文件夹下载(有用的文件只有 squid.conf gfw.squid proxyroute.squid ,其他的都临时文件或者默认文件 )
最后,也许有人会问,为何你没有提及加密的问题?手机APN 代理 设置好了,可是没有加密怎么办?
我们平时提到加密,一般是口令验证或者通信加密。口令验证是传递回服务器,由squid完成,这个我在配置文件头部已经写好了,但口令验证不能保证通信内容不被监视,这就需要通讯加密。
我 们提到通讯加密,最熟悉的就是SSL证书方式,也有其他方式,但这些通讯加密方式都有一个共性----需要在客户端(手机)和服务端(Squid)之间协 调算法并能加密和解密。但是我们的手机APN设置那里显然是无法设置解密或者加密方式,直接了当地说,APN Proxy 的设置处无法实现双向通讯加密,如果非要实现,就需要借助特定软件来做到,因为软件可以识别密钥并能正确加密。
当然,以上是基于通信理论和自己实践得出,也可能真的有 APN Proxy 可以在系统 APN 那里设定加密套接字????
祝福各位~~~我反正是爽死了,每天都用着 HTTP Proxy 。
-------------------------------------------------------------------------搭建增强型代理服务器(APN Proxy)
我 在上一篇博文中已经写了如何搭建简单APN代理,这一个月中我一直在测试(苦逼的IT男,别人过年带老婆回家,我是带着ipad+ssh 在家测试),于是推翻掉上一篇文章中的方案,使用本文的方案。 本篇原理与上一篇相仿,不同的实现则是使用 Ziproxy+Privoxy(上一篇是使用Squid+Privox/3Proxy/polipo),我的系统是 FreeBSD 8.2-Release ,你可以选用你喜欢的Unix-Like主机。使用Squdi实现的好处是在访问时可以有缓存:由于让PC(或者手持设备---以下统称装置)加快网速, 以抵消由于使用代理带来的网速慢,因此比使用VPN绝对是要快多了。
本文假定你有两台主机,国内主机使用SSH连接到国外主机,事实上如果你 只有一台国外主机,则可以直接使用Ziproxy而无需Privoxy,但 是请务 必注意,在只有一台国外主机的情况下,请将Ziproxy的端口改成一组特殊端口,抱歉,不能直说是哪几个端口,但是聪明的你应该可以猜到,实在不想猜, 就直接到twitter上问吧
我想多数人在装置应该使用过Opera浏览器,当我们打开一个网页的时候,Opera用自己的 OperaTurbo技术加速打开,实际上大家也发现 了,用 它打开网页后图像变的模糊了,这是因为被服务器压缩过。而我们今天使用的这个方案就是采用压缩方式来达到节约流量和提高网速。
Ziproxy的主 要作用是压缩HTTP请求和优化精简图片,它可以把JS,CSS,HTML和JPEG,PNG,GIF都压缩,然后再传递给你的 装置使 用,更好玩的是,它还可以区分用户,比如你想给手机用户使用代理,那么创建一个针对手机的配置,把图片压缩的重一点;而想把代理给ipad或者电脑用,就 创建一个针对电脑的配置,把图片压缩的轻一点;两个配置的端口只要不同就OK了。
Privoxy在这个方案中有两个作用:1 将SSH的 socks5 代理转化为HTTP代理然后给ziproxy使用 ,这是因为 Ziproxy只支持http的父代理。2 区分网站。Privoxy会将被 某国家 屏蔽的网站转发到SSH 代理上,而将没有屏蔽的直接走你的国内主机线路。
方案开始实施:
1 建立到国外主机的连接( SSH -D)
我是使用autossh的,建立你也使用这个工具,它会监视你的ssh连接,在断线时可以自动重连接,不过你可以自己动手写脚本
我的SSH 连接在本地开的端口是 7070 ,这个是大家现在的标配了,不多说。
2 安装和配置Privoxy
freebsd上可以用ports安装也可以直接pkg_add -r ;其他系统也一样有自己的方式安装,Unix-Like中似乎只有Mac有点区别,幸好不会有人用Mac server做这个方案。 :D
这里着重说一下配置
Privoxy的配置文件默认是config ,我的位置是在 freebsd 的 /usr/local/etc/privoxy/
配置文件很短,我们要修改一下
ota# cat /usr/local/etc/privoxy/config
user-manual /usr/local/share/doc/privoxy/user-manual
confdir /usr/local/etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
#actionsfile block.action
actionsfile gfw.action
filterfile default.filter
#filterfile user.filter
logfile logfile
hostname www.test.me
#forward-socks5 / 127.0.0.1:7070 .
listen-address 127.0.0.1:8116
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 5120
#connection-sharing 0
forwarded-connect-retries 3
accept-intercepted-requests 0
allow-cgi-request-crunching 0
activity-animation 1
split-large-forms 0
keep-alive-timeout 0
socket-timeout 120
handle-as-empty-doc-returns-ok 1
诸 位请注意以上代码中黑底紫字部分,是我们的关键,其他字段都是是否开关一些功能和是不是支持广告过滤和屏蔽恶意网站。在紫色字体中,我故意注释掉 了 forward-socks5的代理转发功能,这个意图是希望Privoxy默认不转发到SSH,即默认情况下让Privoxy直接走国内IP。可是我们 想让一些特殊网站走国外IP,这就是紫色字体中的 actionsfile gfw.action 这里指定。
gfw.action 是一个专门收集一些特殊网站的文件并在些文件中规定了这些网站走SSH -D 的代理(端口是7070).这个文件起先我是自己写的,一个一个加上去,后来直接用正则过滤了autoproxy2pac中的URL,后来我发现一个更好 玩的,你可以直接在这里下载gfw.action这个文件,传送门-> 爱我就摸我一下.。
从以上网站下载的gfw.action文件还不能被我们直接使用,原作者已经提到,需要我们将其中的代理端口改成自己的,我是直接用
sed -i ‘s/7127/7070/’ /usr/local/etc/privoxy/gfw.action
你可以使用vi打开来改第一行(注:FreeBSD 上sed不能使用这条语句需要安装GNU Sed,即gsed方可)。
经过这一步,Privoxy将会默认直接走国内路由,访问特殊网站时则会自动选择SSH代理,达到了区分网站的目的,接下来我们就可以实现将访问流量进行压缩的操作
3 Ziproxy 配置
安 装好Ziproxy,Debian/Ubuntu都有源可以直接装。而Ziproxy的配置,在我的 FreeBSD 上存在于 /usr/local/etc/ziproxy/ 下 (这也是FreeBSD一个优点,所有第三方都放在这个位置),cp ziproxy.conf.sample ziproxy.conf ,使用默认配置。
默认配置当然不合我们的要求,修改以下参数:
1 Port = 6060
这是指Ziproxy 的监听端口,这个端口将来用来给你的其他装置用
2 #Address = “127.0.0.1″
这个是指将Ziproxy的代理绑定到你主机的哪个IP上(如果有多个的话),默认是绑定到所有的IP上,但需要注意一下是否是这样,免得手机连接不上代理却是因这个,那就是笑话了。
3 #OnlyFrom = “127.0.0.1″
这个是访问限制,可以限制哪些IP可以访问你的代理(APN Proxy),我是允许所有人访问,但这极不安全,可以使用SASL认证,目前我还在研究中。。。。
4 # MaxActiveUserConnections = 20
这是用来限制一个用户可以产生多少条连接,默认是不限制,但这样就可能被人用来下载迅雷等等,你可以加上限制
5 NextProxy=”127.0.0.1″
下一跳代理,也就是父级代理。我们的手机连通过 Port=6060端口连接到你的这台主机后,ziproxy会把连接直接丢给 127.0.0.1的下一个代理(也就是我们的Privoxy)
6 NextPort=8116
下一跳代理的端口,我设定的是8116。
7 ConventionalProxy = true
这一项没什么好说,一定要是true,我人为改为false就失败了。
4 扫尾
[你没有必要看这里,因为做完前3步你的服务器就已经完全可以运行了]
大家可以跳过一步,之所以加上,是因为我自己有两个海外的SSH 主机,防止一个断掉也或者用于网络质量不好的时候切换线路。于是自己写了一段脚本,这段脚本只能运行在FreeBSD下,因为里面有几个命令其他系统没有,不过都有替代命令。
脚本的目的是监视两个SSH生成的端口7070和8080,如果其中一个断掉了(比如SSH 7070),就自动强制Privoxy使用另一个(SSH 8080),并且尝试立刻重新连接(SSH 7070)。这样在APN Proxy就可以尽量不受影响。下面是脚本
#!/bin/sh
export AUTOSSH_PIDFILE=/var/run/autossh.pid
while :
do
sshport=`sockstat -4l | grep :8080 | awk ‘{print $3}’`
sshpid=$( sockstat -4l | grep autossh | grep 9101 | awk ‘{print $3}’ )
pidfile=`cat /var/run/autossh.pid`
privoxypid=`cat /var/run/privoxy/privoxy.pid`
if [ -z "$sshport" -o -z "$sshpid" ]; then
kill -9 $sshpid
kill -9 $sshport
/usr/local/bin/autossh -M 9100 -f -q -N -D 8080 root@206.253.165.50
/usr/local/bin/gsed -i ‘s/8080/7070/’ /usr/local/etc/privoxy/gfw.action&&kill -HUP $privoxypid
#echo Now Start AutoSSH@PID `cat $pidfile`
fi
ssh1port=`sockstat -4l | grep :7070 | awk ‘{print $3}’`
ssh1pid=$( sockstat -4l | grep autossh | grep 9001 | awk ‘{print $3}’ )
if [ -z "$ssh1port" -o -z "$ssh1pid" ]; then
kill -9 $ssh1port
kill -9 $ssh1pid
/usr/local/bin/autossh -M 9000 -f -q -N -D 7070 root@216.231.135.225
/usr/local/bin/gsed -i ‘s/7070/8080/’ /usr/local/etc/privoxy/gfw.action&& kill -HUP $privoxypid
fi
sleep 10
done
这段代码已经稳定运行了20天了,我现在随便重启一台海外的主机,这脚本都可以自动切换到另一台,很是舒服。这属于额外设置,你可以不必理会。
经 过以上设置,你的APN 代理算是初步弄好了,还记得我前面提到的可以创建不同的ziproxy来区分不同用户吗,那你就可以分享给别人了。但是需要注意的是,尽管这种方式不会被 RST重置,但是仍然不可能脱离有关部门的监管。并且如果他人分享APN 代理给你用,你也需要注意,这是不加密的,你的信息被会轻易获取,所以最好是跟自己的铁哥们合着用或者直接自己使用
最后写完的时候看到网上有这么 一文章,与我的思路一致,不同之处在于,将SSH 方式使用openvpn,这样不必使用privoxy了;区分代理走国内还是走国外也是由openvpn实现,而我是使用privoxy。这思路也不错, 用我的方案可以压缩+过滤,用他的,则应该没有这功能,大家可以参考这里: http://ayanamist.tumblr.com/post/16227815835/apn-proxy
有人只有一台海外主机,那你幸福了,所有都不需要做,直接安装ziproxy,然后默认设置情况下改一下Port为特殊端口就可以直接代理了,区别只在于没有了广告过滤和路由区分,不过如果是在电脑上或者使用ios,则可以用 autoproxy2pac来达到自动路由。
祝各位龙年大吉,早生贵子,家人健康,生活美满~~~ 顺道征女友一只,让我也能实现前面的这句话
-----------------------------------------------------------------本文假定你有两台主机,国内主机使用SSH连接到国外主机,事实上如果你 只有一台国外主机,则可以直接使用Ziproxy而无需Privoxy,但 是请务 必注意,在只有一台国外主机的情况下,请将Ziproxy的端口改成一组特殊端口,抱歉,不能直说是哪几个端口,但是聪明的你应该可以猜到,实在不想猜, 就直接到twitter上问吧
我想多数人在装置应该使用过Opera浏览器,当我们打开一个网页的时候,Opera用自己的 OperaTurbo技术加速打开,实际上大家也发现 了,用 它打开网页后图像变的模糊了,这是因为被服务器压缩过。而我们今天使用的这个方案就是采用压缩方式来达到节约流量和提高网速。
Ziproxy的主 要作用是压缩HTTP请求和优化精简图片,它可以把JS,CSS,HTML和JPEG,PNG,GIF都压缩,然后再传递给你的 装置使 用,更好玩的是,它还可以区分用户,比如你想给手机用户使用代理,那么创建一个针对手机的配置,把图片压缩的重一点;而想把代理给ipad或者电脑用,就 创建一个针对电脑的配置,把图片压缩的轻一点;两个配置的端口只要不同就OK了。
Privoxy在这个方案中有两个作用:1 将SSH的 socks5 代理转化为HTTP代理然后给ziproxy使用 ,这是因为 Ziproxy只支持http的父代理。2 区分网站。Privoxy会将被 某国家 屏蔽的网站转发到SSH 代理上,而将没有屏蔽的直接走你的国内主机线路。
方案开始实施:
1 建立到国外主机的连接( SSH -D)
我是使用autossh的,建立你也使用这个工具,它会监视你的ssh连接,在断线时可以自动重连接,不过你可以自己动手写脚本
我的SSH 连接在本地开的端口是 7070 ,这个是大家现在的标配了,不多说。
2 安装和配置Privoxy
freebsd上可以用ports安装也可以直接pkg_add -r ;其他系统也一样有自己的方式安装,Unix-Like中似乎只有Mac有点区别,幸好不会有人用Mac server做这个方案。 :D
这里着重说一下配置
Privoxy的配置文件默认是config ,我的位置是在 freebsd 的 /usr/local/etc/privoxy/
配置文件很短,我们要修改一下
ota# cat /usr/local/etc/privoxy/config
user-manual /usr/local/share/doc/privoxy/user-manual
confdir /usr/local/etc/privoxy
logdir /var/log/privoxy
actionsfile match-all.action
actionsfile default.action
#actionsfile block.action
actionsfile gfw.action
filterfile default.filter
#filterfile user.filter
logfile logfile
hostname www.test.me
#forward-socks5 / 127.0.0.1:7070 .
listen-address 127.0.0.1:8116
toggle 1
enable-remote-toggle 1
enable-remote-http-toggle 0
enable-edit-actions 0
enforce-blocks 0
buffer-limit 5120
#connection-sharing 0
forwarded-connect-retries 3
accept-intercepted-requests 0
allow-cgi-request-crunching 0
activity-animation 1
split-large-forms 0
keep-alive-timeout 0
socket-timeout 120
handle-as-empty-doc-returns-ok 1
诸 位请注意以上代码中黑底紫字部分,是我们的关键,其他字段都是是否开关一些功能和是不是支持广告过滤和屏蔽恶意网站。在紫色字体中,我故意注释掉 了 forward-socks5的代理转发功能,这个意图是希望Privoxy默认不转发到SSH,即默认情况下让Privoxy直接走国内IP。可是我们 想让一些特殊网站走国外IP,这就是紫色字体中的 actionsfile gfw.action 这里指定。
gfw.action 是一个专门收集一些特殊网站的文件并在些文件中规定了这些网站走SSH -D 的代理(端口是7070).这个文件起先我是自己写的,一个一个加上去,后来直接用正则过滤了autoproxy2pac中的URL,后来我发现一个更好 玩的,你可以直接在这里下载gfw.action这个文件,传送门-> 爱我就摸我一下.。
从以上网站下载的gfw.action文件还不能被我们直接使用,原作者已经提到,需要我们将其中的代理端口改成自己的,我是直接用
sed -i ‘s/7127/7070/’ /usr/local/etc/privoxy/gfw.action
你可以使用vi打开来改第一行(注:FreeBSD 上sed不能使用这条语句需要安装GNU Sed,即gsed方可)。
经过这一步,Privoxy将会默认直接走国内路由,访问特殊网站时则会自动选择SSH代理,达到了区分网站的目的,接下来我们就可以实现将访问流量进行压缩的操作
3 Ziproxy 配置
安 装好Ziproxy,Debian/Ubuntu都有源可以直接装。而Ziproxy的配置,在我的 FreeBSD 上存在于 /usr/local/etc/ziproxy/ 下 (这也是FreeBSD一个优点,所有第三方都放在这个位置),cp ziproxy.conf.sample ziproxy.conf ,使用默认配置。
默认配置当然不合我们的要求,修改以下参数:
1 Port = 6060
这是指Ziproxy 的监听端口,这个端口将来用来给你的其他装置用
2 #Address = “127.0.0.1″
这个是指将Ziproxy的代理绑定到你主机的哪个IP上(如果有多个的话),默认是绑定到所有的IP上,但需要注意一下是否是这样,免得手机连接不上代理却是因这个,那就是笑话了。
3 #OnlyFrom = “127.0.0.1″
这个是访问限制,可以限制哪些IP可以访问你的代理(APN Proxy),我是允许所有人访问,但这极不安全,可以使用SASL认证,目前我还在研究中。。。。
4 # MaxActiveUserConnections = 20
这是用来限制一个用户可以产生多少条连接,默认是不限制,但这样就可能被人用来下载迅雷等等,你可以加上限制
5 NextProxy=”127.0.0.1″
下一跳代理,也就是父级代理。我们的手机连通过 Port=6060端口连接到你的这台主机后,ziproxy会把连接直接丢给 127.0.0.1的下一个代理(也就是我们的Privoxy)
6 NextPort=8116
下一跳代理的端口,我设定的是8116。
7 ConventionalProxy = true
这一项没什么好说,一定要是true,我人为改为false就失败了。
4 扫尾
[你没有必要看这里,因为做完前3步你的服务器就已经完全可以运行了]
大家可以跳过一步,之所以加上,是因为我自己有两个海外的SSH 主机,防止一个断掉也或者用于网络质量不好的时候切换线路。于是自己写了一段脚本,这段脚本只能运行在FreeBSD下,因为里面有几个命令其他系统没有,不过都有替代命令。
脚本的目的是监视两个SSH生成的端口7070和8080,如果其中一个断掉了(比如SSH 7070),就自动强制Privoxy使用另一个(SSH 8080),并且尝试立刻重新连接(SSH 7070)。这样在APN Proxy就可以尽量不受影响。下面是脚本
#!/bin/sh
export AUTOSSH_PIDFILE=/var/run/autossh.pid
while :
do
sshport=`sockstat -4l | grep :8080 | awk ‘{print $3}’`
sshpid=$( sockstat -4l | grep autossh | grep 9101 | awk ‘{print $3}’ )
pidfile=`cat /var/run/autossh.pid`
privoxypid=`cat /var/run/privoxy/privoxy.pid`
if [ -z "$sshport" -o -z "$sshpid" ]; then
kill -9 $sshpid
kill -9 $sshport
/usr/local/bin/autossh -M 9100 -f -q -N -D 8080 root@206.253.165.50
/usr/local/bin/gsed -i ‘s/8080/7070/’ /usr/local/etc/privoxy/gfw.action&&kill -HUP $privoxypid
#echo Now Start AutoSSH@PID `cat $pidfile`
fi
ssh1port=`sockstat -4l | grep :7070 | awk ‘{print $3}’`
ssh1pid=$( sockstat -4l | grep autossh | grep 9001 | awk ‘{print $3}’ )
if [ -z "$ssh1port" -o -z "$ssh1pid" ]; then
kill -9 $ssh1port
kill -9 $ssh1pid
/usr/local/bin/autossh -M 9000 -f -q -N -D 7070 root@216.231.135.225
/usr/local/bin/gsed -i ‘s/7070/8080/’ /usr/local/etc/privoxy/gfw.action&& kill -HUP $privoxypid
fi
sleep 10
done
这段代码已经稳定运行了20天了,我现在随便重启一台海外的主机,这脚本都可以自动切换到另一台,很是舒服。这属于额外设置,你可以不必理会。
经 过以上设置,你的APN 代理算是初步弄好了,还记得我前面提到的可以创建不同的ziproxy来区分不同用户吗,那你就可以分享给别人了。但是需要注意的是,尽管这种方式不会被 RST重置,但是仍然不可能脱离有关部门的监管。并且如果他人分享APN 代理给你用,你也需要注意,这是不加密的,你的信息被会轻易获取,所以最好是跟自己的铁哥们合着用或者直接自己使用
最后写完的时候看到网上有这么 一文章,与我的思路一致,不同之处在于,将SSH 方式使用openvpn,这样不必使用privoxy了;区分代理走国内还是走国外也是由openvpn实现,而我是使用privoxy。这思路也不错, 用我的方案可以压缩+过滤,用他的,则应该没有这功能,大家可以参考这里: http://ayanamist.tumblr.com/post/16227815835/apn-proxy
有人只有一台海外主机,那你幸福了,所有都不需要做,直接安装ziproxy,然后默认设置情况下改一下Port为特殊端口就可以直接代理了,区别只在于没有了广告过滤和路由区分,不过如果是在电脑上或者使用ios,则可以用 autoproxy2pac来达到自动路由。
祝各位龙年大吉,早生贵子,家人健康,生活美满~~~ 顺道征女友一只,让我也能实现前面的这句话
APN Proxy的实现
有一个这样的服务,号称可以翻墙加速,主要作者@Paveo 也不愿公开它的工作原理。现在我也实现了类似的。其实原理很简单,只不过门槛很高,至少需要一台国内的VPS。
- 要让国内的这台VPS处于翻墙状态,可以用OpenVPN来实现,也可以利用SSH做个代理。用SSH的话记得要转换成HTTP代理,Privoxy、Polipo、3proxy等都是可以的。
- 需要一个共享软件,Proxy+,如果只是自己用,估计免费版够了,否则请购买商业版……
- 如果是用SSH的,需要设置Cascading为Non-ICP,并设为之前的HTTP代理;用OpenVPN方案的可以无视。
- 需 要设置Proxy+的过滤规则,Access List里Objects中,添加HTTPHeader类型的规则,我只想让塞班用户使用,于是加入名为Symbian内容为*Series60*,这样 HTTP Header中有匹配到的就会放行。在Rule内加入Deny !Symbian,这样不符合规则的就会被拒绝访问。
- 最重要的: 要能让自己继续访问管理页面。上面的规则会让自己也无法访问管理页面。添加一个Object,名为 UP,类型为Parameter,内容为username:password(管理员用户和密码),再添加一个Object,名为IP,类型为 ClientIP,内容为127.0.0.1。接着在Rule里第一条添加为Pass UP IP,放行服务器本地的访问。
如果是要给其它手机用户使用,需要找出他们的HTTP Header的特征码,我是用服务器上装Fiddler来捕捉分析的。
如果是可信赖的人用,OpenVPN可以配合chnroutes来避免国内网站访问过慢。
最后吐槽一下UCWeb的内置域名代理支持,居然用的UA是Mozilla/5.0 (windows; U; Windows NT 5.1; zh-CN; rv:1.7.12) Gecko/20050919 Firefox/1.0.7
来源: http://ayanamist.tumblr.com/post/16227815835/apn-proxy
--
Posted By GFW BLOG 功夫网与翻墙 to GFW BLOG(功夫网与翻墙) at 2/08/2012 08:52:00 AM --
1、翻墙利器赛风3下载地址: http://dld.bz/caonima326 ,http://dld.bz/caonima745/
2、我们的订阅地址:http://feeds2.feedburner.com/chinagfwblog
3、停止订阅,请发邮件到
gfw-blog+unsubscribe@googlegroups.com
翻越防火长城,你可以到达世界上的每一个角落。(Across the Great Firewall, you can reach every corner in the world.)
没有评论:
发表评论