Pages

Monday, 23 February 2015

iOS下安装stunnel以翻墙


一、为什么用Stunnel

    Socks/http的缺陷在于非加密性,容易被关键词过滤,可能会被监听;
    SSH解决了Socks/http不能加密的问题,但SSH容易出现“断流”的现象,主要是访问连接数多了后,部分连接出现长时间传输数据为0,造成大量连接无法访问。而且SSH需要保持不间断连接(移动设备上这点更为明显,会造成设备耗电过快或者休眠后需要重新连接);
    VPN没有上述问题,但VPN的缺陷在于其全局性,会造成访问国内网站速度过慢,修改路由表使国内IP走默认网关也很麻烦。

stunnel介绍:
    Stunnel (https://www.stunnel.org/) 是一款可以加密网络数据的TCP连接,并可工作在Unix和Windows平台上,它采用Client/Server模式,将Client端的网络数据采 用SSL(Secure Sockets Layer)加密后,安全的传输到指定的Server端再进行解密还原,然后再发送到访问的服务器。在加密传输过程中,可充分确保数据的安全性,我们只要 把Server端程序安装在局域网外面的一台服务器上,即可保证传输的数据在局域网内是安全的.
    摘自51CTO技术博客(http://32631.blog.51cto.com/22631/328307)

二、安装方法:
1、服务器的http代理、Stunnel安装及生成证书
这方面已经有相当多文章,具体可参考这篇文章:http://www.cnblogs.com/eleganthqy/archive/2010/01/24/1655329.html,在此不再介绍服务器的Stunnel安装,着重介绍iOS上的安装及配置。

2、在iOS上安装Stunnel并配置:
在Cydia添加这个源:http://apt.saurik.com
搜索并安装Stunnel,OpenSSH
SSH登陆iOS
cd /usr/etc/stunnel
复制stunnel.conf-sample为stunnel.conf
修改stunnel.conf
注释掉这行;chroot = /usr/var/lib/stunnel/
pid改为pid = /tmp/stunnel.pid ,不知为何设为/var/run/stunnel.pid运行时会提示没有权限
注释掉原有的[pop3s]、[imaps]、[ssmtp]和[https]所有的参数
加上以下几行(IP改为你stunnel的服务器IP或域名,或者直接使用本站提供的stunnel服务器):
    client = yes
    sslVersion = TLSv1

    [stunnel.info]
    accept = 1080
    connect = s01.stunnel.info:60080

这段配置的意思是在本机开一个http代理:1080,连接到服务器s01.stunnel.info的60080端口。Stunnel会把这个端口所有接收到的数据使用证书加密然后转发到服务器上。
保存

3、设置Stunnel为自启动
cd /Library/LaunchDaemons
创建com.apple.stunnel.plist,内容为(如果在电脑上创建再上传,注意其换行方式是LF Only(UNIX),编码是不带BOM的UTF-8):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">

    <dict>
    <key>Label</key>
    <string>com.apple.stunnel</string>

    <key>OnDemand</key>
    <false/>

    <key>ProgramArguments</key>
    <array>
    <string>/usr/bin/stunnel</string>
    </array>

    <key>StandardErrorPath</key>
    <string>/dev/null</string>
    </dict>

    </plist>

运行launchctl load -w /Library/LaunchDaemons/com.apple.stunnel.plist
运行后stunnel就会启动,并且即使重启iOS,stunnel也会自动启动。

4、配置iOS的网络连接
配置iOS的网络连接,使用pac自动代理即可,这和使用SSH的方式是一样的。
pac文件可参考http://sites.google.com/site/yangyiliang/proxy.pac
下载后需要修改一个地方
改为
return "PROXY 127.0.0.1:1080";
修改后把文件上传至iOS的/var/mobile/http.pac
然后修改Wi-Fi网络的代理为
file://localhost/var/mobile/http.pac

3G网络使用pac的方法:修改preferences.plist这个文件,加入:
<key>Proxies</key>
<dict>
<key>ProxyAutoConfigEnable</key>
<integer>1</integer>
<key>ProxyAutoConfigURLString</key>
<string>file://localhost/var/mobile/proxy.pac</string>
</dict>

全部配置完毕。
开机连上网络后,不需任何设置即可翻墙,pac里的网站会通过Stunnel(即墙外代理,不过中间经过stunnel加密)访问,未被封禁的网站会直接访问。

附:
1、如果是在家里,可以在家里的电脑或者路由器上安装Stunnel,然后修改pac文件的代理为电脑或者路由器的IP。这样可以节省iPad的电池(SSL加密要耗点资源),而且不越狱也可使用。
2、Android不支持pac代理,可以root后使用ProxyDroid。