Android上使用iptables一般做代理和app防火墻功能磨淌。
有幾個(gè)開源項(xiàng)目读拆,推薦大家去googlecode上去找找:
droidwall:app網(wǎng)絡(luò)防火墻奥吩;
proxydroid:代理app时捌,支持多種網(wǎng)絡(luò)協(xié)議亏吝;
以上軟件都需要root權(quán)限店诗。
app網(wǎng)絡(luò)防火墻實(shí)現(xiàn)思路:
通過iptables命令設(shè)置filter表叽赊,針對(duì)OUTPUT鏈,來源是wifi或是2g/3g的做REJECT或是DROP操作必搞。
REJECT 攔阻該封包必指,并傳送封包通知對(duì)方。
DROP 丟棄封包不予處理恕洲,進(jìn)行完此處理動(dòng)作后塔橡,將不再比對(duì)其它規(guī)則,直接中斷過濾程序霜第。
REJECT和DROP其效果都可以使app無法聯(lián)網(wǎng)葛家,所以兩個(gè)任你選擇使用。
如何區(qū)分是wifi或是2G/3G泌类?
我們需要使用-o參數(shù)來區(qū)分是封包來源是wifi還是gprs癞谒,
參數(shù) -o, --out-interface
范例 :
iptables -A FORWARD -o eth0
說明 用來比對(duì)封包要從哪片網(wǎng)卡送出,設(shè)定方式同上。
其中wifi有三種(參考droidwall):tiwlan+弹砚, wlan+双仍, eth+
gprs有六種:rmnet+,pdp+桌吃,ppp+朱沃,uwbr+,wimax+茅诱,vsnet+"
下面還剩下一個(gè)問題逗物,如何區(qū)分封包來自哪個(gè)app?
由于iptables處于7層協(xié)議下三層瑟俭,應(yīng)該是無法區(qū)分應(yīng)用的翎卓。
這里要使用擴(kuò)展模式-m 操作owner表
范例:
iptables -A OUTPUT -m owner --uid-owner 500
說明:用來比對(duì)來自本機(jī)的封包,是否為某特定使用者所產(chǎn)生的摆寄,這樣可以避免服務(wù)器使用 root 或其它身分將敏感數(shù)據(jù)傳送出去莲祸,可以降低系統(tǒng)被駭?shù)膿p失⊥钟可惜這個(gè)功能無法比對(duì)出來自其它主機(jī)的封包锐帜。
下面給出一個(gè)完整的實(shí)例:
iptables -t filter -A OUTPUT -o wlan+ -m owner --uid-owner 10042 -j DROP
說明:操作filter(-t filter可以省略,默認(rèn)操作filter表)的OUTPUT鏈畜号,封包來源是wlan+缴阎,并且來源是uid為10042的,丟棄數(shù)據(jù)包简软。
執(zhí)行過程如果出現(xiàn):No chain/target/match by that name蛮拔, 可能就是你的rom不支持該操作了。
iptables需1.4+版本
內(nèi)核支持iptables操作痹升,所以并不是所有root的rom都支持的建炫。