论坛的各位小伙伴,大家是否还记得,在第二篇介绍防火墙发展历史的贴子中,我们提到了第三代防火墙,也就是状态检测防火墙。状态检测防火墙的出现是防火墙发展历史上里程碑式的事件,而其所使用的状态检测和会话机制,目前已经成为防火墙产品的基本功能,也是防火墙实现安全防护的基础技术。今天,强叔就和大家来聊一聊状态检测和会话。

首先,我们从状态检测防火墙产生的背景说起。请大家先看一个简单的网络环境,如下图所示,PC和Web服务器位于不同的网络,分别与防火墙相连,PC与Web服务器之间的通信受到防火墙的控制。

 

当PC需要访问Web服务器浏览网页时,在防火墙上必须配置如下的一条规则,允许PC访问Web服务器的报文通过。

 

在这条规则中,源端口处的*表示任意的端口,这是因为PC在访问Web服务器时,它的操作系统决定了所使用的源端口,例如,对于WINDOWS操作系统来说,这个值可能是1024~65535范围内任意的一个端口。这个值是不确定的,所以这里设定为任意端口。

配置了这条规则后,PC发出的报文就可以顺利通过防火墙,到达Web服务器。然后Web服务器将会向PC发送回应报文,这个报文也要穿过防火墙才能到达PC。在状态检测防火墙出现之前,包过滤防火墙还必须配置如下所示的规则2,允许反方向的报文通过。

 

在规则2中,目的端口也设定为任意端口,因为我们无法确定PC访问Web服务器时使用的源端口,要想使Web服务器回应的报文都能顺利穿过防火墙到达PC,只能将规则2中的目的端口设定为任意端口。

如果PC位于受保护的网络中,这样处理将会带来很大的安全问题。规则2将去往PC的目的端口全部开放,外部的恶意***者伪装成Web服务器,就可以畅通无阻地穿过防火墙,PC将会面临严重的安全风险。

接下来让我们看一下状态检测防火墙怎么解决这个问题。还是以上面的网络环境为例,首先我们还是需要在防火墙上设定规则1,允许PC访问Web服务器的报文通过。当报文到达防火墙后,防火墙允许报文通过,同时还会针对PC访问Web服务器的这个行为建立会话(Session),会话中包含了PC发出的报文信息,如地址和端口等。

当Web服务器回应给PC的报文到达防火墙后,防火墙会把报文中的信息与会话中的信息进行比对,发现报文中的信息与会话中的信息相匹配,并且符合协议规范对后续包的定义,则认为这个报文属于PC访问Web服务器行为的后续回应报文,直接允许这个报文通过,如下图所示。

 

而恶意***者即使伪装成Web服务器向PC发起访问,由于这类报文不属于PC访问Web服务器行为的后续回应报文,防火墙就不会允许这些报文通过。这样就解决了包过滤防火墙大范围开放端口带来的安全风险,同时也保证了PC可以正常访问Web服务器。

总结一下,包过滤防火墙只根据设定好的静态规则来判断是否允许报文通过,它认为报文都是无状态的孤立个体,不关注报文产生的前因后果。而状态检测防火墙的出现正好弥补了包过滤防火墙的这个缺陷,状态检测防火墙使用基于连接状态的检测机制,将通信双方之间交互的属于同一连接的所有报文都作为整体的数据流来对待。在状态检测防火墙看来,同一个数据流内的报文不再是孤立的个体,而是存在联系的。为数据流的第一个报文建立会话,数据流内的后续报文直接根据会话进行转发,提高了转发效率。

接着我们就来进一步了解一下会话,会话是通信双方的连接在防火墙上的具体体现,代表两者的连接状态,一条会话就表示通信双方的一个连接。防火墙上多条会话的集合就叫做会话表(Session table),先看一个标准的会话表项:

http  ×××:public --> public 1.1.1.1:2049-->2.2.2.2:80

我们重点介绍这个表项中的关键字段:http表示协议,1.1.1.1表示源地址,2049表示源端口,2.2.2.2表示目的地址,80表示目的端口。我们是如何区分源和目的呢?其实通过“-->”符号就可以直观区分,符号前面的是源,符号后面的是目的。

源地址、源端口、目的地址、目的端口和协议这五个元素是会话的重要信息,我们将这五个元素称之为“五元组”。只要这五个元素相同的报文即可认为属于同一条流,在防火墙上通过这五个元素就可以唯一确定一条连接。

需要注意的是,会话是动态生成的,但不是永远存在的。如果长时间没有报文匹配,则说明通信双方已经断开了连接,不再需要该条会话了。此时,为了节约系统资源,防火墙会在一段时间后删除会话,该时间称为会话的老化时间。

光说不练假把式,下面强叔就使用eNSP模拟器来搭建一个简单的网络环境,验证防火墙上的状态检测机制。网络拓扑如下:

 

防火墙上只配置了一条规则:允许PC访问Web服务器的报文通过。在PC上使用HttpClient程序访问Web服务器,发现可以成功访问:

 

在防火墙上使用display firewall session table命令查看会话表的信息,发现已经建立一条会话:

 

说明状态检测机制工作正常,防火墙收到Web服务器返回给PC的报文后,发现该报文可以匹配到该条会话,即使没有配置允许反方向报文通过的规则,防火墙也允许其通过。

最后,希望通过强叔的介绍,大家可以了解状态检测和会话机制,也希望大家要理论结合实际,多多使用eNSP模拟器动手配置。

 

强叔提问

给出如下一条会话,大家能指出里面的五元组信息吗?
telnet  ×××:public --> public 172.16.0.2:51870-->128.18.0.2:23