2013年5月28日 星期二

android iptables小結

http://rritw.com/a/JAVAbiancheng/JAVAzonghe/20120831/215417.html
 
先在此謝謝一朋友,他的博客:http://fonter.iteye.com/blog/search?query=iptables
關於iptables的常用命令,請参考我朋友的博客。


android上使用iptables一般做代理和app防火牆功能。
有幾個開源項目,推薦大家去googlecode上去找找:
droidwall:app網络防火牆;
proxydroid:代理app,支持多種網络協議;
gaeproxy:代理app,自己有python的服務端,貌似可以翻牆哦親。
以上軟件都需要root權限。


app網络防火牆實現思路:
通過iptables命令設置filter表,針對OUTPUT鏈,來源是wifi或是2g/3g的做REJECT或是DROP操作。

REJECT 攔阻該封包,並傳送封包通知對方。
DROP 丟棄封包不予處理,進行完此處理動作後,將不再比對其它規則,直接中斷過滤程序。
REJECT和DROP其效果都可以使app無法聯網,所以兩個任你選擇使用。

如何區分是wifi或是2G/3G?
我們需要使用-o参數來區分是封包來源是wifi還是gprs,
参數 -o, --out-interface
範例 iptables -A FORWARD -o eth0
說明 用來比對封包要從哪片網卡送出,設定方式同上。
其中wifi有三種(参考droidwall Api.java):tiwlan+, wlan+, eth+
gprs有六種:rmnet+,pdp+,ppp+,uwbr+,wimax+,vsnet+" 

下面還剩下一個問題,如何區分封包來自哪個app?
由於iptables處於7層協議下三層,應該是無法區分應用的。

這裏要使用擴展模式-m 操作owner表
範例:iptables -A OUTPUT -m owner --uid-owner 500
說明:用來比對來自本機的封包,是否为某特定使用者所產生的,這样可以避免服務器使用 root 或其它身分將敏感數據傳送出去,可以降低系統被駭的損失。可惜這個功能無法比對出來自其它主機的封包。

下面给出一個完整的實例:
iptables -t filter -A OUTPUT -o wlan+  -m owner --uid-owner 10042 -j DROP
說明:操作filter(-t filter可以省略,默認操作filter表)的OUTPUT鏈,封包來源是wlan+,並且來源是uid为10042的,丟棄數據包。

執行過程如果出現:No chain/target/match by that name, 可能就是你的rom不支持該操作了。
iptables需1.4+版本 
內核支持iptables操作,所以並不是所有root的rom都支持的。

今天先說app防火牆,改天再講代理(提前說明,代理操作nat表)。

沒有留言:

張貼留言