当前位置:操作系统 > Unix/Linux >>

理解防火墙及防火墙实例系列:部分1

理解防火墙及防火墙实例系列: 第一部分

  防火墙基本类型、概念以及各类防火墙的主要优缺点

  developerWorks

  

  级别: 初级

  宫一鸣, 中国电信网络安全小组核心成员

  2002 年 12 月 01 日

  本文将分为两部分,第一部分将介绍防火墙基本类型和概念,以及每类防火墙的主要优缺点,然后是选购配置防火墙的时候一些误区;第二部分将结合第一部分内容介绍unix下的防火墙软件ipfilter,包括该软件的介绍、安装、具体应用等。

  什么是防火墙

  对于企业的网络而言,未加特别安全保护而放置在internet上,危险性是显而易见的。随着决策层对安全认识的逐步加强,防火墙,作为一种应用非常广泛,技术相对比较成熟的网络安全产品也在不同的企业愈来愈多的得到了重视。然而一个现实的问题是目前关于防火墙的名词以及厂家基于商业目的宣称花样为数众多,这就给使用者选择和应用防火墙带来了一定的误解和困难。那么什么是防火墙,主要的防火墙之间如何区别呢?

  对于防火墙的概念,我们可以这样理解:防火墙是在两个网络间实现访问控制的一个或一组软件或硬件系统。防火墙的最主要功能就是屏蔽和允许指定的数据通讯,而该功能的实现又主要是依靠一套访问控制策略,由访问控制策略来决定通讯的合法性。

  那么如何理解种类众多的防火墙呢,下面来做个介绍。

  防火墙的类型

  如果我们从OSI分层模式来考察及分类防火墙,会比较容易的把握住防火墙的脉络,个人认为,目前主要的防火墙可以分为三类,它们分别是: 包过滤防火墙、基于状态的包过滤防火墙、应用代理(网关)防火墙,而由这三类防火墙可以推导和演绎出其它可能的变化。

  下面我们来逐一说明。

  包过滤防火墙

  首先,我们要提到的是最基本的报文过滤的防火墙,这个层次的防火墙通常工作在OSI的三层及三层以下,由此我们可以看出,可控的内容主要包括报文的源地址、报文的目标地址、服务类型,以及第二层数据链路层可控的MAC地址等。除此以外,随着包过滤防火墙的发展,部分OSI四层的内容也被包括进来,如报文的源端口和目的端口。

  本层次最常见的实际应用的例子就是互联网上的路由设备,比如常见的cisco路由器,使用者可以通过定制访问控制列(ACL)来对路由器进出端口的数据包进行控制,如针对rfc1918的保留地址进屏蔽,在路由器上可以进行如下配置:

  interface x

  ip access-group 101 in

  access-list 101 deny ip 10.0.0.0 0.255.255.255 any

  access-list 101 deny ip 192.168.0.0 0.0.255.255 any

  access-list 101 deny ip 172.16.0.0 0.15.255.255 any

  access-list 101 permit ip any any

  从上面这个例子可以很明显的看出,路由器这里的配置完全是针对OSI的三层ip地址,也就是ip的包头进行过滤,至于这些IP数据包里携带的具体有什么内容,路由器完全不会去关心。

  由此考虑一下,我们就不难看出这个层次的防火墙的优点和弱点:

  1. 基于报文过滤的防火墙一个非常明显的优势就是速度,这是因为防火墙只是去检察数据包的包头,而对数据包所携带的内容没有任何形式的检查,因此速度非常快。

  2. 还有一个比较明显的好处是,对用户而言,包过滤防火墙是透明的,无需用户端进行任何配置。

  包过滤防火墙的特性决定了它很适合放在局域网的前端,由它来完成整个安全工作环节中的数据包前期处理工作,如:控制进入局域网的数据包的可信任ip,对外界开放尽量少的端口等。与此同时,这种防火墙的弊端也是显而易见的,比较关键的几点包括:

  1. 由于无法对数据包及上层的内容进行核查,因此无法过滤审核数据包的内容。体现这一问题的一个很简单的例子就是:对某个端口的开放意味着相应端口对应的服务所能够提供的全部功能都被放开,即使通过防火墙的数据包有攻击性,也无法进行控制和阻断。比如针对微软IIS漏洞的Unicode攻击,因为这种攻击是走的防火墙所允许的80端口,而包过滤的防火墙无法对数据包内容进行核查,因此此时防火墙等同于虚设,未打相应patch的提供web服务的系统,即使在防火墙的屏障之后,也会被攻击者轻松拿下超级用户的权限。

  2. 由于此种类型的防火墙工作在较低层次,防火墙本身所能接触到的信息较少,所以它无法提供描述事件细致的日志系统,此类防火墙生成的日志常常只是包括数据包捕获时间,三层的ip地址,四层的端口等非常原始的信息。我们可以先把下面要讲的ipmon的软件的日志拿来看看

  Nov 23 14:13:05 y.y.y.y ipmon[10841]: 14:13:04.733237 hme0 @0:13 b x.x.x.x,4131 -> y.y.y.y,3389 PR tcp len 20 48 -S IN

  我们可以从上面看个大概,这个防火墙于仅仅记录了11月23日14点13分防火墙block了从ip地址x.x.x.x,端口4131来的,目的端口是 3389,目的ip是y.y.y.y的包头为20字节,净荷长度为28的数据包。至于这个数据包内容是什么,防火墙不会理会,这恰恰对安全管理员而言是至为关键的。因为即使一个非常优秀的系统管理员一旦陷入大量的通过/屏蔽的原始数据包信息中,往往也是难以理清头绪的,当发生安全事件时会给管理员的安全审计带来了很大的困难。

  3. 所有有可能用到的端口都必须静态放开,对外界暴露,从而极大的增加了被攻击的可能性,这个问题一个很好的例子就是unix下的危险的rpc服务,它们也工作在高端口,而针对这些服务的攻击程序在互联网上异常流行。

  4. 如果网络结构比较复杂,那么对管理员而言配置ACL将是非常恐怖的事情。当网络发展到一定规模时,ACL出错几乎是必然的,这一点相信许多大型站点的系统管理员印象深刻。

  基于状态的包过滤防火墙

  上面我们讲到的包过滤防火墙在具体实施的时候,管理员会遇到一些非常棘手的问题:网络上数据的传输是双向的,因此所有服务所需要的数据包进出防火墙的端口都要仔细的被考虑到,否则,会产生意想不到的情况。然而我们知道,当被防火墙保护的设备与外界通讯时,绝大多数应用要求发出请求的系统本身提供一个端口,用来接收到外界返回的数据包,而且这个端口一般是在1023到16384之间不定的,这就增加了设计控制访问规则的难度。这里我们可以捕获一次由 client到server的80端口访问的一些纪录来形象说明这个问题(截取的内容略有删节):

  17:48:52.513355 IP penetrat.1134 > server.80: S 1253142352:1253142352

  17:48:52.515991 IP server.80 > penetrat.1134: S 1867056172:1867056172 ack 1253142353

  17:48:52.516126 IP penetrat.1134 > server.80: . ack 1

  我们可以从上述内容中看到,client为了完成对server的www网络访问,需要打开一个本机端口用来接收回来的数据包,此处是1134。如果防火墙没有开放1134这个端口的话,client将无法收到回应的数据包。

  但是问题是由于系统和外界通讯的时候,本机的端口不是一定的,我们已经知道如果不放开这些端口,通讯将无法完成,那么只有一个方法,开放1023以上的全部端口,允许这些端口的数据包进出。这正是传统的包过滤型防火墙的做法。

  这样做的危害是明显的,为了通讯,把所有的高端端口开放,危害了配置防火墙的最小开放性原则。上面我们提到过攻击者很容易利用这些漏洞比如rpc等服务攻击防火墙后的系统。

  另一方面,由于普通的包过滤防火墙不能对数据传输状态进行判断,如收到ack数据包就想当然的认为这是一个建立的连接,从而对数据包放行,会带来一定的安全隐患。尤其当防火墙与IDS系统进行联动(目前商业产品中非常流行的做法)时,这会导致非常糟糕的状况,攻击者可能可以利用防火墙的这个弱点轻松的对目标系统进行拒绝服务攻击。

  此时,也许我们可以借助于基于状态的包过滤防火墙,这种防火墙在传统的包过滤防火墙的基础上增加了对OSI第四层的支持,同时,防火墙会在自身cache或内存中维护着一个动态的状态表,数据包到达时,对该数据包的处理方式将综合访问规则和数据包所处的状态进行。

  那么这个动态的状态表包括什么内容,又是如何产生的呢?这一点各个厂家实现的方式各有不同,但是一般而言,状态表的内容一般主要包括数据包的来源/目的ip 地址、来源/目的端口、时间、以及数据包的sequence number(对于tcp连结)、数据包的标志符等(对于tcp连结)。当有数据包到达防火墙时,这些参数将决定数据包是否在属于一个已经合法的 sessioin。如果防火墙接收到一个初始化tcp连接的带syn标志包,这个包会首先被防火墙的访问控制列检查,如果在检查了所有的控制规则后,该包都没有被接受,那么该次连接被拒绝;如果数据包符合某条访问控制规则,那么在状态表中一个新的session就被建立,后续的数据包状态如果与状态表内的 session内容不一致(如虽然目的端口一致,但源端口不一致),那么数据包将被直接丢弃;如果判断数据包属于状态表中已经联接的session,那么数据包往往就直接允许通过,不再和访问控制列内容进行比较;同时,在状态表中一个session建立后,内存中会维护对这个session的动态超时值,比如,当防火墙两端的系统建立了连结,在状态表中生成了一个session,如果后续的数据包在某个设定的超时后依然没有到达,则此次session被丢弃,这样就一方面提升了防火墙效率,另外一方面可以在一定程度上防止拒绝服务攻击。

  用上面的client访问 server的web例子来看的话:此时防火墙不需要在规则中打开
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,