本文转载自莓玩没了 简易 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,因此会有少量差异,我想这不会难倒你,对么?
原理图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
……………………………………………………
本文标题:简易 APN Proxy (APN代理)的搭建 – 美博园
本文链接:http://allinfa.com/apn-proxy-setup.html