Archive

Archive for the ‘Android’ Category

Android平台翻墙方案总结

April 10, 2011 6 comments

跟国家防火墙干上了有两年了,弄得本人都有点人格分裂。因为我长期不用Windows,PC上的方案我就不说了;Android平台我相对熟悉,所以简单总结一下。其实理论上都差不多,只是Windows 系统上,有一些商业公司提供的闭源翻墙工具。

1. 支持所有网络的 web proxy。一个典型的工具是 google 的移动设备的适配服务:http://gxc.google.com.hk/gwt/x?u=http%3A%2F%2Fdeveloper.android.com。类似的翻墙方式google translate的网页翻译也能实现。另外就是别的web proxy, 以前有发过总结这种项目/工具的总结 web-proxy 评测报告 。这种方式有局限,你不能触碰关键词(特别是 URL 中,这种代理一般是http的)。如果有支持 https 的web proxy 服务,就比较理想了。

2. 仅支持移动网络(如GSM, WCDMA)的 HTTP Proxy。这一般需要你在国内有一个主机,然面运行个如squid 的HTTP代理程序(我之前是在服务器上用 gappproxy 做的公共HTTP 代理,不过现在GAE已经连不上了);手机上的移动网络接入点设置中,填写HTTP代理ip以及端口。这种方式可以让自带的 chrome lite 浏览器走代理。其它的浏览器和应用程序不一定会使用这个代理。(Andorid 系统似乎可以在数据库中为每一个应用程序设置代理,但是能够保证应用程序一定使用这个代理吗?我估计不能。)

3. socks代理方案。典型的工具如是 TransProxy ,是一个简单设置全局代理的工具,可以配合connetbot 端口转发功能,做系统全局的透明代理。对于大陆用户,TransProxy 的缺陷在于不能处理dns劫持。目前我比较看好的一个项目是 sshtunnel,功能很强大,可以处理dns劫持。sshtunnel的配置有点复杂。有两种代理工作模式:a) 本地socks 代理,如果只有一个ssh帐号,需要开启这个方式;b) 远程socks代理,需要在服务器上开squid代理,这样做的优点在项目issue 里有说明:http://code.google.com/p/sshtunnel/issues/detail?id=8&can=1,不过文档不够清晰,还需完善。这种方案的原理可以看我上一篇日志中有说明,它的的好处是,可以保证应用程序使用你的代理;可问题在于,这个方案需要root权限用 iptable 做端口转发,对于普通用户门槛较高。

4. 国外VPN。目前而言,买个VPN自己用是最省心的翻墙方案,Android系统上可以直接配置。推荐下 @xiaodin店铺(非广告,纯友情链接)。

Categories: Android

使用 redsocks 作强制的系统全局代理

April 7, 2011 7 comments

本文介绍利用 redsocks 做强制的系统级全局代理,在Ubuntu 以及Android 系统上实现SSH翻墙。Ubuntu 上可以设置系统的网络代理,但是这只是一个系统配置,是否使用这些配置还是由应用层决定(如Firefox可以选择 “直接连接” 或者”使用系统代理设置”)。强制80、443端口走代理,可以省去应用层设置,这种方案可以用于 android 系统翻墙。本文主要介绍的PC上的安装方法,但是这种方案对于普通PC用户而言,对比简单ssh socks代理并无优势;本文的目的主要是为Android 系统翻墙提供一个可行的方案。

可以认为本文是 @bjin 的 redsocks on android指南(墙外) 的补充(我建议大家先看一遍原文再回来),针对原文中提到的 redsocks 方案中 dns解析问题,提供一个解决方法,并能够在PC上进行演示。我认为redsocks 方案中,不论何种代理类型,dns解析问题都会存在,因为是透明代理,dns解析都会在浏览器上直接进行。另外,“国内干净无污染的dns”很难找,不会有公共的,只能自己搭建一个。此前我特地考察了下 v2ex dns,是放在linode 上的,也不行(dns污染的原理,大概是监控所有出国的dns请求,如果发现“非法”域名的dns,gfw会抢先返回一个错误的结果,所以仅仅换用国外的dns 不能解决问题。详情参考:深入理解GFW:DNS污染, 墙外)

安装 redsocks

首先说下 redsocks 以及 iptables 安装、配置。编译 redsocks 过程很无痛的,仅仅依赖于 libevent:

mkdir /opt/src
cd /opt/src
git clone https://github.com/bjin/redsocks
cd redsocks
sudo apt-get install libevent
make

控制脚本(参考原文做了些改动)redsocks.sh:

#! /bin/sh

case "$1" in
  start|"")
    cd /opt/src/redsocks
    if [ -e redsocks.log ] ; then
      rm redsocks.log
    fi
    ./redsocks -p /opt/src/redsocks/redsocks.pid #set daemon = on in config file
    # start redirection
    iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to 12345
    iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to 12345
    ;;

  stop)
    cd /opt/src/redsocks
    if [ -e redsocks.pid ]; then
      kill `cat redsocks.pid`
      rm redsocks.pid
    else
      echo already killed, anyway, I will try killall
      killall -9 redsocks
    fi
    # stop redirection
    iptables -t nat -F OUTPUT
    ;;

  start_ssh)
    ssh -NfD 1234 user@example.cc #TODO: change it!!!
    ;;

  stop_ssh)
    ps aux|grep "ssh -NfD 1234"|awk '{print $2}'|xargs kill
    ;;

  clean_dns)
    iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -m gfw -j DROP -m comment --comment "drop gfw dns hijacks"

  *)
    echo "Usage: redsocks start|stop|start_ssh|stop_ssh|clean_dns" >&2
    exit 3
    ;;
esac

配置文件 redsocks.conf:

base {
	// debug: connection progress & client list on SIGUSR1
	log_debug = on;

	// info: start and end of client session
	log_info = on;

	/* possible `log' values are:
	 *   stderr
	 *   file:/path/to/file
	 *   syslog:FACILITY  facility is any of "daemon", "local0"..."local7"
	 */
	log = stderr;

	// detach from console
	daemon = on;

	/* Change uid, gid and root directory, these options require root
	 * privilegies on startup.
	 * Note, your chroot may requre /etc/localtime if you write log to syslog.
	 * Log is opened before chroot & uid changing.
	 */
	// user = nobody;
	// group = nobody;
	// chroot = "/var/chroot";

	/* possible `redirector' values are:
	 *   iptables   - for Linux
	 *   ipf        - for FreeBSD
	 *   pf         - for OpenBSD
	 *   generic    - some generic redirector that MAY work
	 */
	redirector = iptables;
}

redsocks {
	/* `local_ip' defaults to 127.0.0.1 for security reasons,
	 * use 0.0.0.0 if you want to listen on every interface.
	 * `local_*' are used as port to redirect to.
	 */
	local_ip = 127.0.0.1;
	local_port = 12345;

	// `ip' and `port' are IP and tcp-port of proxy-server
	ip = 127.0.0.1;
	port = 1234;

	// known types: socks4, socks5, http-connect, http-relay
	type = socks5;
}

启动:

./redsocks.sh start_ssh
./redsocks.sh start

关闭:

./redsocks.sh stop
./redsocks.sh stop_ssh

start_ssh 和 stop_ssh 两个动作是相对独立的,用于开关代理。只需要保证 redsocks 运行时,代理正常工作即可。android 手机上,ssh 隧道应该可以直接用 connnectbot 建立。

安装西厢的反DNS污染模块

redsocks 启动之后上国内网站基本没问题了。但是 twitter 可能还上不去。原因在于浏览器不知道你设置了代理,于是自己去解析dns,而dns解析用的53端口没有通过代理。因此我们还需要把dns 的问题解决掉。
目前来看,西厢计划中的反dns污染模块还是可以工作的。我们装上这个模块给装上,就不需要自己架无污染的dns服务器,绿色环保。
PC安装西厢,我今天自己做了一次,参考我的tumblr:记录一下Ubuntu 10.04 上西厢的安装过程
我把开启的命令也写在上面的控制脚本里了:./redsocks.sh clean_dns 。这一步建议做成开机自启动,因为一直开着也没坏处。
scholarzhang 项目的android 移植,参考 @tewilove 的 liujinyuan 项目,以及 @tewilove 这篇总结(为避免一些可能的麻烦,我把内容复制出来了;tumblr 上有原文链接)。另外,我希望能有人把西厢中的反dns污染代码单独抽离出来,放在github上单独维护,或许能简化安装过程,有志于参与开发的同学们也更容易理解。

Categories: Android

SSH Login without password with ConnectBot on Android

December 9, 2010 Leave a comment

 

  Typing password on Android device is troublesome, espcially when the password is long and complex. You may know that ssh-keygen can be used to generate rsa key pair to configure server, for SSH login without password (detailed in http://linuxproblem.org/art_9.html). On Android device you can do the same thing with ConnectBot.

  Open ConnectBot, Menu => “Manage Pubkeys” => Menu => “Generate”, then generate one. The password on this step is NOT the acctual server password, but the passwd for this key pair(so if you can ensure the safty of your device you dont have to fill it). After touching the screen for a while the key pair is generated, and you can manage to copy your public key to PC(e.g. via a text file in sdcard). Then append public key to ~/.ssh/authorized_keys remote sever. In fact the process of copying public key can be done on the phone, but I suppose this way is the most efficient.

  It is strongly adviced that you also backup your private key to sdcard or PC. Once you clear data storage for ConnectBot (e.g. uninstall ConnectBot or installed a now ROM), the private key is lost and you have to this once again. With the private key backuped on your sdcard, you can easily import it afterward (in the similiar way to create it).

 

Categories: Android

推荐一款Android网络助手

June 25, 2010 Leave a comment

好吧, 我还是承认了, 本人不是专业搞翻墙的, 最好的Android 浏览器翻墙方式是用修改版的opera mini(有APK下载). 图片看这里.

如果希望你手机其它的基于HTTP/HTTPS的应用翻墙, 或者是单纯想知道我都捣腾了写什么, 继续往后看.

首先说明一下使用条件. 你需要有一个Android手机. 此apk目前只在G2, G3上测试过. 其它机型理论可行. 但是目前有如下限制:

1. 大前提: 需要有手机的root权限. 如果还没有拿到root权限, 可以先搜索相关教程, 如G3取root权限.

2. Wifi网络无法使用HTTP方式连接到国外含有敏感内容的网站. 所以一般Wifi网络时, 需要关闭mobile view 并强制使用HTTPS连接, 以保证不会跳转到HTTP的WAP页面.

3. HTTPS方式, 仅在手机ROM版本为安智网时可用(如果开机第一屏有xda-china或者安智网, 说明没问题). 如果是其它ROM来源, 需要上安智网(bbs.goapk.com)刷一个论坛里的ROM才可以使用. HTTPS在某些固件版本下不可用. 不行可以尝试刷一个bbs.goapk.com论坛的固件. 本人没有在多个机型仔细测试, 如果有测试结果欢迎以评论方式反馈.

4. 本程序修改了移动网络接入点设置. 卸载之前需要保证翻墙工具处于关闭状态. 或者在卸载之后, 在“移动网络设置” => “接入点名称”中按menu键, 重置为默认设置.

网络助手apk文件下载地址: http://medusa.sinaapp.com/NetHelper.apk

翻墙原理在前一篇博文介绍两种基于Google App Engine的翻墙方法  中有提到. 这里就不赘述.

没有APK安装器的同学,可以尝试下安智网的APK安装器.

注意: 本文中的应用程序由安智网网友开发, 如果法律或者政治风险, 安智网不负相关责任.

Jun 26 2:20pm 补充: HTTP因服务器负载无法承受, 暂停服务. HTTPS方式不依赖于服务器, 不受影响.

Jun 28 10:27am 补充2: 因缺少服务器资源, 担心负载不能承受, 此翻墙方法尚未对外宣传. 有可以的国内服务器的同学, 请在twitter DM @liruqi

Jun 29 2:00 pm 补充3: 今天apk文件版本有更新, 比以前更好用了(下载地址不变, 在上文). 本来还打算今天发截图的, 后来测试发现有台服务器不能处理302重定向(python 2.4.3的), 以及昨天刷新版ROM之后, https也走服务器代理了. https本来是不让走代理的, 不安全. 我今天尝试修复这个问题. 不过也有好消息. G2(HTC Magic) 上, 用北京动感地带的2G网络, 部分地址没有被dns污染. 比如mobile.twitter.com. 估计北京动感地带的2G用户, 可以直接下载上面的apk文件翻墙了.

July 1 10:47 pm 补充4: 今天测试了下最新翻墙工具, 基本没问题. 而且现在也没啥https不https的问题, 全走的代理. 不过还不确定是否跟上次刷了rom有关. apk文件下载地址不变, 文件已更新. 服务端源代码放放在这里, 各位有自己的国内服务器也可以自行搭建代理.

(本文最后修改时间: July 12, 3:27 pm)

Categories: Android, 翻墙, 安智网