折腾了几天,总算有点阶段性成果:
证实可以用iptables实现通过cmwap的代理上HTTP协议的网站。
首先,android系统的实现是有缺陷的。在接入apn中指定的proxy并不会被系统所用。好似只有浏览器会对这个设置有所反应。可以进行普通HTTP的代理浏览。而其它应用压根不理这个设置,我行我素的通过android系统进行域名请求,然后跟没有代理一样的进行连接请求。这应该是一个系统缺陷。
为了纠正这个偏差,主要有两个问题:
1、cmwap接入不支持dns解析。其实如果android压根不理dns的事情,直接把所有的请求都转发到apn指定的proxy,就没事了。但现在,我能想到的方法就只有自己修改/etc/hosts 文件来加入解析。
2、把所有向外的针对80端口的http请求全部转向到 10.0.0.172:80 用iptables可以实现这个需求。
具体步骤:
1、将system重新挂载为可写的模式,否则,就无法修改hosts文件
mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
2、编辑/etc/hosts文件,当然,如果对vi编辑器不熟,或者懒得看terminal里面那么小的字,也可以用 adb push过去,目前我的hosts文件加了如下的解析:
127.0.0.1 localhost
64.73.32.135 north-america.pool.ntp.org
64.233.169.188 mtalk.google.com
66.249.89.99 www.google.com
66.249.89.101 android.clients.google.com
63.216.60.76 static.rememberthemilk.com
207.242.93.89 andrd.accu-weather.com htc.accuweather.com
74.125.153.95 ajax.googleapis.com
72.9.41.2 lyrics.tunewiki.com
这个hosts文件可以实现:google地图的正常显示、accuweather天气软件的更新、market的使用、tunewiki的歌词和封面获取。
3、用iptables实现转向:
iptables -t nat -A OUTPUT -o rmnet0 -p tcp –dport 80 -j DNAT –to-destination 10.0.0.172:80
这一步每次重启之后都要重新做一次。没法子,凑合吧
=================================================
下面的工作:
1、搜集G1各个应用程序联网所需的域名解析
2、写个程序来控制转向的开启与关闭
3、实现一个简单的dns server程序,在有wifi连接的时候完成积累的dns解析,cmwap的时候在本地解析域名
4、想法子通过cmwap建立隧道传递所有TCP。这一步目前有个问题,如果我通过iptables将ip包的目的地址转为本地,如何能获得它原来的目的地址呢?。困扰~~~