1.5 状态检测和会话机制
在1.2节“防火墙的发展历史”一节中,我们提到了第三代防火墙,也就是状态检测防火墙。状态检测防火墙的出现是防火墙发展历史上里程碑式的事件,而其所使用的状态检测和会话机制,目前已经成为防火墙产品的基本功能,也是防火墙实现安全防护的基础技术。今天,强叔就和大家来聊一聊状态检测和会话机制。
1.5.1 状态检测
首先,我们从状态检测防火墙产生的背景说起。请大家先看一个简单的网络环境,如图1-17所示,PC和Web服务器位于不同的网络,分别与防火墙相连,PC与Web服务器之间的通信受到防火墙的控制。
图1-17 PC访问Web服务器组网示意图
当PC需要访问Web服务器浏览网页时,在防火墙上必须配置表1-1给出的编号为1的一条“规则”,允许PC访问Web服务器的报文通过。这里所说的“规则”,其实指的就是防火墙上的安全策略。只不过本节重点讲解状态检测和会话机制,安全策略不是重点,所以使用“规则”来简化描述,便于大家理解。关于安全策略的内容我们将在第2章《安全策略》中详细介绍。
表1-1 防火墙上配置规则1
在这条规则中,源端口处的ANY表示任意端口,这是因为PC在访问Web服务器时,它的操作系统决定了所使用的源端口。例如,对于Windows操作系统来说,这个值可能是1024~65535范围内任意的一个端口。这个值是不确定的,所以这里设定为任意端口。
配置了这条规则后,PC发出的报文就可以顺利通过防火墙,到达Web服务器。然后Web服务器将会向PC发送回应报文,这个报文也要穿过防火墙才能到达PC。在状态检测防火墙出现之前,包过滤防火墙上还必须配置表1-2所示的编号为2的规则,允许反方向的报文通过。
表1-2 防火墙上新增规则2
在规则2中,目的端口也设定为任意端口,因为我们无法确定PC访问Web服务器时使用的源端口,要想使Web服务器回应的报文都能顺利穿过防火墙到达PC,只能将规则2中的目的端口设定为任意端口。
如果PC位于受保护的网络中,这样处理将会带来很大的安全问题。规则2将去往PC的目的端口全部开放,外部的恶意攻击者伪装成Web服务器,就可以畅通无阻地穿过防火墙,PC将会面临严重的安全风险。
接下来让我们看一下状态检测防火墙怎么解决这个问题。还是以上面的网络环境为例,首先我们还是需要在防火墙上设定规则1,允许PC访问Web服务器的报文通过。当报文到达防火墙后,防火墙允许报文通过,同时还会针对PC访问Web服务器的这个行为建立会话(Session),会话中包含PC发出的报文信息如地址和端口等。
当Web服务器回应给PC的报文到达防火墙后,防火墙会把报文中的信息与会话中的信息进行比对。如果发现报文中的信息与会话中的信息相匹配,并且该报文符合HTTP协议规范的规定,则认为这个报文属于PC访问Web服务器行为的后续回应报文,直接允许这个报文通过,如图1-18所示。
图1-18 状态检测防火墙的报文交互过程
说明
为了便于描述,在本节中我们将PC和Web服务器与防火墙直接相连。实际环境中,如果PC、Web服务器与防火墙之间跨网络相连,则必须在防火墙上配置路由,保证PC和Web服务器两者相互路由可达。即使Web服务器回应给PC的报文已经匹配了会话,防火墙上也必须存在去往PC的路由,这样才能保证回应报文正常发送到PC。
恶意攻击者即使伪装成Web服务器向PC发起访问,由于这类报文不属于PC访问Web服务器行为的后续回应报文,防火墙就不会允许这些报文通过。这样既保证了PC可以正常访问Web服务器,也避免了大范围开放端口带来的安全风险。
总结一下,在状态检测防火墙出现之前,包过滤防火墙只根据设定好的静态规则来判断是否允许报文通过,它认为报文都是无状态的孤立个体,不关注报文产生的前因后果。这就要求包过滤防火墙必须针对每一个方向上的报文都配置一条规则,转发效率低下而且容易带来安全风险。
而状态检测防火墙的出现正好弥补了包过滤防火墙的这个缺陷。状态检测防火墙使用基于连接状态的检测机制,将通信双方之间交互的属于同一连接的所有报文都作为整体的数据流来对待。在状态检测防火墙看来,同一个数据流内的报文不再是孤立的个体,而是存在联系的。例如,为数据流的第一个报文建立会话,数据流内的后续报文就会直接匹配会话转发,不需要再进行规则的检查,提高了转发效率。
1.5.2 会话
接着我们就来进一步了解一下会话。会话是通信双方建立的连接在防火墙上的具体体现,代表两者的连接状态,一条会话就表示通信双方的一个连接。防火墙上多条会话的集合就叫作会话表(Session table),先看一个标准的会话表项。
http VPN:public-->public 192.168.0.1:2049-->172.16.0.1:80
我们重点介绍这个表项中的关键字段:
· http表示协议(此处显示的是应用层协议);
· 192.168.0.1表示源地址;
· 2049表示源端口;
· 172.16.0.1表示目的地址;
· 80表示目的端口。
是如何区分源和目的呢?其实通过会话表项中的“-->”符号就可以直观区分,符号前面的是源,符号后面的是目的。
源地址、源端口、目的地址、目的端口和协议这5个元素是会话的重要信息,我们将这5个元素称之为“五元组”。只要这5个元素相同的报文即可认为属于同一条流,在防火墙上通过这5个元素就可以唯一确定一条连接。
还有一些协议,它们的报文中没有端口信息,防火墙处理这些协议的报文时,如何生成会话表呢?比如ICMP协议,报文中不带端口信息,那么防火墙会把ICMP报文头中ID字段值作为ICMP会话的源端口,会以固定值2048作为ICMP会话的目的端口。又比如后面我们会讲到IPSec中的AH(Authentication Header,认证头)协议和ESP(Encapsulating Security Payload,封装安全载荷)协议,也不带有端口信息,防火墙会直接将这两个协议的会话中的源和目的端口都记录为0。
1.5.3 组网验证
光说不练假把式。下面强叔就使用eNSP模拟器来搭建一个简单的网络环境,验证防火墙上的状态检测机制。网络拓扑还是图1-17所示的组网。
说明
eNSP(Enterprise Network Simulation Platform)是一款由华为推出的免费的图形化网络设备仿真平台,主要对企业网路由器、交换机、防火墙等设备进行软件仿真,使您能够在没有真实设备的情况下也可以进行实验测试,学习网络技术。eNSP中提供了USG5000防火墙的仿真环境,目前已经支持大部分的安全功能,本书中主要使用eNSP来进行组网验证。
防火墙上只配置了表1-1所示的一条规则,允许PC访问Web服务器的报文通过。在PC上使用HttpClient程序访问Web服务器,发现可以成功访问。在防火墙上使用display firewall session table命令查看会话表的信息,发现已经建立一条会话,如下。
[FW]display firewall session table
Current Total Sessions : 1
http VPN:public-->public 192.168.0.1:2049-->172.16.0.1:80
上述信息说明状态检测机制工作正常,防火墙收到Web服务器返回给PC的报文后,发现该报文可以匹配到该条会话,即使没有配置允许反方向报文通过的规则,防火墙也允许其通过。
最后,希望通过强叔的介绍,大家可以了解状态检测和会话机制,也希望大家要理论结合实际,多多使用eNSP动手配置。