网络管理和控制一直是一项比较复杂和专业的工作,由于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所示。
:-: ![iptables三要素的关系 ](https://box.kancloud.cn/bf291656ba4c38168ad3aee1a458ad67_1150x531.jpg =1150x531)
图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](https://box.kancloud.cn/6ebbd7e242b042cef1ee870b8f9cbf2b_1268x650.jpg =1268x650)
表2-1 iptables默认Table及Chain
由表2-1可知,有些Table的默认Chain具有相同的名字,导致我们理解起来有些困难。为此,读者必须结合图2-11所示的iptables数据包处理流程图来理解前述内容。由图可知,不同Table和Chain在此处理流程中起着不同的作用。
:-: ![](https://box.kancloud.cn/500fb159cbfe75231639ae30c7af21ce_412x691.jpg =412x691)
图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系统中网络数据的处理流程。
:-: ![](https://box.kancloud.cn/916df625ad6f6559fda7713685d230d5_1082x368.jpg =1082x368)
图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 参考资料说明
- 附录