标签:
防火墙工作在网络边缘。
防火墙分类为软件防火墙和硬件防火墙。
软件防火墙的类型:
1. 包过滤型防火墙:主要在网络层和传输层实现(2,3,4层)。包过滤防火墙又分为两类。
1.1 简单包过滤防火墙,直接根据报文首部的某些属性作为匹配规则进行检测。匹配源IP,目标IP,源端口,目标端口等。
1.2 带状态检查的包过滤防火墙,简单包过滤无法追踪数据包的状态,这里的状态指的是连接状态,不是TCP有限状态自动机的状态。效率低于简单包过滤。
2. 应用层网关防火墙:工作在应用层,对特定的应用层协议做过滤(检查)。应用层防火墙不用关心源IP,目标IP等,直接检查应用层首部,甚至应用层数据本身。应用层防火墙检查实实在在的数据,所以安全性更高。源IP和目标IP等都是非常容易伪装的。但是应用层防火墙效率低,因为对内容的检测力度很大。而且要检查内容必须把传输层、网络层、链路层的首部都拆开,这也是降低效率的做法。
在Linux主机的内核态中维护了一张路由表。
当一个数据包到达时,在Linux内核态中,根据路由表查看该数据包是否是到达本机的,如果是,则把数据包留在本机,并送至用户态对应的进程中区。如果是从本机转发的,就由本机转发出去,从本机转发的数据表不到用户态,只在内核态逗留一下就从本机发出去了。
查看Linux路由表:
[root@redhat4 ~]# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 192.168.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 192.168.128.254 0.0.0.0 UG 0 0 0 eth0
当Linux主机向外发送请求时,请求必然也会达到内核中,检查路由表,如果访问的是外部地址,通过检查路由表信息可以确定从哪一块网卡出去。
要实现数据包的过滤(规则检测),首先要确定数据包的类型(流进、流出、转发),在查询完路由表之后就可以得知数据包的类型了。根据不同类型的数据包,放在不同的地方检查(这些检查点都在内核中)。
根据路由表查看完数据包的流向之后,就要对数据包进行检查了。
检查数据包需要多个验证规则,验证规则的次序很重要。
由以上分析可知,防火墙的设置全部在内核态中完成,而iptables是用户态的工具,iptables本身不是防火墙,而是用来写防火墙验证规则的工具。Iptables本身也要坚持用户写的验证规则,写错了iptables不会让规则生效。
Linux内核中提供了一个框架(framework),为处理数据包提供了基本的平台,这个框架叫做netfilter。
IPtables写规则,写完送到netfilter中的某个检测点(共5个)上,就可以实现数据包的检测了。
netfilter有五个钩子函数(hook函数,位置在上图红圈处,上图未画完):
1. 内核路由表检查完数据包流向后,数据包流向本机前,有一个钩子函数,把数据包吊起来检查是否有问题。
2. 内核路由表检查完数据包流向后,数据包经本机转发前,有一个钩子函数,把数据包吊起来检查是否有问题。
3. 内核路由表检查完数据包流向后,数据包经本机发出前,有一个钩子函数,把数据包吊起来检查是否有问题。
4. 数据包刚到达网卡时,过路由表前,用钩子把数据包吊起来,对数据包的目的IP地址(DNAT)、目标端口(实现负载均衡)等做转换。
5. 数据包过路由表后,出网卡前,用钩子把数据包吊起来,对数据包的源IP地址(SNAT)等做转换。
钩子函数作用于规则链上,与上述5个钩子函数对应的链以此如下:
1、 input规则链:检查进入计算机的数据包。
2、 output规则链:检查从计算机出去的数据包。
3、 forward规则链:检查经由计算机转发的数据包。
4、 prerouting规则链:进来的数据包刚到网卡时,做地址转换、访问限制等的规则链。
5、 postouting规则链:出去的数据包刚到网卡时,做地址转换、访问限制等的规则链。
防火墙的主要功能:
1. filter:过滤。
2. nat:地址转换。
3. mangle:不做过滤,不做地址转换,只改某一些首部格式。该功能在5个位置都可以。
4. raw(不重点讲)
以上四个功能有个特定称呼:表(table)。四个功能作用的链:
一个表(功能)上有多种链,每种链都有钩子函数守着。
数据包的匹配流程:
举例:
拒绝所有来自172.160.0.0的主机访问本机内部的web服务。
首先判断这是什么功能:拒绝访问,filter。Filter作用于三个链:input、output、forward。显然应该在input链上做。
写filter有两步:匹配条件、处理动作。
匹配条件:netfilter有很多检查模块,这些模块用于扩展netfilter匹配条件。当然Netfilter还有核心模块,即基本检测条件,检查源地址、目标地址等就属于核心模块。
Filter的处理动作:accept、drop(丢弃数据包,而且不告诉你为什么丢弃)、reject(丢弃数据包,同时向你回应拒绝的理由)。
除了上面介绍的5个链以外,我们可以自定义链。自定义的链是不能生效的,因为没有相应的钩子函数,为了使之生效,需要把自定义的链关联到默认链(input、output、forward、preruting、postrouting)上,让默认链调用自定义链。
标签:
原文地址:http://blog.csdn.net/chengonghao/article/details/51250906