本節將介紹IpFwd和FirewallCmd兩個命令。
**1.IpFwd命令**
IpFwd命令比較簡單,主要是控制內核ipforward功能,其支持三個選項。
- status:用于判斷ipforward功能是否開啟。
- enable和disable:分別用于啟動和禁止ipforward功能。
上述功能借助TetherController控制對象來完成,其內部代碼非常簡單,就是通過讀寫/proc/sys/net/ipv4/ip_forward文件來實現對內核ipforward功能的管理。
>[info] **提示** 讀者可上網搜索/proc/sys/net/ipv4目錄下其他文件的作用。
**2.FirewallCmd命令**
FirewallCmd用于防火墻控制。它支持以下命令選項。
- enable和is_enabled:用于啟動防火墻和判斷防火墻是否已經啟動。
- set_interface_rule:針對單個或多個NIC設備設置防火墻規則。
- set_egress_source_rule和set_egress_dest_rule:基于源IP和目標IP地址設置防火墻。
- set_uid_rule:根據uid設置單個進程的防火墻。
下面重點介紹防火墻功能的啟動以及如果針對單個進程的設置防火墻規則。
(1)啟動防火墻
本節介紹enable和set_uid_rule。其中,enable將調用FirewallCtronller的enableFireWall函數,代碼如下所示。
**FirewallController.cpp::enableFirewall**
~~~
int FirewallController::enableFirewall(void) {
int res = 0;
// 先清空fw_INPUT/fw_OUTPUT/fw_FORWARD鏈中的規則
disableFirewall();
// 啟動防火墻就是設置Filter表中fw_INPUT/fw_OUTPUT/fw_FORWARD的目標為DROP和REJECT
res |= execIptables(V4V6, "-A", LOCAL_INPUT, "-j", "DROP", NULL);
res |= execIptables(V4V6, "-A", LOCAL_OUTPUT, "-j", "REJECT", NULL);
res |= execIptables(V4V6, "-A", LOCAL_FORWARD, "-j", "REJECT", NULL);
return res;
}
~~~
由上述代碼可知,當啟動防火墻時,filter表中三個用于防火墻控制的Chain的目標都改為DROP或REJECT,這樣系統就無法收發網絡數據包。圖2-19所示為筆者在Ubuntu機器上設置的規則。
:-: 
圖2-19 enable防火墻
圖2-19所示是利用Ubuntu機器模擬enableFirewall函數后的結果。防火墻啟動后,機器就無法連接網絡了。
讀者可能好奇,為什么enableFirewall的破壞作用如此之大?這是因為防火墻設置一般有兩種方法。
- 先允許整個系統都能上網,然后再單獨設置防火墻規則以禁止某些模塊連接網絡。
- 先禁止整個系統上網,然后再單獨設置防火墻規則以允許某些模塊能連接網絡。
由此可知,Android采用了第二種更為嚴厲的方式來設置防火墻。接下來的工作就需要設置各種防火墻規則以允許某些程序能夠上網了。本節討論如何為單個進程設置防火墻規則。
* * * * *
**提示** 采用Ubuntu來測試enableFirewall,因為模擬器和主機也使用socket通信,一旦啟動防火墻,主機就無法再使用adb shell來控制模擬器了。
* * * * *
(2)設置進程防火墻
本節介紹的針對單個應用程序設置其防火墻規則,是大部分軟件管家禁止某些應用程序上網的通用方法。代碼在setUidRule函數中,如下所示。
**FirewallController.cpp::setUidRule**
~~~
int FirewallController::setUidRule(int uid, FirewallRule rule) {
char uidStr[16];
sprintf(uidStr, "%d", uid);
const char* op;
if (rule == ALLOW) {
op = "-I";
} else {
op = "-D";
}
int res = 0;
res |= execIptables(V4V6, op, LOCAL_INPUT,"-m", "owner",
"--uid-owner", uidStr,"-j", "RETURN", NULL);
res |= execIptables(V4V6, op, LOCAL_OUTPUT, "-m", "owner",
"--uid-owner", uidStr,"-j", "RETURN", NULL);
return res;
}
~~~
該函數很簡單,就是調用正確的iptables命令,它們分別如下。
~~~
iptables-I FORWARD_INPUT-m owner--uid-owner uid-j RETURN
iptables-I FORWARD_OUTPUT-m owner--uid-owner uid-j RETURN
~~~
這里要特別指出的是,目前Android只能根據uid來區分進程。由于Android平臺允許不同應用程序共享同一個uid[^①]。多個應用程序共享同一個uid的情況下,如果用戶禁止了其中一個應用程序(軟件管家的防火墻控制允許用戶選擇是否禁止某個應用程序上網),則連帶其他的相關程序都不能上網,雖然用戶并沒有選擇禁止其他應用程序。
* * * * *
**提示** 筆者測試了360安全衛士,當出現上述關聯情況時,它能提醒用戶哪些關聯程序也會被一并禁止上網。
* * * * *
[^①]:參考《深入理解Android:卷Ⅱ》4.3.1節關于Android系統中UID/GID知識的介紹。
- 前言
- 第1章 準備工作
- 1.1 Android系統架構
- 1.2 工具使用
- 1.2.1 Source Insight的使用
- 1.2.2 Eclipse的使用
- 1.2.3 BusyBox的使用
- 1.3 本書資源下載說明
- 第2章 深入理解Netd
- 2.1 概述
- 2.2 Netd工作流程
- 2.2.1 main函數分析
- 2.2.2 NetlinkManager分析
- 2.2.3 CommandListener分析
- 2.2.4 DnsProxyListener分析
- 2.2.5 MDnsSdListener分析
- 2.3 CommandListener中的命令
- 2.3.1 iptables、tc和ip命令
- 2.3.2 CommandListener構造函數和測試工具ndc
- 2.3.3 InterfaceCmd命令
- 2.3.4 IpFwd和FirewallCmd命令
- 2.3.5 ListTtysCmd和PppdCmd命令
- 2.3.6 BandwidthControlCmd和IdletimerControlCmd命令
- 2.3.7 NatCmd命令
- 2.3.8 TetherCmd和SoftapCmd命令
- 2.3.9 ResolverCmd命令
- 2.4 NetworkManagementService介紹
- 2.4.1 create函數詳解
- 2.4.2 systemReady函數詳解
- 2.5 本章總結和參考資料說明
- 2.5.1 本章總結
- 2.5.2 參考資料說明
- 第3章 Wi-Fi基礎知識
- 3.1 概述
- 3.2 無線電頻譜和802.11協議的發展歷程
- 3.2.1 無線電頻譜知識
- 3.2.2 IEEE 802.11發展歷程
- 3.3 802.11無線網絡技術
- 3.3.1 OSI基本參考模型及相關基本概念
- 3.3.2 802.11知識點導讀
- 3.3.3 802.11組件
- 3.3.4 802.11 Service介紹
- 3.3.5 802.11 MAC服務和幀
- 3.3.6 802.11 MAC管理實體
- 3.3.7 無線網絡安全技術知識點
- 3.4 Linux Wi-Fi編程API介紹
- 3.4.1 Linux Wireless Extensions介紹
- 3.4.2 nl80211介紹
- 3.5 本章總結和參考資料說明
- 3.5.1 本章總結
- 3.5.2 參考資料說明
- 第4章 深入理解wpa_supplicant
- 4.1 概述
- 4.2 初識wpa_supplicant
- 4.2.1 wpa_supplicant架構
- 4.2.2 wpa_supplicant編譯配置
- 4.2.3 wpa_supplicant命令和控制API
- 4.2.4 git的使用
- 4.3 wpa_supplicant初始化流程
- 4.3.1 main函數分析
- 4.3.2 wpa_supplicant_init函數分析
- 4.3.3 wpa_supplicant_add_iface函數分析
- 4.3.4 wpa_supplicant_init_iface函數分析
- 4.4 EAP和EAPOL模塊
- 4.4.1 EAP模塊分析
- 4.4.2 EAPOL模塊分析
- 4.5 wpa_supplicant連接無線網絡分析
- 4.5.1 ADD_NETWORK命令處理
- 4.5.2 SET_NETWORK命令處理
- 4.5.3 ENABLE_NETWORK命令處理
- 4.6 本章總結和參考資料說明
- 4.6.1 本章總結
- 4.6.2 參考資料說明
- 第5章 深入理解WifiService
- 5.1 概述
- 5.2 WifiService的創建及初始化
- 5.2.1 HSM和AsyncChannel介紹
- 5.2.2 WifiService構造函數分析
- 5.2.3 WifiStateMachine介紹
- 5.3 加入無線網絡分析
- 5.3.1 Settings操作Wi-Fi分析
- 5.3.2 WifiService操作Wi-Fi分析
- 5.4 WifiWatchdogStateMachine介紹
- 5.5 Captive Portal Check介紹
- 5.6 本章總結和參考資料說明
- 5.6.1 本章總結
- 5.6.2 參考資料說明
- 第6章 深入理解Wi-Fi Simple Configuration
- 6.1 概述
- 6.2 WSC基礎知識
- 6.2.1 WSC應用場景
- 6.2.2 WSC核心組件及接口
- 6.3 Registration Protocol詳解
- 6.3.1 WSC IE和Attribute介紹
- 6.3.2 802.11管理幀WSC IE設置
- 6.3.3 EAP-WSC介紹
- 6.4 WSC代碼分析
- 6.4.1 Settings中的WSC處理
- 6.4.2 WifiStateMachine的處理
- 6.4.3 wpa_supplicant中的WSC處理
- 6.4.4 EAP-WSC處理流程分析
- 6.5 本章總結和參考資料說明
- 6.5.1 本章總結
- 6.5.2 參考資料說明
- 第7章 深入理解Wi-Fi P2P
- 7.1 概述
- 7.2 P2P基礎知識
- 7.2.1 P2P架構
- 7.2.2 P2P Discovery技術
- 7.2.3 P2P工作流程
- 7.3 WifiP2pSettings和WifiP2pService介紹
- 7.3.1 WifiP2pSettings工作流程
- 7.3.2 WifiP2pService工作流程
- 7.4 wpa_supplicant中的P2P
- 7.4.1 P2P模塊初始化
- 7.4.2 P2P Device Discovery流程分析
- 7.4.3 Provision Discovery流程分析
- 7.4.4 GO Negotiation流程分析
- 7.5 本章總結和參考資料說明
- 7.5.1 本章總結
- 7.5.2 參考資料說明
- 第8章 深入理解NFC
- 8.1 概述
- 8.2 NFC基礎知識
- 8.2.1 NFC概述
- 8.2.2 NFC R/W運行模式
- 8.2.3 NFC P2P運行模式
- 8.2.4 NFC CE運行模式
- 8.2.5 NCI原理
- 8.2.6 NFC相關規范
- 8.3 Android中的NFC
- 8.3.1 NFC應用示例
- 8.3.2 NFC系統模塊
- 8.4 NFC HAL層討論
- 8.5 本章總結和參考資料說明
- 8.5.1 本章總結
- 8.5.2 參考資料說明
- 第9章 深入理解GPS
- 9.1 概述
- 9.2 GPS基礎知識
- 9.2.1 衛星導航基本原理
- 9.2.2 GPS系統組成及原理
- 9.2.3 OMA-SUPL協議
- 9.3 Android中的位置管理
- 9.3.1 LocationManager架構
- 9.3.2 LocationManager應用示例
- 9.3.3 LocationManager系統模塊
- 9.4 本章總結和參考資料說明
- 9.4.1 本章總結
- 9.4.2 參考資料說明
- 附錄