Monday, October 15, 2012

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

3 comments:

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

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

    ReplyDelete
  3. 请教博主,基于省电考虑,ios6下如何完全关闭autossh和ssh?

    ReplyDelete