Android上使用iptables一般做代理和app防火墻功能。
有幾個開源項目,推薦大家去googlecode上去找找:
droidwall:app網絡防火墻;
proxydroid:代理app,支持多種網絡協議;
以上軟件都需要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):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都支持的。