jejer@wordpress Anything Worth Doing is Worth Doing Well

20Dec/09Off

在Android上用TunnelDroid(OpenVPN)实现cmwap完美穿越

因为Android平台的限制,用cmwap接入点接入网络时只有内置浏览器会经过代理10.0.0.172:80,其他程序无法使用互联网.

之前我一直使用@biaji开发的cmwrap让其他程序上网,cmwrap使用iptable重定向数据流,结合hosts文件做域名解析,所以你向让其他程序穿过cmwap时需要手动修改hosts文件添加ip-domain记录.

今天在twitter上听见某位推油提到TunnelDroid,我想到尝试用它做cmwap穿越.TunnelDroid的SourceForge地址是:http://sourceforge.net/projects/tunneldroid/files/

本方法需要一个可以连接的OpenVPN服务器.用Linksys路由器架设OpenVPN的方法参见:http://www.jejer.net/?p=3931

我按照README顺利联通了架在路由器上的OpenVPN服务器,但不幸的是网络无法访问.

查看TunnelDroid发现了一些有趣的信息:

TunnelDroid Log

TunnelDroid Log

错误信息大概意思是默认路由添加失败.

以命令查看tap0虚拟网卡发现tap0没有ip信息,我不知道这是不是TunnelDroid的BUG.
同样以命令修复之:busybox ifconfig tap0 192.168.10.140 netmask 255.255.255.0
然后添加路由项:busybox route add –net 192.168.10.0 netmask 255.255.255.0 dev tap0
busybox route add default gw 192.168.10.1 dev tap0

如此操作之后我发现已经可以ping到路由器的ip了,但是DNS解析还是不行.这好像是Android的BUG,因为busybox ping就可以通.
又在网上一顿搜索,找到了制定DNS的命令:setprop net.dns1 192.168.10.1

OK这些命令过后终于可以上网了.

fix ip gateway dns

fix ip gateway dns

打开浏览器看看ip哈哈,已经变成电信ip

ip地址验证

ip地址验证

再开Twidroid看看,完全没有问题:

Twidroid验证穿越

Twidroid验证穿越

为了方便连接,我把上面的命令写成一个sh脚本放在sd卡下

#!/system/bin/sh
busybox ifconfig tap0 192.168.10.140 netmask 255.255.255.0
busybox route add –net 192.168.10.0 netmask 255.255.255.0 dev tap0
busybox route add default gw 192.168.10.1 dev tap0
setprop net.dns1 192.168.10.1
busybox route

每次TunnelDroid连接完成后去运行一下这个脚本就可以上网了:

sh脚本

sh脚本

完成!

从而实现cmwap完美穿越,不必再更改hosts文件,DNS解析正常.与cmnet无异.

参考:

SmartQ 5 在 Android 1101固件系統下使用華為 E180 USB Modem 成功上網

#fuckgfw

---------------------------------完美的分割线-------------------------------------

20091225更新:

使用tun代替tap,可指定ip地址
使用route-up "cmd"替代sh脚本设置DNS,省去连接后运行脚本的麻烦

server.ovpn

daemon
ifconfig 10.8.0.1 10.8.0.2
proto tcp-server
port 443
dev tun21
cipher BF-CBC
comp-lzo yes
keepalive 15 60
verb 3
secret static.key
status-version 2
status status
在路由器上配置iptables
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
client.ovpn
dev tun
ifconfig 10.8.0.2 10.8.0.1
secret static.key
proto tcp-client
remote jejer.3322.org 443   #xxxx为你申请的的3322.org动态网址
keepalive 10 60
resolv-retry infinite
nobind
persist-key
persist-tun
cipher BF-CBC
comp-lzo
verb 3
float
http-proxy-retry                  #要通过cmwap网关的话要加上这句和下一句
http-proxy 10.0.0.172 80
route-gateway 10.8.0.1
redirect-gateway def1
dhcp-option DNS 10.8.0.1
#G1需要下面两句来设置DNS,在电脑上不需要,注销掉即可
script-security 2 system
route-up "setprop net.dns1 10.8.0.1"

TunnelDroid连接完成之后即可.不必再执行修正脚本.
#fuckgfw