Total Pageviews

Sunday, 17 April 2016

在越狱的iOS里,用ssh tunnel/shadowsocks翻墙

配置SSH Forwarding

这步有许多shell操作,Cydia里mobile terminal提供了一个可用的Shell。但是使用起来很不方便,通过SSH远程登录到iPhone借助电脑的全键盘更加便利。 ###SSH登录到iPhone 1. Cydia里安装OpenSSH 2. 设置 -> Wi-Fi -> CurrentWiFi 参看IP地址(假设:192.168.2.107) 3. Mac OS里打开Bash输入ssh root@192.168.2.107,密码:alpine

免密码SSH登录远程服务器

详细步骤和说明参看MacOS X终端里SSH会话管理
  1. 切换到mobie账户
    • su - mobile
  2. 创建密钥对
    • ssh-keygen -t rsa
  3. 拷贝公钥到远程服务器
    • 若authorized_keys已存在
      cat ~/.ssh/id_rsa.pubssh username@example.com “cat - » ~/.ssh/authorized_keys”`
    • 若authorized_keys不存在 scp ~/.ssh/id_rsa.pub username@example.com:~/.ssh/authorized_keys
  4. 别名登录
    • ~/.ssh/config里添加如下配置
      Host example HostName example.com User username Port 22
  5. 测试
    • ssh example能登录到远程主机即表示成功

断线重连

  1. 编辑iOS下/etc/ssh/ssh_config
    • 添加一行ServerAliveInterval 10
  2. Cydia安装automatic ssh
    • 使用autossh -M 0 -D 9090 -Nfq example开启SOCKS5代理服务,该命令会立即返回并且后台执行。
  1. 启动SSH Forwarding,启动命令为autossh -M 0 -D 9090 -Nfq example其中example为host的别名
    • Mac OS远程登录启动(这个?没有电脑不就没戏了)
    • mobile terminal启动
      1. Cydia里安装mobile terminal
      2. 在mobile terminal里设定shortcut Menu可以快捷输入

参考文献

  1. SSH登陆iPhone后台
  2. PAC自动代理文件格式,教你如何写PAC文件
-----------------------

iPhne/iPad 通过SSH终极翻墙解决方案

此文写的比较简洁,并没有将所有细节都写出来,相信在PC上翻墙过的人,都能看懂,某些地方看不懂的,自行google一下相关知识吧。
有朋友说道goagent,这个东西首先用的是google app engine,但是gae本身就不稳定,经常被墙,而且goagent需要安装一堆东西。
此方法通过autossh连接的tunnel即使在mobileterminal被关闭的情况下,连接还有效,甚至respring了,连接还有效。只是重启了之后才需要重连,非常稳定的说。
用过很多种翻墙的工具,本人觉的SSH是目前仅次于VPN的最安全,最快速,最稳定的翻墙方式。

准备工作:

1 越狱
2 SSH帐号一枚
3 安装mobile terminal, openssh, automatic ssh,iFile.

配置过程:

1 建立ssh socks tunnel:
1.1 生成id_rsa,放到到 /var/mobile/.ssh/ 以便连接ssh无需输入密码
1.2 在mobile terminal下运行 ssh username@yoursshserver.com 生成know_hosts文件
1.3 在mobile terminal下运行autossh -M 20000 -D 9090 -Nfq username@yourserver.com 建立不会中断的ssh socks tunnel

2 利用gfwlist生成自动代理pac文件

2.1 配置好google chrome的插件switchysharp,保证chrome能利用gfwlist翻墙
2.2 在switchysharp配置里面导出成pac文件,比如sp.pac
2.3 用文本编辑器编辑 sp.pac,替换掉里面的 ‘SOCKS5 127.0.0.1:9090’ 为 “SOCKS 127.0.0.1:9090”  (PS: 不这样做的话,iphone上使用这个pac会有问题)
2.4 将sp.pac 放入iphone的 /var/root/
2.5 用iFile编辑sp.pac 属性,将用户,组,其他的权限全部设置为可读可写可执行



2 生成pac文件 (见这里b,c部分)

3 将pac植入 edge/3G的配置文件中
3.1  用iFile编辑文件: /private/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>

3.2 重启iOS设备

4 上网设置:

无论哪种方式上网,首先运行: autossh -M 0 -D 9090 -Nfq username@yourserver.com(或者ip地址)

edge/3G 上网:试着打开下facebook,测试成功!

wifi 上网:连接wifi,在wifi设置里面,找到自动代理,填入: file:///var/root/pac

注意事项1:

在ssh连接部分,暂时无法实现edge/3g 与 wifi自动切换,意思就是,有2种情况:
1 edge打开wifi关闭情况下,连接autossh,如果再打开wifi,这时候,国内流量走的是wifi,而被墙网站走的是edge流量,此时只需要在mobile terminal下面执行 killall autossh,再运行上文提到的autossh连接命令,这时候,所有流量都走wifi。

2 wifi和edge同时开启,连接autossh,此时所有流量都走wifi,但是如果在此时把wifi关闭,由于autossh无法自动切换到edge连接上去,此时的socks tunnel实际上是没有建立成功的,用edge只能访问国内网站,被墙的会因为找不到代理接口而无法访问,但还是如 1提到的解决方法,先kill掉autossh再重连。

这是目前此方法唯一的缺点,其他的都工作的很好,因为pac是基于gfwlist转换而来的,所以能达到gfwlist的效果,也就是被墙网站走ssh,没有被墙网站不走ssh,保证了所有网站可访问,同时保证了速度!

update 1:

ssh 有个配置选项可以解决网络切换的问题
编辑iPhone/iPad下的 /etc/ssh/ssh_config
添加如下代码
ServerAliveInterval 10
如果ssh在30s内没有数据传输,就会自己中断,autossh就会检测到,于是重连。所以在wifi切换到edge的时候,或者一个wifi切换到另外一个wifi的时候,都可以自行切换


update 2 : 如果开启了 ServerAliveInterval 则可以关闭TCPKeepAlive 同样编辑iPhone/iPad下的 /etc/ssh/ssh_config
添加: TCPKeepAlive no
同时可以设置 autossh的参数 -M 0 (替代原来的-M 20000)

注意事项2:
pac 文件一定要放到 /var/root/ 文件夹下面,经过n此测试,不放在这里,很多程序便无法读取到这个pac文件。也许是iOS的sandbox在作怪。网上有很多教程把这个文件放在/var/mobile 是不行的,但是他们居然还敢发文。。。

技巧:
上面连接autossh的命令比较长,在iphone下面输入会比较麻烦,还好 mobileterminal有shortcut功能,可以将这段代码放到shortcut里面去,下次只需要触摸下菜单,回车就运行了。其他需要在mobileterminal下面执行的命令以此类推。 update 3

其实iphone也可以用alias的,我现在已经不怎么用以上的mobile terminal快捷方式了
alias在此处设置 /etc/profile.d/coreutils.sh
alias proxy = 'autossh -M 0 -D 9090 -Nfq username@yourserver.com
然后保存,再在iPhone/iPad 上运行:
source /etc/profile.d/coreutils.sh
然后只需要运行:
proxy  
就能启动ssh tunnel。

ssh 有个配置选项可以解决网络切换的问题
ServerAliveInterval 设置为10s
如果ssh在30s内没有数据传输,就会自己中断,autossh就会检测到,于是重连。所以在wifi切换到edge的时候,或者一个wifi切换到另外一个wifi的时候,都可以自行切换。但edge切换到wifi还需要看情况。

如果开启了 ServerAliveInterval 则可以关闭TCPKeepAlive
同时可以设置 -M 0

from  http://catty-house.blogspot.jp/2012/10/ios-wifiedge3gssh.html
---------------------------

越狱iPhone下,用Shadowsocks+PAC翻墙


提要: 在这之前一直用SSH Tunnel 配合PAC翻墙,这也是一种大家最常用的方法,没什么大的问题,但是SSH原本不是用来做代理翻墙的工具,所以效率上并不是太好,而且作为iPhone来讲,后台运行一个SSH Tunnel会一直保持与SSH Server的连接,会严重影响iPhone的续航,而且由于手机经常会在edge/3G/wifi下切换,每次切换,SSH就会需要重新连接服务器,连接是需要花时间的,连不上还会一直连,所以很耗电。最近研究出来一个非常好的方法,耗电量和延迟会大大降低,实现了无缝翻墙。

实现条件:
a, 一个国外的VPS服务器
b, 一个越狱了的iPhone
c, 用Python建立SOCKS Proxy的代码Shadowsocks,VPS和iPhone上都要安装
d, PAC以及随时随地添加被GFW的网站到PAC的一个Bash脚本。

具体过程:

a 建立代理
a1  VPS服务器端安装Python程序,这个无需多说。
a2, iPhone上安装Python程序,最新版在这里,安装方法很简单:
打开iPhone的 mobileterminal, 或者ssh到iphone,运行下列命令:
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代码 Shadowsocks,作者项目主页,点这里下载
a4 部署python代码 Shadowsocks,代码分为服务器端server.py和iPhone端local.py,server.py放在VPS服务器,local.py放在iPhone。
a4.1 在服务器端,修改server.py的代码,如下红色部分改成自己的其余地方不需要变动。
PORT = 9999
KEY = "123456789"
说明:PORT 随便什么端口都行,但要跟下面iPhone端的local.py相同。KEY 随便什么密码都行(为了安全起见,尽可能长且乱),但要跟下面iPhone端的local.py相同

然后在VPS服务器终端运行:
nohup python server.py > /dev/null 2>&1 &
这条命令会让这个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 2>&1 & 

好了,iPhone后台就已经建立了一个SOCKS代理127.0.0.1:8080,这个代理可以供下面要介绍的PAC文件使用。

b 建立iPhone用的PAC文件
PAC= Proxy Auto Config,就是自动代理,它的作用就是决定哪些网站直连,哪些网站走SOCKS代理
在iPhone终端(或者ssh进入iphone)下面运行以下命令:
su (取得root权限,需要输入密码,默认密码是alpine)
touch /var/root/pac (建立空白文件)
chmod 777 /var/root/pac (改变文件权限为任何程序可读可写可执行)
chown mobile:mobile /var/root/pac (改变文件的所有者和组为mobile)
然后用nano(或者vim)编辑这个pac文件:
nano -w /var/root/pac
复制下面的代码到这个文件并保存:
function FindProxyForURL(url, host)

var PROXY = "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;
//以上部分说明这些网站需要走SOCKS代理 
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 -w /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
说明:运行这个脚本需要安装ed这个软件 

然后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
注意是三个斜杠。

3G/EDGE:
需要修改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>

保存后重启iphone


现在WIFI/edge/3G都能用上这个PAC文件了。

e 总结:

以上是全部过程,简单来讲就是两个东西
1 在服务器端和iphone端安装python程序并执行代理的python代码
2 在iPhone端设置PAC和使用PAC

f 优点:

1 可以看到,server.py 已经在vps上建立了一个代理接口,local.py负责连接这个接口,相比较ssh tunnel方式,这种没有登录过程,只有link的过程,所以反应相当迅速,且基本不耗电,local.py在iphone占用内存5M左右,要知道一个电话程序,常驻后台,占内存都10M了。
2 有了agfw这个脚本,随时随地添加被GFW的网站,不用等gfwlist
3 iPhone是手机,手机不免要经常切换网络,这个代理完全不受网络切换的影响,可以说是24h在线。相比较ssh tunnel和vpn来说,iphone如果切换了网络或者进入休眠状态,99%是需要重新连接的。
4 pac文件在iphone是全局的,并且我的这个pac文件好处就是,任何网站(包括pac里的list)如果socks代理走不通,会自动跳到直连,也就是说如果socks 代理挂了,原来你不用代理能打开的网站照样能打开。真正的无缝!

有任何问题,可以在twitter上找到我 @cattyhouse

from  http://catty-house.blogspot.com/2012/11/iphonevpspythonpac.html
-----------------------------------

Jailbroken iPhone, Shadowsocks-nodejs, PAC

My last blog talked about getting through the GFW with Shadowsocks python version on a jailbreak iPhone, this time, i'm going to talk about a better alternative, Shadowsocks-nodejs, here we go:


How does it work?


  • Create a Socks 5 proxy inside the iPhone with Shadowsocks-nodejs.
  • Create a PAC file inside the iPhone to tell which connection goes Proxy and which one goes Direct.
  • Create a bash script to add website to PAC file, so we don't need to edit the file maunally.
  • Assign the PAC file to WiFi and 3g/edge/gprs network.
  • PAC on iPhone is a system wide proxy, it will work for all apps.

How we gonna make it?

1 Create a Socks 5 proxy.


  • Go get the Shadowsocks-nodejs code and config it, see the project homepage.
  • on the server side, we need to get nodejs installed, find it at nodejs.org, and run:
nohup node server.js > /dev/null 2>&1 &
  • on the iPhone side, we  also need to install nodejs, find it in cydia store, the version should be 0.6.14, it works like a charm, after we got it, run inside iPhone:
nohup node local.js > /dev/null 2>&1 &
  • now we  have a running Socks 5 proxy inside iPhone, for example, 127.0.0.1:9090

2 Create a PAC file.


  • A basic PAC file is something like this:

function FindProxyForURL(url, host) {  // this is the beginning of PAC file

var XXGFW = "SOCKS 127.0.0.1:9090"; // this defines a variable to look clean and easy to modify

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";

} // this tells all local site to go DIRECT

if (
//added by hand
dnsDomainIs(host, "gmail.com") ||
dnsDomainIs(host, "blogger.com") ||
dnsDomainIs(host, "blogspot.com") ||
dnsDomainIs(host, "appspot.com") ||
dnsDomainIs(host, "bit.ly") ||
dnsDomainIs(host, "wikipedia.org") ||
dnsDomainIs(host, "twitter.com") ||
dnsDomainIs(host, "facebook.com") ||
dnsDomainIs(host, "google.com.hk") ||
dnsDomainIs(host, "youtube.com")) {

return XXGFW;

// this tells the listed websites to go our Socks 5 proxy, "||" means OR

else {

return "DIRECT";

// this tells everything else to go DIRECT 

// this is the end of PAC file

  • Save the above code to autoproxy.pac (for example) and move it to /var/root/ inside the iPhone, and run:

sudo chown mobile:mobile /var/root/autoproxy.pac
sudo chmod 777 /var/root/autoproxy.pac

3 Create a bash script to add website to PAC file

  • Now we got a working PAC, next we need to create a bash script, so that we can add any GFWed website into this PAC file, the script is like this:
#!/bin/bash
domain=$1
ed -s /var/root/autoproxy.pac << EOF
/\/\/added by hand/a
dnsDomainIs(host, "${domain}") ||
.
w
EOF
  • Save it and name it as agfw, move it to /usr/bin and give it the ability to excute:
sudo chmod +x /usr/bin/agfw
  • To run this script, we need to install ed in cydia store, once we find a website that is blocked by GFW, take the newly GFWed github.com for example, we can add it to PAC file just by running:
agfw github.com
  • Go and check the autoproxy.pac, we'll see that github.com is in there. Now we can view github.com with any  iPhone apps. We can add any website we want to the PAC file with this script, just a single command, it's pretty awesome :)

4 Assign the PAC file to WiFi and 3G/EDGE/GPRS network


  • For WiFi, go to Settings > WiFi > Your connected WiFi > HTTP Proxy > Auto, fill it with:
file:///var/root/autoproxy.pac
  • For  3G/Edge/GPRS, we need to edit the following file with iFile:
/var/preferences/SystemConfiguration/preferences.plist
  • Add the following colored code to the correct position of the this file:
<string>com.apple.CommCenter (ip1)</string> 
</dict> 
<key>Proxies</key> 
<dict> 
<key>ProxyAutoConfigEnable</key>
 <integer>1</integer> 
<key>ProxyAutoConfigURLString</key> 
<string>file:///var/root/autoproxy.pac</string> 
</dict>
 <key>UserDefinedName</key> 
<string>com.apple.CommCenter (ip1)</string>
  • Save and reboot to make it work.


What we got?


  • The proxy will work 24/7 as long as our VPS server works 24/7, always online, no login needed (compared to ssh tunnel & VPN), it just forwards GFWed connection to the server and get feed back.
  • This is the best solution for iPhone to make us feel that GFW seems not existed.
  • Gmail Push goes normal (in seconds) after i put main google domains into the PAC file, even when iPhone is sleeping.
  • The PAC file, the Socks 5 proxy and the Bash script that is used to add website to PAC file are all inside iPhone, once we found a website we can't open, just open Mobileterminal.app (which can be found on cydia store), run agfw balabala.com, done! pretty simple.
  • This solution also works for Linux and OS X client, because iOS is a lite version of OS X :)
from  http://catty-house.blogspot.com/2013/01/jailbreak-iphone-shadowsocks-nodejs-pac.html
--------------------

iphone下面通过bash script 自动添加被墙网站到pac文件


我iphone里面有一个autoproxy2pac项目生成的pac文件

这个文件是基于gfwlist的,gfwlist也会有漏网之鱼,所以有时候需要手动添加

但是在iphone下面用ifile编辑这个pac文件是非常痛苦的事情,所以我研究是不是有bash script能更好的帮助我更新这个pac文件

研究结果出来了,完全可行,感谢 irc.freenode.net  #bash 频道的三位国外大神的帮助

首先几个前提:
1 我已经有一个基础的 pac文件位于 /var/root/ap , 且权限为 777,所有者和组为 mobile,所有手动添加的被墙网站我都会放在文件里面一句 //added by hand 下面。(注意下面的脚本用到了这句话,以确保加入到pac的代码能在合适的位置)
2 说到bash,那肯定是要在命令行下面执行的,所以需要ssh进入iphone
3 这个script需要用到ed,所以安装ed,用 apt-get ed


脚本内容:

#!/bin/bash
domain=${1//./\\.}
ed -s /var/root/ap << EOF
/\/\/added by hand/a
if(/\.${domain}/i.test(url)) return PROXY;
if(/^[\w\-]+:\/+(?!\/)(?:[^\/]+\.)?${domain}/i.test(url)) return PROXY;
if(/^https?:\/\/[^\/]+${domain}/i.test(url)) return PROXY;
.
w
EOF


将以上内容保存到 /usr/bin/upac
并运行 chmod +x /usr/bin/upac

以后要添加被墙网站到pac 就直接终端运行:

upac twitter.com
upac google.com
upac google.com.hk
upac bit.ly

等等等等!!!

我的PAC文件,有兴趣可以以此为基础添加今后可能会被墙的网站

https://www.dropbox.com/s/u6u6rsy5m22jf8u/ap

update:
已经有更简洁的方式了,不需要依赖任何gfwlist 见:
http://catty-house.blogspot.com/2012/11/iphonevpspythonpac.html

from http://catty-house.blogspot.jp/2012/11/iphonebash-script-pac.html