1.1.3 状态检测与会话机制
前面介绍了安全策略的组成和配置方式,那么到达防火墙的流量是如何跟安全策略匹配的呢?在介绍匹配规则之前,我们首先介绍一下防火墙的状态检测和会话机制。
早期包过滤防火墙产品采取的是“逐包检测”机制,即对防火墙收到的所有报文都根据包过滤规则逐一检查,以决定是否放行该报文。如图1-4所示,PC(Personal Computer,个人计算机)和Web服务器分别位于防火墙的两侧,其通信由防火墙控制。我们希望PC可以访问Web服务器。
图1-4 PC访问Web服务器组网图
当PC向Web服务器发起访问时,防火墙上必须已经配置了序号为1的安全策略,允许符合此条件的报文通过防火墙。PC在访问Web服务器时使用的源端口可能是1024~65535范围内的任意一个端口。这个值是不确定的,所以这里设定为任意端口(any)。有了这条安全策略,PC发出的报文才能顺利通过防火墙,成功到达Web服务器。然后,Web服务器返回的响应报文也要穿过防火墙,才能到达PC。在包过滤防火墙上,用户还需要配置序号为2的安全策略,允许响应报文通过。同样的,由于PC的端口号是不确定的,这里的目的端口只能设置为任意端口。
这就意味着,序号为2的安全策略开放了PC的所有端口。攻击者只要伪装成Web服务器,就可以畅通无阻地穿过防火墙,访问PC上的任意服务。这必然带来极大的安全风险。此外,采用包过滤机制,防火墙要逐个检查每一个通过防火墙的报文,也严重影响了防火墙的转发效率。
为了解决这个问题,“状态检测防火墙”应运而生。我们仍以图1-4所示的组网为例,来看一下何谓“状态检测”。首先,我们还是要在防火墙上配置序号为1的安全策略,允许PC访问Web服务器,当PC访问Web服务器的报文到达防火墙时,防火墙检测安全策略,允许该报文通过。其次,防火墙为本次访问建立一个会话,会话中包含了本次访问的源/目的IP地址和源/目的端口等信息。会话是通信双方建立的连接在防火墙上的具体体现,代表双方的连接状态,一个会话就表示通信双方的一个连接。防火墙上多个会话的集合就是会话表(session table)。
[sysname] display firewall session table
Current Total Sessions : 1
http VPN:public --> public 10.1.1.10:2049-->10.1.2.10:80
从上面的会话表中,我们可以清楚地看到,防火墙上有一条HTTP(Hypertext Transfer Protocol,超文本传送协议)会话,会话的源IP地址为10.1.1.10,源端口为2049,目的IP地址为10.1.2.10,目的端口为80。源地址、源端口、目的地址、目的端口和协议这5个元素是会话的重要信息,我们将这5个元素称为“五元组”。这5个元素相同的报文即可被认为属于同一条流,在防火墙上通过这5个元素就可以唯一确定一条连接。
当Web服务器回复给PC的响应报文到达防火墙时,防火墙会把响应报文中的信息与会话中的信息进行比对。如果响应报文中的信息与会话中的信息相匹配,并且该报文符合HTTP规范的规定,就认为这个报文属于PC访问Web服务器行为的后续报文,直接允许这个报文通过。PC和Web服务器之间的后续报文都将匹配会话表转发,不再匹配安全策略。
采用状态检测机制以后,我们只需要为业务请求的发起方向配置安全策略,就不需要图1-4中序号为2的安全策略了。当攻击者伪装成Web服务器向PC发起访问时,攻击者发出的报文不属于PC访问Web服务器行为的响应报文,无法匹配会话表。同时防火墙上也没有开放Web服务器访问PC方向的安全策略,防火墙不会允许这些报文通过。这样,既保证了PC可以正常访问Web服务器,也避免了大范围开放端口带来的安全风险。
状态检测防火墙使用基于连接状态的检测机制,将通信双方之间交互的属于同一连接的所有报文都作为整体的数据流来对待。在状态检测防火墙看来,同一个数据流内的报文不再是孤立的个体,而是存在联系的。为数据流的第一个报文建立会话,数据流内的后续报文直接匹配会话转发,不需要再检查安全策略。这种机制极大地提升了安全性和防火墙的转发效率。
会话表是防火墙转发报文的重要依据,会话表中记录的信息也是定位防火墙转发问题的重要参考。在查看会话表的命令中使用verbose参数,可以看到会话的更多信息。
<sysname> display firewall session table verbose Current total sessions: 1 HTTP VPN: public --> public ID: a387f35dc86d0ca3624361940b0 Zone: trust --> untrust Slot: 11 CPU: 0 TTL: 00:15:00 Left: 00:14:51 Recv Interface: XGigabitEthernet0/0/3 Rev Slot: 12 CPU: 0 Interface: XGigabitEthernet0/0/4 NextHop: 10.1.2.1 <--packets: 30003 bytes: 4,488,438 --> packets: 15098 bytes: 3,113,948 10.1.1.10:2049 --> 10.1.2.10:80 PolicyName: No1 TCP State: fin-1
会话表中记录的关键信息如表1-2所示。
表1-2 会话表信息详解
上述信息中有两个重点信息需要说明一下,首先是会话的老化时间,即TTL。会话是动态生成的,但不是永远存在的。如果长时间没有报文匹配,就说明通信双方已经断开了连接,不再需要这个会话了。此时,为了节约系统资源,防火墙会在一段时间后删除会话,该时间被称为会话的老化时间。
老化时间的取值非常重要。如果某种业务会话的老化时间过长,就会一直占用系统资源,有可能导致其他业务的会话不能正常建立;会话的老化时间过短,有可能导致该业务的连接被防火墙强行中断,影响业务运行。华为防火墙已经针对不同的协议,设置了默认的老化时间,如ICMP(Internet Control Message Protocol,互联网控制报文协议)会话的老化时间是20秒,DNS会话的老化时间是30秒等。通常情况下采用这些默认值就可以保证各个协议正常运行。如果需要调整默认值,可以通过firewall session aging-time
命令来设置。例如,将DNS会话的老化时间调整为20秒。
[sysname] firewall session aging-time service-set dns 20
其次是报文统计信息,会话中“←”和“→”这两个方向上的报文统计信息非常重要,可以帮助我们定位网络故障。通常情况下,如果我们查看会话时发现只有“→”方向有报文的统计信息,“←”方向上的统计信息都是0,那就说明PC发往Web服务器的报文顺利通过了防火墙,而Web服务器回应给PC的报文没有通过防火墙,双方的通信是不正常的。有可能是防火墙丢弃了Web服务器回应给PC的报文,防火墙与Web服务器之间的网络出现故障,或者Web服务器本身出现故障。这样我们就缩小了故障的范围,有利于快速定位故障。