網絡管理和控制一直是一項比較復雜和專業的工作,由于Linux系統中原本就有一些強大的網絡管理工具,故Netd也毫不猶豫充分利用了它們。目前Netd中最依賴三個網絡管控工具,即iptables、tc和ip。
**1. iptables命令[7][8][9]**
iptables是Linux系統中最重要的網絡管控工具。它與Kernel中的netfilter模塊配合工作,其主要功能是為netfilter設置一些過濾(filter)或網絡地址轉換(NAT)的規則。當Kernel收到網絡數據包后,將會依據iptables設置的規則進行相應的操作。舉個最簡單的例子,可以利用iptables設置這樣一條防火墻規則:丟棄來自IP地址為192.168.1.108的所有數據包。
(1)iptables原理
iptables的語法比較復雜,但工作原理較易理解。清楚iptables的前提是理解它的表(Table)、鏈(Chain)和規則(Rule)。三者關系如圖2-10所示。
:-: 
圖2-10 iptables三要素關系
由圖2-10可知:
- iptables內部(其實是Kernel的netfilter模塊)維護著四個Table,分別是filter、nat、mangle和raw,它們對應著不同的功能,稍后將詳細介紹它們的作用。
- Table中定義了Chain。一個Table可以支持多個Chain,Chain實際上是Rule的集合,每個Table都有默認的Chain。例如filter表默認的Chain有INPUT、OUTPUT、FORWARD。用戶可以自定義Chain,也可修改Chain中的Rule。稍后將介紹不同Table中默認Chain方面的知識。
- Rule就是iptables工作的規則。首先,系統將檢查要處理的數據包是否滿足Rule設置的條件,如果滿足則執行Rule中設置的目標(Target),否則繼續執行Chain中的下一條Rule。
由前述內容可知,iptables中的Table和Chain是理解iptables工作的關鍵。表2-1總結了iptables中默認Table及Chain的相關內容。
:-: 
表2-1 iptables默認Table及Chain
由表2-1可知,有些Table的默認Chain具有相同的名字,導致我們理解起來有些困難。為此,讀者必須結合圖2-11所示的iptables數據包處理流程圖來理解前述內容。由圖可知,不同Table和Chain在此處理流程中起著不同的作用。
:-: 
圖2-11 iptables數據包處理流程
(2)iptables Target和常用參數
iptables中的Rule有四個默認定義的Target,如下。
- ACCEPT:接收數據包。
- DROP:直接丟棄數據包。沒有任何信息會反饋給數據源端。
- RETURN:返回到調用Chain,略過后續的Rule處理。
- QUEUE:數據返回到用戶空間去處理。
>[info] **提示** iptables的擴展Target還支持REJECT。相比DROP而言,REJECT會發送反饋信息給數據源端,如主機不可達之類(icmp-host-unreachable)的信息。目前只有INPUT、OUTPUT、FORWARD以及被這三個鏈調用的自定義鏈支持REJECT。
iptables有很多參數,此處先介紹一些常用參數。
~~~
-t:指定table。如果不帶此參數,則默認為filter表。
-A,--append chain rule-specification:在指定Chain的末尾添加一條Rule,rule-specification指明該Rule的內容。
-D,--delete chain rule-specification:刪除指定Chain中滿足rule-specification的那條Rule。
-I,--insert chain[rule num]rule-specification:為指定Chain插入一條Rule,位置由rule num指定。如果沒有該參數,則默認加到Chain-N:創建一條新Chain。
-L,--list:顯示指定Table的Chain和Rule的信息。
~~~
Rule-specification描述該Rule的匹配條件以及目標動作,它也有一些參數來指明這些信息。
~~~
-i:指定接收數據包的網卡名,如eth0、eth1等。
-o:指定發出數據包的網卡名。
-p:指定協議,如tcp、udp等。
-s,--source address[/mask]:指定數據包的源IP地址。
-j,--jump target:跳轉到指定目標,如ACCEPT、DROP等。
~~~
以前文提到的設置防火墻為例,其對應的iptables設置參數如下。
~~~
iptables-t filter-A INPUT-s 192.168.1.108-j DROP
~~~
如果僅攔截協議為tcp的數據包,則相應參數如下。
~~~
iptables-t filter-A INPUT-p tcp-s 192.168.1.108-j DROP
~~~
另外,iptables僅支持IPv4,如果需針對IPv6進行相應設置,則要使用ip6tables工具。
>[info] **提示** iptables的用法非常靈活,如果沒有長期的使用經驗,將很難理解它們的真正作用。
2. tc命令[10][11][12][13]
TC是Traffic Control的縮寫。在Linux系統中,流量控制是通過建立數據包隊列(Queue),并控制各個隊列中數據包的發送方式來實現的。Linux流量控制的基本原理如圖2-12所示,該圖描述了Linux系統中網絡數據的處理流程。
:-: 
圖2-12 網絡數據處理流程
由圖2-12可知:
- 接收包從輸入接口(Input Interface)進來后,將經過輸入流量限制(Ingress Policing)以丟棄不符合規定的數據包。而符合規定的數據包則交給輸入多路選擇器(Input De-Multiplexing)進行判斷選擇。
- 輸入多路選擇器的選擇結果是,如果數據包的目的是本機,將該包送給上層處理,否則需要將數據包交到轉發塊(Forwarding Block)去處理。轉發塊同時也接收來自本機上層(TCP、UDP等)產生的包。
- 轉發塊通過查看路由表,決定處理包的下一跳目的地。然后,轉發塊對數據包進行排列整合以便將它們送到對應的輸出接口(Output Interface)。
一般而言,我們只能限制本機網卡往外發送的數據包,而不能限制網卡接收的數據包。Linux中的流量控制就是在數據包通過輸出接口時,通過改變發送次序等方式來實現控制傳輸速率的。
* * * * *
**提示** 也可通過IFB設備在輸入接口進行流量控制。相關內容見2.3.3節。
* * * * *
在具體實現中,系統會建立許多隊列及對應的隊列規則(queuing discipline,簡稱qdisc)。目前系統包括的qdisc分為兩類。
- **無分類的隊列規則(Classless qdisc)**:該規則對進入網卡的數據包不加區分,統一對待。使用這種規定的處理能夠對數據包重新編排、延遲或丟棄。簡而言之,這種類型是針對整個網卡的流量進行調整。常用的qdisc如下。
- fifo(First In First Out,先進先出隊列):最簡單的控制。
- SFQ(Stochastic Fairness Queuing,隨機公平隊列):對發送會話進行重排,這樣每個發送會話都可以公平地發送數據)。
- RED(Random Early Detection,前向隨機丟包):用于模擬流量接近帶寬限制時丟包的情況。
- TBF(Token Bucket Filter,令牌桶過濾器):可較好地使得流量減低到預設值。適合高帶寬的環境。這類qdisc使用的流量控制手段主要是排序、限速和丟包。
- 分類的隊列規定(Classfull qdisc):它對進入網絡設備的數據包根據不同的需求以分類的方式區分對待。數據包進入一個分類的隊列后,它就需要被送到某一個類中進行分類處理。對數據包進行分類的工具是過濾器(filter)。過濾器會返回一個決定,qdisc根據該決定把數據包送入相應的類進行排隊。一個類可以包含多個子類,每個子類可再次使用它們的過濾器進行進一步的分類。當所有分類都處理完后,數據包才進入該類對應的隊列排隊。
簡單言之,如果要利用tc進行流量控制,其主要工作將包含建立隊列、建立分類和建立過濾器三個方面,一般的步驟如下。
- 1)針對網絡物理設備(如以太網卡eth0)綁定一個隊列QDisc;
- 2)在該隊列上建立分類class;
- 3)為每一分類建立一個基于路由的過濾器filter;
- 4)最后與過濾器相配合,建立特定的路由表。
* * * * *
**提示** tc命令所涉及的流量控制方面的知識相當復雜,感興趣的讀者可根據章末列出的參考資料做進一步的深入研究。
* * * * *
3. p命令[14]
ip命令是Linux系統中另一個強大的網絡管理工具,主要功能如下。
- 可替代ifconfig命令。即通過ip工具可管理系統中的網絡接口,包括配置并查看網絡接口情況、使能或禁止指定網絡接口。
- 可替代route命令。即ip工具支持設置主機路由、網絡路由、網關參數等。
- 可替代arp命令。即ip工具支持查看、修改和管理系統的ARP緩存等。
ip命令的語法為:
~~~
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]
~~~
例如為網絡設備進行配置的ip命令語法如下:
~~~
ip addr[add|del]IFADDR dev STRING
//接口eth0賦予地址192.168.0.1,掩碼是255.255.255.0(24代表掩碼中1的個數)
//廣播地址是192.168.0.255
ip addr add 192.168.0.1/24 broadcast 192.168.0.255 label eth0 dev eth0
~~~
* * * * *
**提示** 本節對Linux系統中常用的三個網絡管理工具iptables、tc和ip命令進行了一些簡單介紹。其中,iptables用于管理數據包過濾、NAT等方面的工作。tc用于流量控制,其背后涉及的知識較為復雜。ip命令可替代ifconfig、route和arp等命令。ip命令的路由控制示例將在2.3.3節介紹。
* * * * *
- 前言
- 第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 參考資料說明
- 附錄