跳至主要内容

搭建增强型代理服务器(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来达到自动路由。

祝各位龙年大吉,早生贵子,家人健康,生活美满~~~ 顺道征女友一只,让我也能实现前面的这句话




评论

此博客中的热门博文

使用StrongSwan搭建 IKEv1 IKEv2 VPN服务器

#2016-01-04 决定将本文作废,因我要另再写新版本的配置。这篇作于 2013年,而strongswan已经更新很多版本。 #本文需要有独立的VPS,如果你需要一台速度快,每月30元的左右的VPS,可以使用我的邀请注册 http://www.vultr.com/?ref=6813064 并且在注册时使用 SSDVPS 可以送 $20(或者 $10 不等)。一定要选日本线路,这个到国内延迟约40ms ~ 100ms ,一般是 80ms 左右,非常快非常稳定,一个月32元,可以和几个人合租了。 #LOG:2014-04-30 对ipsec.conf进行修改,增加了android手机的兼容,现在可以支持完整支持android 自带的VPN设置啦~~~~ #LOG:2013-0609 对ipsec.conf进行修改,加入清楚DPD代码,防止IP 地址池不正确占用 #LOG: 2013-0519 删除ipsec.conf 中多余的conn iOS一节,这本是我一年前调试用的,时间不起作用; 删除了 %default中的 rightsubnet ,如果不删除,在定义了多段IP路由的情况下会导致账号无法上网(只有一段IP没这个bug),感谢  JackWindows  ‏ @ JackWindows #LOG 2013-05-12 修正bug,原配置文件会导致一个ID不可以同时多次登陆。得蒙  @ KhaosT   指点,对  strongswan.conf 加入duplicheck.enable = no ,对 ipsec.conf 加如 uniqueids=never #完成度100% 在我们生活的周围,通常要用到很多种VPN: PPTP, L2TP/IPSec, Cisco IPSec, IKEv2, 这些不同类型的VPN覆盖了目前我们常见的所有手机或者电脑平台,比如 iOS, Blackberry OS, BB10, Android, WebOS, Windows XP, Windows Vista/7/8, Unix/Unix-like。 (*如果你正在找blackberry 翻墙方法、ios ipsec vpn、windows IKEv2 VPN、Blackberry BB10 / Z10 VPN、android VPN,建

关于黑莓翻墙,不得不说的事

这篇文章是给那些开通 BIS FULL 的黑莓用户看的。若你没有开通服务,则可以略过。 黑莓的企业特性使得我们无法使用常规的VPN、SSH、代理来翻墙。事实上,如果你有一台cisco PIX 535 ,也是可以建立一个企业级的VPN达到让黑莓番墙的效果,但是成本相当昂贵。   最 如果你想使用黑莓VPN翻墙,请观看我这里的教程  http://bao3.blogspot.com/2012/08/blackberry-vpn-ios.html  是教授你如何搭建黑莓的VPN服务器。目前稳定运行。 近联通和电信(注意:不包括移动)的BIS服务器都已经升级到了BIS FULL ,BIS的升级意味着你可以让你黑莓上几乎所有的程序都使用 APN:blackberry.net ,也就是说可以让它们都达到PUSH而不是常规的PULL。 在这里我们忽略掉BIS及基APN带来的极大好处,只说一点:免费的BES。这是BIS FULL给我们带来的最巨大的益。RIM为了挽回市场,曾尝试过blackberry Unit! ,但是后来自杀了,于是又推出了 BES Express ,这是一个Mini BES & Free BES 。当你的黑莓通过BES服务器后,就可以利用那台服务器进行网络翻墙。 我目前还没有海外的windows 主机,但我建议黑莓用户相互间合租一台,然后安装上BES Express,并且开通BIS 功能,这样你就可以24小时不间断在墙外。不必担心BES Express的巨大工作量,其实运转起来很简单。 更新:开通了电信和联通黑莓BIS,或者BES的人可以去 www.besdiy.com 申请一年的BESx 托管,然后就可以翻墙了。注意要删除一条SB,就是 wifi有关的那条 只是,这种方式的成本也比较高, BIS 60RMB+ 40RMB 服务器合租=100RMB/Mon。但是带来的好处一如 APN 代理一样,不耗电,不耗额外流量,天然翻墙。 我已经离开黑莓阵营好久,不过在短暂使用iphone4s 后,决定还是用回黑莓,只是要等os 10。现在在用 mac book air ,虽然也只是使用两个月,但不得不说apple 的东西设计真好,只是在办公上,iphone还有很长的路要走,但是,在给人使用这个前提下,RIM可以不必走了,永远也追不上

简易 APN Proxy (APN代理)的搭建

2012年2月1日 ,新增加了一种方案,请看 《 搭建增强型代理服务器(APN Proxy) 》 2012-01-03 更新 3proxy 及 监控进程脚本,分别见 B 3) 和 曾经在twitter被封锁的时候,我在长城宽带干过一件事,那就是将twitter的请求和通讯使用SSH,让全网用户可以无阻访问,不过也因此付出了代价,略不去说了。 后来得厨神 @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,因此会有少量差