搭建增强型代理服务器(APN Proxy)

原文:http://allinfa.com/setup-apn-proxy.html

本文转载自莓玩没了搭建增强型代理服务器(APN Proxy),是上一篇简易 APN Proxy (APN代理)的搭建的进阶篇。美博园没有测试,用过的朋友请反馈。

我在上一篇博文中已经写了如何搭建简单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来达到自动路由。


发表评论