解决SSH Tunnel在Android 4.4下的问题

去年双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 目录中直接覆盖,这样就不用修改脚本了,玩的开心 ^_^





*