Total Pageviews

Wednesday 8 February 2012

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

得厨神@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 。
 来源:  http://bao3.blogspot.com/2012/01/apn-proxy-apn.html
 -------------------------------------------------------------------------

搭建增强型代理服务器(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来达到自动路由。
祝各位龙年大吉,早生贵子,家人健康,生活美满~~~ 顺道征女友一只,让我也能实现前面的这句话
来源:  http://bao3.blogspot.com/2012/02/apn-proxy.html
 -----------------------------------------------------------------

前面曾经 写过两篇与 APN 代理有关的文章,自己的APN 也分享给朋友们使用了有1个月,从自己搭建到公测至今,已经有4个月了。可以说APN代理确实要方便太多,但是这当中也发现一些小问题:土豆,优酷无法在 iOS 上观看。如果你是使用 squid 2.7 ,可以加入以下设定解决,起主要作用的是高亮部分:

#Enable Anonymizer (Anonymous Proxy)
acl all         src 0.0.0.0/0
#header_replace User-Agent anonymous
forwarded_for off

header_access    Accept allow all
header_access Accept-Charset  allow all
header_access Accept-Encoding allow all
header_access Accept-Language allow all
header_access Accept-Ranges allow all
header_access Age allow all
header_access Allow allow all
header_access Authorization allow all
header_access Cache-Control allow all
header_access Connection allow all
header_access Content-Base allow all
header_access Content-Disposition allow all
header_access Content-Encoding allow all
header_access Content-Language allow all
header_access Content-Length allow all
header_access Content-Location allow all
header_access Content-MD5 allow all
header_access Content-Range allow all
header_access Content-Type allow all
header_access Cookie allow all
header_access Date allow all
header_access ETag allow all
header_access Expires allow all
header_access From allow all
header_access Host allow all
header_access If-Match allow all
header_access If-Modified-Since allow all
header_access If-None-Match allow all
header_access If-Range allow all
header_access Last-Modified allow all
header_access Link allow all
header_access Location allow all
header_access Max-Forwards allow all
header_access Mime-Version allow all
header_access Pragma allow all
header_access Proxy-Authenticate allow all
header_access Proxy-Authentication-Info allow all
header_access Proxy-Authorization allow all
header_access Proxy-Connection allow all
header_access Public allow all
#header_access Range allow all
header_access Referer allow all
header_access Request-Range allow all

header_access Retry-After allow all
header_access Server allow all
header_access Set-Cookie allow all
header_access Title allow all
header_access Transfer-Encoding allow all
header_access Upgrade allow all
header_access User-Agent allow all
header_access Vary allow all
header_access Via deny all
header_access Warning allow all
header_access WWW-Authenticate allow all
header_access Authentication-Info allow all
header_access X-Cache allow all
header_access X-Cache-Lookup allow all
header_access X-Forwarded-For allow all
header_access X-Request-URI allow all
header_access X-Squid-Error allow all
header_access All deny all
还有个问题,就是 pps , pptv 收看时在 iOS上也有问题,这个的修改参数还没有试验出来,我将仍然在这个帖子中更新方法 from http://bao3.blogspot.co.uk/2012/03/apn-squid.html
-------------------------------------------------------------------------
APN Proxy的实现
有一个这样的服务,号称可以翻墙加速,主要作者@Paveo 也不愿公开它的工作原理。现在我也实现了类似的。
其实原理很简单,只不过门槛很高,至少需要一台国内的VPS。
  1. 要让国内的这台VPS处于翻墙状态,可以用OpenVPN来实现,也可以利用SSH做个代理。用SSH的话记得要转换成HTTP代理,Privoxy、Polipo、3proxy等都是可以的。
  2. 需要一个共享软件,Proxy+,如果只是自己用,估计免费版够了,否则请购买商业版……
  3. 如果是用SSH的,需要设置Cascading为Non-ICP,并设为之前的HTTP代理;用OpenVPN方案的可以无视。
  4. 需要设置Proxy+的过滤规则,Access List里Objects中,添加HTTPHeader类型的规则,我只想让塞班用户使用,于是加入名为Symbian内容为*Series60*,这样 HTTP Header中有匹配到的就会放行。在Rule内加入Deny !Symbian,这样不符合规则的就会被拒绝访问。
  5. 最重要的:要能让自己继续访问管理页面。上面的规则会让自己也无法访问管理页面。添加一个Object,名为 UP,类型为Parameter,内容为username:password(管理员用户和密码),再添加一个Object,名为IP,类型为 ClientIP,内容为127.0.0.1。接着在Rule里第一条添加为Pass UP IP,放行服务器本地的访问。
至此,APN Proxy就只有HTTP Header符合规则的用户才能访问了。
如果是要给其它手机用户使用,需要找出他们的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
---------------------------------------------------------------------

原文:http://www.rfa.org/cantonese/firewall_features/firewall_apn-02102012111259.html?encoding=simplified
DC: 又到了翻墙问答的时间。近日,不少中国网民都在讨论以APN代理来翻墙,究竟这是什么东东来的?
李: 要明白什么叫APN代理,那么,就先要明白,不论2G GPRS还是3G网,只要涉及到互联网的设定,
都要你在手机中设定APN。而APN是一个网络名,这个网络名下,可以透过APN内定义的主机以至特定代理 上网。一般人,都会用上由流动电话公司提供的APN上网。 但随著海外出现一些虚拟营运商,可能无线电频谱上租用别的流动电话公司,但向客户提供流动数据上网时,就透过自已公司的主机或数据中心进行。亦有公 司利用APN,迫使员工的手机在公司的内联网运作,保证资料的安全,APN代理技术便这样发展起来,之后有些公司,就特别用了特殊的APN代理,做到个别 程序的资料流量收费等效果,因此本来并不是设计用来翻墙,而能够翻墙,可以讲是意外收获。
DC: 那为何要用APN代理?到底有什么好处?
李: 有部分手机,由于作业系统设计上的局限,差不多现行主流的翻墙方法,像VPN等等都无法使用,像部分Windows Mobile的手机,以及现时诺基亚、索尼爱立信等的较旧款非智能手机等。这些手机难以透过软件去提升翻墙性能,作业系统所支援的设定和翻墙手段亦不多, 这样的情况下,那就唯有透过一个特别的APN代理去翻墙。基本上,APN代理翻墙,支援所有现存可以透过GPRS技术上网的手机。
DC: 那APN代理来翻墙,又有什么缺点?
李: APN翻墙的最大问题,在于APN并非第一时间跳进海外网络,你需要经过中国一个虚拟主机,再透过有关虚拟主机连去海外网站,这连结可以无加密、经VPN 加密,或SSH加密。但可以肯定你与APN代理之间,于中国国内一段的联系并无加密。所以一些有敏感字的内容,仍然有可能因触动中国当局防火长城的关键字 过滤系统,因此被断线。因此,这种翻墙方法,只适合用无法用VPN、翻墙软件的手机,有限度翻墙出海外。
另一方面,由于APN代理有一部分在中国国内的数据中心,所以最怕有人搜查数据中心,随时你的互联网浏览和通讯纪录都留在数据中心,一旦有公安上去搜查就麻烦。因此,很敏感的通讯,又需要加密的话,APN代理并不适合你的需要。
所以,如果你的手机仍然可以用VPN之类的翻墙方案的话,我个人不建议透过APN代理翻墙。但如果你有未有实名制登记的预付卡,又想用手机用墙外推 特的资料,外在推特发推,只要你懂得回避关键字过滤的话,这不失为使用旧机又能够看到墙外世界的好方法。推特其中一个好处,就是你用旧款手机也好,仍然能 够应付裕如。
DC: 这样,一般人能否自行架设APN代理服务?有没有一些免费的APN代理服务?
李: 虽然可以租虚拟主机,自行架设APN代理服务,但由于技术内容复杂,需要UNIX方面的知识,加上要同时在中国和海外各租一部主机,所以现时有人在卖 APN代理服务。而免费APN代理是比较难做到,因为现时设置APN代理来翻墙成本不低,相信除了因为兴趣和研究需要外,比较少人会这样做。
DC: 假如我真的要在手机用到APN代理翻墙,会否与我现时手机的设定有冲突?
李: 这又不会,因为由2G GPRS手机开设,都支援设立多重APN,以应付不同用途的需要,像彩信用的APN,就与一般数据通讯用的APN不同。反而有部分旧款点的手机,就APN 的设定数量有储存限制,可能只能让你设五个至十个的APN代理设定,由于一般而言,连彩信的设定一起计,你的手机至少有两至三个APN设定被营运商用了, 因此,买得太多不同公司的APN代理,不见得有什么好处。
----------------------------------------------------------------------------------------

APN代理的安全问题


APN代理的安全性很脆弱,它绝对不是纯粹的安全方案,也不是严肃的防止审查的工具。APN代理,只是吃喝玩乐的一个小工具罢了,千万不要用APN代理妄图做匿名的事情,很危险。

如图所示,APN代理下,分两种情况,SSL加密访问和普通HTTP访问。SSL加密下走代理的安全性较高,但绝不是万无一失的,原因图示已具明。
非SSL加密即普通HTTP的话,那意味着你所有访问的资源都是透明的,你的ISP,室友,代理提供商都可以非常轻易的取得你的未加密信息。这种的 风险的话,可以自己评估。有责任的网站在敏感地方都应该使用SSL加密,比如传递密码、传递信用卡资料等等的时候,但是国内的网站一般都不注重这方面的安 全(包括大网站和大服务商),所以你遇到非加密的资料需要传输时,请务必评估周围的风险,此时APN代理对于你起不到任何安全作用。
在公共场合或者比较敏感的信息传递,如果有条件,请使用VPN(最差也要使用HTTPS),它会为你的建立一条点到点的加密的隧道。咖啡馆里的人、 室友、ISP都无法轻易的截取你的信息。但VPN也绝对不是比起APN来100%安全,VPN提供商可以也可能截取和发起中间人攻击,但是难度要比APN 代理高很多。
有条件的话当然全部都使用自己搭建的会比较安全,或者交给可靠的人打理能很大程度上保证安全和隐私。
结论:
1,不要用APN代理试图做匿名的事情,无论SSL加密还是不加密;
2,想匿名,传递敏感信息务必使用国外VPN提供商;
3,只是想保证信息安全,使用普通VPN,自己的或者朋友的;
4,不要随便装CA证书,注意系统发出的证书提醒;
虽然安全远非这些,但这些基础的希望更多的人可以知道。

from https://w3.owind.com/pub/binary/2012/07/09/apn%E4%BB%A3%E7%90%86%E5%AE%89%E5%85%A8/
-----------------------------------------------------------------------------------------------

APN安全策略


APN没有VPN安全?
goclang:
是的,也不是(我认为一般都是)。纯粹从技术上说,APN访问HTTP协议的内容总要有一段明文传输,所以比VPN、SSL这些隧道技术要差一些。至于HTTPS的内容则是安全的,因为协议本身是面向端到端加密的,中间人篡改、截取等问题都不存在。
说到这个,就要说说APN部署和VPN部署的差别。VPN一般在国外放置服务器,客户端到服务器直连,也就是逻辑上客户到国外的这个过程是客户端自己完成的。
APN则需要国内国外分别放置服务器(也可以只用国外服务,使用特殊端口,这个我以前讲过)。HTTP协议内容通过国内服务器中转,HTTPS内容可以由客户端到国内或国外服务器透过HTTP/1.1协议的CONNECT方式做加密隧道。
那么绕来绕去APN不仅比VPN多了国内部分的服务器成本,而且还有明文传输的部分,为什么还是选择这种方式呢(我感觉有两点:一、无奈,系统不支持VPN,比如微软WP系统及非智能机,二、速度快,不用VPN那样拨号认证,基本感觉不到断线重连)?
从本质上说,我觉得是个唯一的选择。你说这叫无奈也可以。没人愿意把服务器部署在国内的机房。一提起这个我本能的反应就是个F***。国内一堆人掌 握着带宽资源,问题是互相之间限制流量,有时候国内直接的速度比出国再回来还慢。另外,DNS污染也是个大问题,即使自己搭DNS缓存8.8.8.8也有 问题。
5. 具体是哪些问题呢?
goclang:
UDP丢包率高,TCP间歇性复位,另外全球负载均衡也制造了不少麻烦。比如youtube、feedburner在国内查询8.8.8.8和在国外查询 8.8.8.8的结果是不同的。也就是8.8.8.8也在做负载均衡。如果把DNS缓存放在国外,那么youku这类限制IP地理位置的网站就
访问不了了。
这问题的解决最后就是人肉版的DNS负载均衡。弄个列表,分别查询不同的DNS缓存。人肉版软件总是让人很讨厌(这点的确很讨厌)。
6. 再具体说说安全问题吧
goclang:
涉及安全就必须确定对安全的预期。从技术上看,VPN、APN都存在中间人监听的问题。
7. VPN不是全程加密吗?
goclang:
暂时把加密可靠性放在一边,APN在国内明文传输这段,会有第三方嗅探的风险,VPN没有。但是在VPN服务器上,也就是VPN服务商还是可以看到的,也就是中间人风险。这点VPN、APN是相同的(所以一定要选择你信任的或国外知名的服务商)。
不过说起加密,我倒是要说两句。迷信VPN是没有道理的。VPN和SSL相同都是PKCS这类加密。这类加密的特点都是基于大素数理论,问题就在数 论上。PKCS里面有一些魔数,也就是没有原因算法里面就使用的一些数字。这些数字的来由很成问题。在某个,或者某几个黑屋子里面藏着这些数字的秘密。掌 握这些秘密就可以很大程度上减低暴力破解的计算量。所以,SSL、VPN对某些机构来说并不是破解不了。稍微费点劲,但是肯定可以快速破解。
再有,PKCS的证书体系也是问题。这就是很多人把电脑浏览器里面CNNIC的根证书删除的原因。掌握了根证书,就可以伪装成任何人。而iOS上面又没有办法查看某个网站签名的根证书。于是,iOS上面经过拆包又重新封装并使用CNNIC根证书签名的内容根本无法发现。
8. 那全都不安全吗?
goclang:
再回到对安全预期的问题上来。绝对安全是不存在的。只要使用公共网络,也就是互联网,就没有安全。从IP找到门牌号码也就几十分钟到两个小时的时间。
但是另一方面看,真的需要那么秘密吗?如果就为了上twitter,那么你的发言本身就是公开的。要是以为那东西看不见那就是迷糊了。信息都是公开的,APN的第三方嗅探漏洞也就不存在。都公开了,还怕嗅探?
至于twitter、facebook密码,gmail内容,这些都是HTTPS上面跑的,VPN和APN都一样(有个问题一定要考虑,在公共wifi网络下,登录http网站使用VPN时可以防止黑客,使用APN不行)。那么非HTTPS内容又想尽量安全怎么办?简单说,没办法。HTTP这种明文协议传输的内容本质上谁也不知道过了几道手才传输回来,有没有透明代理(至少VPN和保证从客户到VPN服务器的过程是加密的,APN代理不能)。
9. 是的,公开信息没有加密问题,但是我不想让人知道我看了,怎么办?
goclang:
你不能。刚才提到了,只要上网,找到人是分分钟的事(有时候一天能找到你比一年找到你危险差别是很大的)。另外,希望服务器在国外,可以拒绝移交数据,我看有点一厢情愿(至少当局获得国内数据要比国外简单的多得多)。找得到人(这还有个问题,使用VPN时可以实现隐藏真实IP的匿名冲浪,比如你在国内网站发不和谐的言论,网内网站获得是你VPN的IP,而APN代理在这方面就弱的多,其实其他设置的代理也一样,我以前说过),还有什么找不出来的?
10. FoxAE存储用户数据吗?
goclang:
不存。很简单,怕麻烦。网站的注册不要求验证邮箱,一方面是我们根本就对收集信息这类事情没有兴趣,另一方面也是不想自找麻烦。另外,FoxAE的 部署方式决定了我们没有使用Squid这类缓存服务器。缓存的管理也是件烦人的事(也有APN代理服务商靠缓存提速哦)。CPU、内存、硬盘消耗不说,其实效果很有限。
11. 那也就是FoxAE自称没有存储啦?
goclang:
是,也不是(总是似是而非呀)。刚才说了,HTTPS内容我们是看不到的,这一块想存也存不了。HTTP这块其实简单,自己架设个透明代理,看看HTTP的Header里面Date,Etag,应该也可以推测一下。当然,明文内容,信心其实就是个信任问题(嗯,一定要找个你信任的,或者知名的老牌的)。
对于一些对安全有特殊要求的人,我建议还是自己搭服务器算了。同时,自己搭服务器并不代表就安全。第一,手机本身是否安全,输入法什么的都是非常大 的安全隐患(苹果的输入法有很大安全隐患?)。第二,如果手机和电脑连接过,电脑是否安全。第三,Linode上面弄个OpenVPN,并不代表安全,参见CNNIC部分内容。
SSL其实不是好的保密传输选择。隐藏树叶最好的地方就是森林。所以,如果不是重新开发加密算法的话,使用SSL套SSL并且伪装数据包为媒体文件,然后使用HTTP明文传输伪装后的数据,这样应该比VPN什么的安全的多(你干嘛老是苦思冥想地说VPN呢,就因为你说不喜欢)。
当然,这并不方便,也不容易。

from http://blog.foxae.com/?p=32