去年双11在 Linost 上打折促销买的 SSH 账号一直在电脑和手机上用来翻墙效果还是可以的,电脑上用 ssh 命令,Android 手机上用 SSH Tunnel 这款 App 配合使用的话也没发现什么问题。但最近把 New PadFone Infinity 手机的系统升级到 4.4 版本之后就发现 SSH Tunnel 的全局代理功能无法正常工作了,App 连接 SSH 服务器提示成功,但是实际在手机上其它 App 的任何网络请求都会报错,根本无法使用。
刚开始没找到解决办法,SSH Tunnel 的 Google Play Store 评论里也有其它用户反映了这个问题,但作者也一直没有更新此软件,因此想了一个临时的办法就是用 SSH Tunnel 的动态 SOCKS 代理功能 + ProxyDroid 这款 App 的全局代理功能配合实现 Android 的全局翻墙功能。这样需要先关闭 SSH Tunnel 的全局代理功能,然后指定一个动态绑定端口,然后在 ProxyDroid 里指定使用 SSH Tunnel 绑定端口开启全局代理,经过实际测试可以达到效果。
后来想到明明一个 SSH Tunnel App 就可以实现的功能,现在必须安装两个 App 终究是不太好的,而且稍微了解下就清楚了 SSH Tunnel 和 ProxyDroid 的全局代理功能都是通过 redsocks + iptables 配合使用来实现的。
我们先来看看 SSH Tunnel 在启用全局代理选项并连接服务器之后生成的临时 redsocks.conf 配置文件内容:
base { log_debug = off; log_info = off; log = stderr; daemon = on; redirector = iptables; } redsocks { local_ip = 127.0.0.1; local_port = 8123; ip = 127.0.0.1; port = 9050; type = socks5; }
这个文件所在路径为:/data/data/org.sshtunnel,开启 root 权限之后安装终端模拟器或者其它文件管理器都可以看到。稍加分析可以看到 redsocks.conf 配置文件是由 SSH Tunnel 中自带的 proxy_socks.sh 脚本自动生成的。
通过查看 redsocks 项目网站上的说明,这个生成的临时 redsocks.conf 似乎也是对的,但是连接成功之后通过 ps 命令却看不到 redsocks 进程,看来就是 redsocks 进程没有正常运行引起的了。
经过多番尝试修改 proxy_socks.sh 脚本以产生不同的配置文件,才发现 SSH Tunnel 自带的 proxy_socks.sh 生成的配置文件在 Android 4.4 上由于日志选项被关闭会导致 redsocks 进程异常退出(具体原因未知)。使用 root 浏览器等工具修改该脚本为以下形式(修改的行已高亮显示出来):
#!/system/bin/sh DIR=/data/data/org.sshtunnel PATH=$DIR:$PATH case $1 in start) echo " base { log_debug = on; log_info = on; log = stderr; daemon = on; redirector = iptables; } " >$DIR/redsocks.conf echo " redsocks { local_ip = 127.0.0.1; local_port = 8123; ip = 127.0.0.1; port = $2; type = socks5; } " >>$DIR/redsocks.conf $DIR/redsocks -p $DIR/redsocks.pid -c $DIR/redsocks.conf ;; stop) kill -9 `cat $DIR/redsocks.pid` rm $DIR/redsocks.pid rm $DIR/redsocks.conf ;; esac
保存退出之后,重新开启 SSH Tunnel 的全局代理功能并连接 SSH 服务器,这时查看 redsocks 进程:
root@ASUS-A86:/ # busybox ps ax | busybox grep -i redsock 7808 root 0:00 /data/data/org.sshtunnel/redsocks -p /data/data/org.sshtunnel/redsocks.pid -c /data/data/org.sshtunnel/redsocks.conf 8211 root 0:00 busybox grep -i redsock
之后你就会发现处于墙外无限制的状态了。
另外还有一种解决办法就是直接把 ProxyDroid 软件中的 redsocks 二进制文件(路径为:/data/data/org.proxydroid)拷贝到 /data/data/org.sshtunnel 目录中直接覆盖,这样就不用修改脚本了,玩的开心 ^_^