越狱iPhone下通过VPS+Python+PAC翻墙
提要: 在这之前一直用SSH Tunnel 配合PAC翻墙,这也是一种大家最常用的方法,没什么大的问题,但是SSH原本不是用来做代理翻墙的工具,所以效率上并不是太好,而且作为iPhone来 讲,后台运行一个SSH Tunnel会一直保持与SSH Server的连接,会严重影响iPhone的续航,而且由于手机经常会在edge/3G/wifi下切换,每次切换,SSH就会需要重新连接服务器,连 接是需要花时间的,连不上还会一直连,所以很耗电。最近研究出来一个非常好的方法,耗电量和延迟会大大降低,实现了无缝翻墙。
实现条件:
a, 一个国外的VPS服务器
b, 一个越狱了的iPhone
c, 用Python建立SOCKS Proxy的代码,VPS和iPhone上都要安装
d, PAC文件以及随时随地添加被GFW的网站到PAC文件的一个脚本。
具体过程:
a 建立代理
a1 VPS服务器端安装Python程序,这个无需多说。
a2, iPhone上安装Python程序,最新版在这里,安装方法很简单:
打开iPhone的 mobileterminal,运行下列命令:
wget https://yangapp.googlecode.com/files/python_2.7.3-3_iphoneos-arm.deb
dpkg -i python_2.7.3-3_iphoneos-arm.deb
安装完成
a3 下载Python代码,作者项目主页,点这里下载
a4 部署python代码,代码分为服务器端server.py和iPhone端local.py,服务器端的放在服务器,iPhone端的放在iPhone里面。
a4.1 在服务器端,修改server.py的代码,如下红色部分改成自己的其余地方不需要变动。
PORT = 9999
KEY = “123456789”
说明:PORT 随便什么端口都行,但要跟下面iPhone端的local.py相同。KEY 随便什么密码都行,但要跟下面iPhone端的local.py相同
然后在服务器终端运行:
nohup python server.py > /dev/null &
这条命令会让这个python代码在后台运行且不输出任何历史记录。
a4.2 在iPhone端,修改local.py的下面几个地方:
SERVERS = [
(‘yourvpsipaddress’, 9999),
]
PORT = 8080
KEY = “123456789”
说明:SERVERS部分,填入你的vps的ip地址和上面server.py设置的PORT。
下面的这个PORT是建立本地SOCKS代理的端口,比如我设置8080,那么建立的SOCKS代理就是 127.0.0.1:8080
KEY要跟server.py里面的一致
然后在iPhone下面运行:
nohup python local.py > /dev/null &
好了,这是iPhone后台就已经建立了一个SOCKS代理, 127.0.0.1:8080 这个代理可以供下面要介绍的PAC文件使用。
b 建立iPhone用的PAC文件
PAC= Proxy Auto Config,就是自动代理。
在iPhone终端下面运行以下命令:
su
touch /var/root/pac
chmod 777 /var/root/pac
chown mobile:mobile /var/root/pac
然后用nano编辑这个pac文件:
nano /var/root/pac
复制下面的代码到这个文件并保存:
function FindProxyForURL(url, host)
{
var PROXY = “SOCKS5 127.0.0.1:8080;SOCKS 127.0.0.1:8080”;
//added by hand
if (dnsDomainIs(host, “img.ly”)) return PROXY;
if (dnsDomainIs(host, “googlevideo.com”)) return PROXY;
if (dnsDomainIs(host, “github.com”)) return PROXY;
if (dnsDomainIs(host, “igfw.net”)) return PROXY;
if (dnsDomainIs(host, “t.co”)) return PROXY;
if (dnsDomainIs(host, “webkit.org”)) return PROXY;
if (dnsDomainIs(host, “limelinx.com”)) return PROXY;
if (dnsDomainIs(host, “slingfile.com”)) return PROXY;
if (dnsDomainIs(host, “sendspace.com”)) return PROXY;
if (dnsDomainIs(host, “j.mp”)) return PROXY;
if (dnsDomainIs(host, “myrepospace.com”)) return PROXY;
if (dnsDomainIs(host, “xsellize.com”)) return PROXY;
if (dnsDomainIs(host, “hackulo.us”)) return PROXY;
if (dnsDomainIs(host, “saurik.com”)) return PROXY;
if (dnsDomainIs(host, “thebigboss.org”)) return PROXY;
if (dnsDomainIs(host, “fb.me”)) return PROXY;
if (dnsDomainIs(host, “getfoxyproxy.org”)) return PROXY;
if (dnsDomainIs(host, “4share.com”)) return PROXY;
if (dnsDomainIs(host, “posterous.com”)) return PROXY;
if (dnsDomainIs(host, “foursquare.com”)) return PROXY;
if (dnsDomainIs(host, “twitpic.com”)) return PROXY;
if (dnsDomainIs(host, “vimeo.com”)) return PROXY;
if (dnsDomainIs(host, “mobile01.com”)) return PROXY;
if (dnsDomainIs(host, “tiananmenmother.org”)) return PROXY;
if (dnsDomainIs(host, “bannedbook.org”)) return PROXY;
if (dnsDomainIs(host, “dwnews.com”)) return PROXY;
if (dnsDomainIs(host, “ntdtv.com”)) return PROXY;
if (dnsDomainIs(host, “soundofhope.org”)) return PROXY;
if (dnsDomainIs(host, “boxun.com”)) return PROXY;
if (dnsDomainIs(host, “epochtimes.com”)) return PROXY;
if (dnsDomainIs(host, “fangbinxing.com”)) return PROXY;
if (dnsDomainIs(host, “ruanyifeng.com”)) return PROXY;
if (dnsDomainIs(host, “wuala.com”)) return PROXY;
if (dnsDomainIs(host, “dupola.com”)) return PROXY;
if (dnsDomainIs(host, “scribd.com”)) return PROXY;
if (dnsDomainIs(host, “gfw.org.uk”)) return PROXY;
if (dnsDomainIs(host, “chinadigitaltimes.net”)) return PROXY;
if (dnsDomainIs(host, “kenengba.com”)) return PROXY;
if (dnsDomainIs(host, “dbanotes.net”)) return PROXY;
if (dnsDomainIs(host, “chinagfw.org”)) return PROXY;
if (dnsDomainIs(host, “friendfeed.com”)) return PROXY;
if (dnsDomainIs(host, “ijailbreaknow.com”)) return PROXY;
if (dnsDomainIs(host, “ksu.edu.tw”)) return PROXY;
if (dnsDomainIs(host, “vbird.org”)) return PROXY;
if (dnsDomainIs(host, “pornhub.com”)) return PROXY;
if (dnsDomainIs(host, “youporn.com”)) return PROXY;
if (dnsDomainIs(host, “google.com.tw”)) return PROXY;
if (dnsDomainIs(host, “mediawiki.org”)) return PROXY;
if (dnsDomainIs(host, “wikitionary.com”)) return PROXY;
if (dnsDomainIs(host, “wikimediafoundation.org”)) return PROXY;
if (dnsDomainIs(host, “wikimedia.org”)) return PROXY;
if (dnsDomainIs(host, “yahoo.com”)) return PROXY;
if (dnsDomainIs(host, “yimg.com”)) return PROXY;
if (dnsDomainIs(host, “flickr.com”)) return PROXY;
if (dnsDomainIs(host, “dropbox.com”)) return PROXY;
if (dnsDomainIs(host, “akamaihd.net”)) return PROXY;
if (dnsDomainIs(host, “facebook.net”)) return PROXY;
if (dnsDomainIs(host, “fbcdn.net”)) return PROXY;
if (dnsDomainIs(host, “ggpht.com”)) return PROXY;
if (dnsDomainIs(host, “gstatic.com”)) return PROXY;
if (dnsDomainIs(host, “googleusercontent.com”)) return PROXY;
if (dnsDomainIs(host, “goo.gle”)) return PROXY;
if (dnsDomainIs(host, “feedburner.com”)) return PROXY;
if (dnsDomainIs(host, “googlelabs.com”)) return PROXY;
if (dnsDomainIs(host, “googlesyndication.com”)) return PROXY;
if (dnsDomainIs(host, “chrome.com”)) return PROXY;
if (dnsDomainIs(host, “android.com”)) return PROXY;
if (dnsDomainIs(host, “chromium.org”)) return PROXY;
if (dnsDomainIs(host, “keyhole.com”)) return PROXY;
if (dnsDomainIs(host, “googlesource.com”)) return PROXY;
if (dnsDomainIs(host, “googleapis.com”)) return PROXY;
if (dnsDomainIs(host, “twimg.com”)) return PROXY;
if (dnsDomainIs(host, “ytimg.com”)) return PROXY;
if (dnsDomainIs(host, “gmail.com”)) return PROXY;
if (dnsDomainIs(host, “blogger.com”)) return PROXY;
if (dnsDomainIs(host, “blogspot.com”)) return PROXY;
if (dnsDomainIs(host, “appspot.com”)) return PROXY;
if (dnsDomainIs(host, “bit.ly”)) return PROXY;
if (dnsDomainIs(host, “wikipedia.org”)) return PROXY;
if (dnsDomainIs(host, “twitter.com”)) return PROXY;
if (dnsDomainIs(host, “facebook.com”)) return PROXY;
if (dnsDomainIs(host, “google.com.hk”)) return PROXY;
if (dnsDomainIs(host, “youtube.com”)) return PROXY;
if (isPlainHostName(host) ||
shExpMatch(host, “*.local”) ||
isInNet(dnsResolve(host), “10.0.0.0”, “255.0.0.0”) ||
isInNet(dnsResolve(host), “172.16.0.0”, “255.240.0.0”) ||
isInNet(dnsResolve(host), “192.168.0.0”, “255.255.0.0”) ||
isInNet(dnsResolve(host), “127.0.0.0”, “255.255.255.0”)) return “DIRECT”;
return “DIRECT”;
}
OK,现在用于iPhone自动代理的pac文件建立好了,可以看到,上面添加了很多被GFW了的网站,这些都是我用一个脚本添加的,没有用 gfwlist,因为我觉得gfwlist的语法写的太烂了,一点都不干净,而且漏掉了很多被GFW的网站,又不方便自己添加,所以我自己做了一个。
以上的pac文件每行一个代码,可以根据自己的需求删减。但是一定不要删掉红色代码部分,因为这个下面的脚本要用到。
c 添加新的被墙网站到这个pac文件
为此我做了一个脚本,下面是生成这个脚本的命令, 在iPhone终端:
su
touch /usr/bin/agfw
nano /usr/bin/agfw
复制下面的代码,并保存
#!/bin/bash
domain=$1
ed -s /var/root/pac << EOF
/\/\/added by hand/a
if (dnsDomainIs(host, “${domain}”)) return PROXY;
.
w
EOF
然后iPhone终端下面运行,让这个脚本可执行:
chmod +x /usr/bin/agfw
如果发现某个网站例如twitter.com你用safari打不开,那么只需要在iPhone终端下面运行:
agfw twitter.com
然后关闭safari(调出多任务,长按,xx掉safari)再运行一次safari就能立马打开了。
这个脚本的意思是,读取agfw这个命令后面的参数,按照脚本里面的一定的规则,写入到/var/root/pac文件中 //added by hand 这部分的下面。
d 为WIFI/EDGE/3G应用PAC文件
好了,现在Python的服务端和客户端都正常运行了,SOCKS代理也有了,PAC文件也建立好了,怎么用呢?
如果给WIFI用,很简单,在iPhone的wifi的HTTP代理设置部分,点自动,然后填入下面的地址:
file:///var/root/pac
注意是三个斜杠。
如果给EDGE/3G用的话,需要修改iPhone的一个文件,用iFile打开:
/var/preferences/SystemConfiguration/preferences.plist
找到如下部分,注意一定要找准地方,不能找错了,添加红色的代码:
<string>com.apple.CommCenter (ip1)</string>
</dict>
<key>Proxies</key>
<dict>
<key>ProxyAutoConfigEnable</key>
<integer>1</integer>
<key>ProxyAutoConfigURLString</key>
<string>file:///var/root/pac</string>
</dict>
<key>UserDefinedName</key>
<string>com.apple.CommCenter (ip1)</string>
需要重启
现在WIFI/edge/3G都能用上这个PAC文件了。
总结:
以上是全部过程,简单来讲就是两个东西
1 在服务器端和iphone端安装python程序并执行代理的python代码
2 在iPhone端设置PAC和使用PAC
优点:
1 可以看到,server.py 已经在vps上建立了一个代理接口,local.py负责连接这个接口,相比较ssh tunnel方式,这种没有登录过程,只有link的过程,所以翻墙反应相当迅速。
2 有了agfw这个脚本,随时随地添加被GFW的网站,不用等gfwlist
3 iPhone是手机,手机不免要经常切换网络,这个代理完全不受网络切换的影响,可以说是24h在线。相比较ssh tunnel和vpn来说,iphone如果切换了网络或者进入休眠状态,99%是需要重新连接的。
4 pac文件在iphone是全局的,并且我的这个pac文件好处就是,任何网站(包括pac里的list)如果socks代理走不通,会自动跳到直连,也就是说如果socks 代理挂了,原来你不用代理能打开的网站照样能打开。真正的无缝!
完。
有任何问题,可以在twitter上找到我 @cattyhouse
原文:http://catty-house.blogspot.hk/2012/11/iphonevpspythonpac.html?m=1
这个方法不错