http://bbs.hikemobile.com/thread-1644-1-1.html
1、简介
Droidwall是一个关于网络防火墙的开源项目,其最大的功能在于控制应用进程的上网权限,核心功能实现是通过调用linux iptables命令。
2、功能
现Droidwall开源项目提供的功能:
1)分为两种模式,blacklist和whitelist,blacklist中文释义“黑名单”,禁用的进程;whitelist也即是允许能上网的进程。
2)管理有使用网络权限的进程,最核心的功能,当我们选择好所有的进程后点击menu中的应用规则,iptables就会对相应的进程进行管理。
3)log管理
4)显示规则
5)自定义用户脚本
3、实现原理3.1 iptables 简介
防火墙分为硬件和软件,硬件cisco netscreen 联想 天融信 ,软件Iptables 包过滤防火墙。
3.1.1 iptables功能
它最核心功能就是根据预设的规则对包进行过滤,达到保护网络安全的目的,以下是过滤包的简单示意图。
当一个网络封包要进入到主机之前,会先经由Filter表进行检查, 检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃 (DROP) 。
3.1.2 版本发展
根据linux
内核的发展,不同核心版本使用不同的防火墙软体
Version 2.0:使用 ipfwadm 这个防火墙机制;
Version 2.2:使用的是 ipchains 这个防火墙机制;
Version 2.4 与 2.6 :主要是使用 iptables 这个防火墙机制,不过在某些早期的 Version 2.4 版本亦同时支持 ipchains,好让用户仍然可以使用来自 2.2 版的 ipchains 的防火墙规则,现在基本上都是用iptables。
3.1.3相关命令
1)iptables表
首先从iptables
的名称说起,为什么称为ip"tables"
呢?
因为这个防火墙软件里面有多个表格 (table)
,每个表格都定义出自己的默认政策与规则。表格是怎么组织的?每个表格的组成单位就是“chain
”规则链,类似于表格中一行数据,每个规则链中定义了一些基本的规则类似于单元格,我们可以自定义规则链。 Linux
的 iptables
至少有三个表格,管理本机进出的 filter
、管理后端主机
的 nat
、
管理特殊旗标使用的 mangle (
较少使用)
。
1.1)filter:
主要跟 Linux
本机有关,这个是预设的
过滤表,以下是其包含的规则链
INPUT
:主要与封包想要进入我们 Linux
本机有关;
OUTPUT
:主要与我们 Linux
本机所要送出的封包有关;
FORWARD
:这个与Linux
本机比较没有关系,他可以封包『转递』到后端的计算机中,与 nat
这个 table
相关性很高。
1.2)nat:
这个表格主要在用作来源与目的之 IP
或 port
的转换,
与 Linux
本机较无关,主要与 Linux
主机后的局域网络内的计算机较有相关。以下是其包含的规则链
PREROUTING
:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING
:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT
:与发送出去的封包有关
1.3)mangle
:这个表格主要是与特殊的封包的路由旗标有关,
早期仅有 PREROUTING
及 OUTPUT
链,不过从 kernel 2.4.18
之后加入了 INPUT
及 FORWARD
链。
由于这个表格与特殊旗标相关性较高,所以像较少使用 mangle
这个表格。
表图
2)命令
这里简单介绍一些比较重要的命令,想知道所有的功能可以使用man
查看该命令。
ü 对于规则链的操作
-F 清楚所有规则
iptables -t filter -F INPUT
-X 清除所有自定义规则
-L 列出当前所有规则
iptables -L INPUT -n --line-number -vvv
-A 在所选链的尾加一条规则
-N定义子链
不能与已有的链同名,自定义时,最好先清空所有规则
|
ü 定义规则的操作
-j
指定规则所做动作
ACCEPT
接受
DROP
丢弃别人可以判断你的系统使用防火墙
REJECT
弹回
貌似根本没有打开这个端口
LOG
进行日志,/var/log/message
使用!号的时候
需要在两端加空格
表示取反
-p
进行协议进行匹配
[!] tcp
|udp
|icmp
协议列表以英文逗号为分隔符
如tcp,udp
协议前加!号表示取反
如-p
! tcp
根据端口进行匹配,
必须指定协议
必须是tcp|udp
--sport [!] port
包的源端口
--dport [!] port
包的目的端口
port
可以用/etc/services
中的协议名来代替
不指定此项,则暗示所用端口
,
连续的端口 20
:80
表示从20
到80
所用端口包括20
和80
:20 0
到20 80
:从80
到65535
!20
非20
端口
多端口匹配 -m multiport
如 iptables -A INPUT -p tcp -m multiport --sport 20,21,22,23,80
最多可以指定15
的端口,以英文逗号分隔,没有空格,使用是必须指定协议
-i
以包进入本地所使用的网络接口来匹配
-i
参数指定网卡,
适用于 INPUT
和PREROUGING
-o
参数指定网卡,
适用于 OUTPUT
和POSTROUGING
-o
以包离开本地所使用的网络接口来匹配
|
另外重点介绍-
-m
参数
1) 基于状态的匹配 -m state
NEW 初始包或源自于您的机器并要发送到目的IP的包都处于 NEW状态 分为OUTPUT和INPUT NEW包
ESTABLISHED 一旦连接看到两个方向上都有通信流,与此附加相关的其它包都被看作处于ESTABLISHED 状态 NEW和ESTABLISHED 之间的区别很重要
RELATED 是那些启动新连接,但有与当前现有连接相关的包。RELATED状态可以用于调整组成多重连接协议(如ftp)的连接,以及与现有连接相关的错误包(如与现有连接相关的 ICMP 错误包)
INVALID 这种包不会被自动废弃;因此您需要插入适当的规则,并设置链策略,以便可以正确处理这些包。
允许主动发出的包iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
2) 基于MAC地址的匹配-m mac 仅对于PREROUTING和INPUT链起作用
如: iptables -A INPUT -p tcp --dport 23 -m mac --mac-source00:0C:29:BC:BB
B -j REJECT
3) 基于封包数量的匹配 -m limit
允许每秒通过一个icmp包,默认触发条件是5个
iptables -A INPUT -p icmp -m limit --limit 1/s -j ACCEPT
超过部分全部拒绝
iptables -A INPUT -p icmp -j DROP
4)
基于UID,GID的限制-m owner
iptables -A OUTPUT -p tcp --dport 23-m owner --uid-owner 500 -j REJECT
iptables -A OUTPUT -p tcp --dport 23 -m owner –gid-owner 500 -jREJECT
注意:-m owner 仅仅输出的封包有用,这个在droidwall开源项目中有使用到。
3.2 android iptables rules设计
droidwall根据上面的规则和命令,在filter表中自定义了4个规则链droidwall、droidwall-3g、droidwall-wifi、droidwall-reject。
3.2.1 droidwall
该规则链非常重要,它定义了不同的网口执行不同的规则链
1
)规定与数据流量相关的网口的包执行droidwall-3g
规则链
iptables -A droidwall -o rmnet+ -j droidwall-3g
iptables -A droidwall -o pdp+ -j droidwall-3g
iptables -A droidwall -o ppp+ -j droidwall-3g
iptables -A droidwall -o uwbr+ -j droidwall-3g
iptables -A droidwall -o wimax+ -j droidwall-3g
iptables -A droidwall -o vsnet+ -j droidwall-3g
iptables -A droidwall -o ccmni+ -j droidwall-3g
iptables -A droidwall -o usb+ -j droidwall-3g
2
)规定与wifi
相关网口的包执行droidwall-wifi
规则链
iptables -A droidwall -o tiwlan+ -j droidwall-wifi
iptables -A droidwall -o wlan+ -j droidwall-wifi
iptables -A droidwall -o eth+ -j droidwall-wifi
iptables -A droidwall -o ra+ -j droidwall-wifi
3.2.2 droidwall-3g
该规则链中的规则,根据用户选择的进程添加对应的规则,iptables
命令怎么来限制进程,是通过传入uid
来进行限制的。在讲解iptables
命令时有提到,-m owner--uid-owner uid
,且该命令对于书包有效。例如要限制uid 1000
进程所有的包
iptables -A droidwall-3g -m owner --uid-owner 1000 -jdroidwall-reject
-A droidwall-3g
规则链中添加规则
-m owner --uid-owner 1000
表示当用户进程为1000
的包时执行-j
后面的规则
-j droidwall-reject
执行droidwall-reject
规则链,注意-j
后面跟的可能是一个具体的动作比如说
ACCEPT
、
DROP
等操作,也可以是一个规则链。
3.2.3 droidwall-wifi
该规则链中的规则定义与droiwall-3g
大同小异。
iptables -A droidwall-wifi -m owner --uid-owner 1000 -jdroidwall-reject
3.3.4 droidwall-reject
该规则链最简单,它做了些什么呢?下面来看看它添加了哪些规则
iptabales -A droidwall-reject -j REJECT
该规定的定义当执行droidwall-reject
规则链时,将包直接丢弃。
4、总结
droidwall
的核心实现原理就是基于iptables
对于包的过滤来实现的。应用进程需要上网就必须发送上网的请求包,iptables
根据设置的规则丢掉请求包,这些进程就没办法上网。