Droidwall原理简析

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功能
    它最核心功能就是根据预设的规则对包进行过滤,达到保护网络安全的目的,以下是过滤包的简单示意图。
Droidwall原理简析_第1张图片
2013-1-22 17:00 上传
下载附件 (85.1 KB)
当一个网络封包要进入到主机之前,会先经由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相关命令
1iptables
   首先从iptables 的名称说起,为什么称为ip"tables" 呢? 因为这个防火墙软件里面有多个表格 (table) ,每个表格都定义出自己的默认政策与规则。表格是怎么组织的?每个表格的组成单位就是“chain ”规则链,类似于表格中一行数据,每个规则链中定义了一些基本的规则类似于单元格,我们可以自定义规则链。 Linux iptables 至少有三个表格,管理本机进出的 filter 、管理后端主机  nat 管理特殊旗标使用的 mangle ( 较少使用)
1.1filter 主要跟 Linux 本机有关,这个是预设的 过滤表,以下是其包含的规则链
INPUT :主要与封包想要进入我们 Linux 本机有关;
OUTPUT :主要与我们 Linux 本机所要送出的封包有关;
FORWARD :这个与Linux 本机比较没有关系,他可以封包『转递』到后端的计算机中,与 nat 这个 table 相关性很高。
1.2nat 这个表格主要在用作来源与目的之 IP port 的转换, Linux 本机较无关,主要与 Linux 主机后的局域网络内的计算机较有相关。以下是其包含的规则链
PREROUTING :在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING :在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT :与发送出去的封包有关
1.3mangle :这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT FORWARD 链。 由于这个表格与特殊旗标相关性较高,所以像较少使用 mangle 这个表格。

Droidwall原理简析_第2张图片
2013-1-22 17:00 上传
下载附件 (94.38 KB)
表图
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 根据设置的规则丢掉请求包,这些进程就没办法上网。

你可能感兴趣的:(Droidwall原理简析)