apn-proxy 穿墙服务器端架设指南

使用apn-proxy可以很好的实现穿墙。我为什么要说“穿”呢?不是“翻”吗。从技术上来说,应该是“穿”,在墙内和墙外打一个加密通道,实现穿墙。apn-proxy 最大的好处是iphone上设置简单,手机使用非常方便,而且可以通过配置实现墙内的站点直接访问,墙外的站点穿墙访问。
下面给个图,看看apn-proxy是如何实现穿墙的。
apn-proxy实现穿墙
从图中我们看到,要实现一个比较“聪明的”穿墙代理,需要有两台代理服务器,一台在墙内(国内),一台在墙外(国外或香港)。用户先连接墙内的代理服务器,如果check到访问的站点域名不在墙外站点列表里,就通知用户端直接访问墙内站点,不走proxy;如果check到访问站点域名在墙外站点列表里,就通过SSL连接到墙外代理服务器,访问墙外站点。这样做的好处是,在客户端设置代理后,访问墙内站点的速度是基本上不受设置代理的影响的。也就是说,这个代理可以一直设置在你的客户端上,不用经常更改。

服务器环境:
两台vps,一台国内,一台在香港,操作系统是CentOS6.4_64。墙外机器配置不高,1CPU,512内存,15G磁盘,150G流量每月,10M峰值带宽,基本已经够用了。

下面讲一下如何安装和配置apn-proxy代理:
1、安装方法:
1)安装jdk java 运行环境,建议使用jdk7:
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html下载jdk7.
安装和配置jdk

###解压jdk7,解压目录/opt/jdk1.7.0_65
tar -zxvf jdk-7u65-linux-x64.tar.gz 
###增加环境变量到/etc/profile文件最后
export JAVA_HOME=/opt/jdk1.7.0_65
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export JAVA_OPTS="-Xms32M -Xmx64M -XX:PermSize=16M -XX:MaxPermSize=32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/dump.dat -DlogPath=/data/logs/"
###设置对应的日志和dump目录 
mkdir /data/dump/
mkdir /data/logs/

2)安装apn-proxy

###下载apn-proxy
wget https://github.com/apn-proxy/apn-proxy/releases/download/2.0.5/apn-proxy-2.0.5.zip
###解压下载包到/opt
tar -zxvf apn-proxy-2.0.5.zip

3)配置墙内apn-proxy服务器
a)config.xml主配置文件的配置


[root@web01 conf]# cat config.xml
<?xml version=”1.0” encoding=”UTF-8” ?>

<!-- By default, config apn-proxy listen in plain mode act as a normal http proxy server -->
<listen-type>plain</listen-type> <!--墙内就直接使用明文方式,这样客户端配置起来比较通用-->
<port>8700</port>  <!--端口-->
<thread-count>
    <boss>1</boss>
    <worker>50</worker>
</thread-count>

<trust-store>
    <path>conf/truststore.ks</path> <!--证书文件,用keytool命令生成-->
    <password>qwexxxxx</password> <!--证书文件密码-->
</trust-store>
<pac-host>180.xx.x.11</pac-host> <!-- 设置本机监听ip地址 -->
<use-ipv6>false</use-ipv6>


[root@web01 conf]#

b) remote-rules.xml转发规则文件的配置,用于设置把墙内的请求用SSL 转发到墙外的apn-proxy服务器


<?xml version=”1.0” encoding=”UTF-8” ?>



ssl
example.com
8700

google.com
facebook.com
twitter.com
mingpaovan.com
wikinews.org
joachims.org
maiio.net
idv.tw
mail-archive.com




4)配置墙外apn-proxy服务器
a)config.xml主配置文件的配置


<?xml version=”1.0” encoding=”UTF-8” ?>





ssl


conf/keystore.ks
qwexxxxx

8700

1
50

xxxx.com
false


b) remote-rules.xml转发规则文件的配置,因为已经是墙外服务器,不用再转发,这个文件可以为空。


<?xml version=”1.0” encoding=”UTF-8” ?>




c)用keytool命令生成keystore.ks(私钥)和truststore.ks(证书),用于给ssl进行加解密操作。

###生成一个RSA的私钥,有效期36500天,秘钥的长度为4096,文件名keystore.ks,给墙外服务器用,放conf目录下面
keytool -genkey -alias xxxx.com -keyalg RSA -keysize 4096 -validity 36500 -keystore keystore.ks

###生成RSA证书请求
keytool -export -alias xxxx.com -keystore keystore.ks -rfc -file cert.pem

###生成证书文件,文件名truststore.ks,给墙内服务器用,放conf目录下面
keytool -import -file cert.pem -keystore truststore.ks -alias xxxx.com

5)在两台代理服务器上,分别启动apn-proxy代理,具体方法如下:


[root@eagles apn-hg]# cd /opt/apn-hg/
[root@eagles apn-hg]# bash start.sh
17157
[root@eagles ~]# netstat -antp | grep 8700
tcp 0 0 :::8700 :::* LISTEN 18949/java
[root@eagles ~]#

6)用户端设置apn-proxy代理的方法
a)在电脑IE 浏览器上设置apn-proxy代理的方法,如下图:
client
b)在iphone手机wifi上设置apn-proxy代理的方法,如下图:
TM截图未命名
访问twitter.com,OK哈,如下图:
IMG_2626[1]
c)android手机上wifi上设置apn-proxy代理的方法:“WLAN”–“热点名”–“显示高级选项”–“代理设置(选手动)”–”代理主机名(180.xx.x.11)”–”代理服务器端口(8700)”,就不给图了哈。
祝大家好运,有问题可以联系我。

官方文档:apn-proxy

坚持原创技术分享,您的支持将鼓励我继续创作!