Droidwall原理简析

来源:互联网 发布:thinkphp源码 编辑:程序博客网 时间:2024/06/04 18:58
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功能
    它最核心功能就是根据预设的规则对包进行过滤,达到保护网络安全的目的,以下是过滤包的简单示意图。
one.png
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 这个表格。

two.png
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 进行协议进行匹配
  [!] tcpudpicmp   协议列表以英文逗号为分隔符 tcp,udp 协议前加!号表示取反 如-p tcp
 
根据端口进行匹配, 必须指定协议 必须是tcp|udp
  --sport   [!]  port    包的源端口
  --dport  [!]  port 包的目的端口
  port 可以用/etc/services 中的协议名来代替  不指定此项,则暗示所用端口   连续的端口  2080表示从2080所用端口包括2080 20 020  80:从8065535 20 20端口
  多端口匹配  -m multiport     iptables -A INPUT -p tcp -m  multiport --sport   20,21,22,23,80  最多可以指定15的端口,以英文逗号分隔,没有空格,使用是必须指定协议
 
-i  以包进入本地所使用的网络接口来匹配
   -i 参数指定网卡,适用于 INPUTPREROUGING
   -o 参数指定网卡,适用于 OUTPUTPOSTROUGING
  -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:BBB -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根据设置的规则丢掉请求包,这些进程就没办法上网。
原创粉丝点击