状态检测和会话机制补遗

在状态检测和会话机制一篇中,我们学习了状态检测的工作原理,了解了会话中包含的五元组信息。贴子发出后,强叔收到了小伙伴们提出的各种问题:防火墙会为那些协议的报文建立会话呢?会话中就只包含五元组信息吗?状态检测功能在所有网络环境都适用吗?为了解答这些问题,强叔写了本篇贴子,作为状态检测和会话机制的番外篇,和大家进一步探讨状态检测和会话机制。
如今的数据通信网络已经是全IP时代,防火墙处理的也都是IP报文。根据TCP/IP协议族模型,在IP协议中,我们常用的协议有TCP、UDP和ICMP协议。那么下面我们就分别来看一下,对于TCP、UDP以及ICMP协议的报文,防火墙是如何建立会话的。

TCP

首先来看一下TCP协议。我们都知道,建立一个TCP连接,通信双方需要三次握手:

 

判断一个TCP连接的主要标志就是SYN报文,我们也把SYN报文称为TCP连接的首包。对于TCP协议,防火墙只有收到SYN报文,并且SYN报文通过了包括安全策略在内的各项安全机制的检查后,才会建立会话,后续的TCP报文匹配会话直接转发。如果防火墙没有收到SYN报文,只收到了SYN+ACK或ACK等后续报文,是不会创建会话的,并且会将这些报文丢弃。
下面我们就祭出eNSP模拟器,在防火墙上模拟一个典型的TCP协议的会话:HTTP会话。网络拓扑如下:

 

PC访问Web服务器,然后在防火墙上使用display firewall session table verbose命令可以看到会话正常建立,这里我们使用了verbose参数,通过这个参数可以看到会话的更多信息:

 

除了我们上次介绍过的五元组信息之外,还有一些之前没见过的信息,我们简单介绍一下:

  • Zone:表示报文在安全区域之间流动的方向,图中的信息表示报文是从Trust区域流向Untrust区域。

  • TTL:表示该条会话的老化时间,这个时间到期后,这条会话也将会被清除。

  • Left:表示该条会话剩余的生存时间。

  • Interface:表示报文的出接口,报文从这个接口发出。

  • NextHop:表示报文去往的下一跳的IP地址,本网络拓扑中是Web服务器的IP地址。

  • MAC:表示报文去往的下一跳的MAC地址,本网络拓扑中是Web服务器的MAC地址。

  • <--packets:4 bytes:465:表示会话反方向上的报文统计信息,即Web服务器向PC发送报文的个数和字节数。

  • -->packets:7 bytes:452:表示会话正方向上的报文统计信息,即PC向Web服务器发送报文的个数和字节数。

在这里强叔要特意提一下,会话中“<--”和“-->”这两个方向上的报文统计信息非常重要,可以帮助我们定位网络故障。通常情况下,我们查看会话时发现只有“-->”方向有报文的统计信息,“<--”方向上的统计信息都是0,那就说明PC发往Web服务器的报文顺利通过了防火墙,而Web服务器回应给PC的报文没有通过防火墙,双方的通信是不正常的。有可能是防火墙丢弃了Web服务器回应给PC的报文、或者是防火墙与Web服务器之间的网络出现故障、或者是Web服务器本身出现故障。这样我们就缩小了故障的范围,有利于快速定位故障。当然,凡事都有例外,在特殊的网络环境中,如果其中一个方向的报文统计信息是0,双方的通信也有可能是正常的,这种特殊的网络环境是什么呢?这里先卖个关子,下面我们会讲到。

 

前面我们说过,如果防火墙没有收到SYN报文,只收到了SYN+ACK或ACK等后续报文,是不会创建会话的,并且会将这些报文丢弃。在正常情况下这样处理是没有问题的,但是在报文来回路经不一致的环境中,就会出现问题。

 

如上图所示,内部网络访问外部网络的报文直接通过路由器到达外部网络,而外部网络的回应报文,先经过路由器转发到防火墙,由防火墙处理后再转发到路由器,最后由路由器发送到内部网络。也就是防火墙无法收到SYN报文,只收到了SYN+ACK报文。这种通信双方交互的报文不同时经过防火墙的情况,叫做报文来回路经不一致。在这种网络环境中,防火墙收到SYN+ACK报文后,由于没有相应的会话,就会丢弃SYN+ACK报文,导致内部网络和外部网络之间的通信中断。
这种情况下该怎么办呢?别担心,防火墙早已经考虑到这个问题了,我们可以关闭防火墙的状态检测功能。关闭状态检测功能后,对于TCP协议,除了SYN报文之外,SYN+ACK、ACK报文就都可以建立会话了,这样就不会导致通信中断。
下面我们使用eNSP来模拟一个报文来回路径不一致的网络环境,我们让PC访问Web服务器的报文通过路由器直接到达Web服务器,让Web服务器回应给PC的报文将会先转发到防火墙,然后再发送到PC。网络拓扑如下:

 

 

首先执行如下命令,开启Trust安全区域到Untrust安全区域的安全策略,允许Web服务器回应给PC的报文通过:

firewall packet-filter default permit interzone trust untrust direction outbound

然后我们先不关闭状态检测功能,让PC访问Web服务器,发现无法成功访问,在防火墙上也无法查看到会话信息:

 

此时在防火墙上使用display firewall statistic system discard命令查看丢包的情况,发现存在Session miss丢包:

 

这表示防火墙因为无法找到会话而将报文丢弃。因为防火墙只收到了服务器回应的SYN+ACK报文,没有收到SYN报文,也就没有相应的会话,所以SYN+ACK报文被丢弃。
接下来我们使用undo firewall session link-state check命令关闭状态检测功能,然后再让PC访问Web服务器,发现可能访问成功,在防火墙上也可以查看到会话信息:

 

在会话信息中,“<--”方向的统计信息是0,只有“-->”方向存在统计信息,这就说明只有服务器回应的SYN+ACK报文经过了防火墙。由此我们得出结论,关闭状态检测功能后,防火墙收到SYN+ACK报文后也会建立会话,PC和Web服务器之间的通信不会中断。
在报文来回路径不一致的网络环境中,我们在防火墙上关闭状态检测功能后,会话中的一个方向上的报文统计信息是0,此时双方的通信也是正常的,这就是我们上面所说的特殊的网络环境。可见在实际的网络环境中,我们还是要具体情况具体分析。

UDP

接下来我们看一下UDP协议。UDP协议不同于TCP协议,它是没有连接状态的协议。对于UDP协议,防火墙收到UDP报文后,无论状态检测功能是开启还是关闭状态,只要UDP报文通过了包括安全策略在内的各项安全机制的检查,防火墙都会建立会话。

ICMP

然后是ICMP协议。一提到ICMP协议,我们首先就会想到Ping。Ping用来测试网络中的另一台设备是否可达,是我们在日常维护中经常会用到的操作。执行Ping操作的一方会发送Ping回显请求报文(Echo request),收到该请求报文后,响应一方会发送Ping回显应答报文(Echo reply)。
对于Ping报文,在开启状态检测功能时,防火墙只有收到Ping回显请求报文,并且Ping回显请求报文通过了包括安全策略在内的各项安全机制的检查后,才会建立会话;如果防火墙没有收到Ping回显请求报文,只收到了Ping回显应答报文,是不会创建会话的,并且会将Ping回显应答报文丢弃。在关闭状态检测功能时,防火墙收到Ping回显请求报文和Ping回显应答报文,都会创建会话。下面是在报文来回路径不一致的网络环境中,防火墙上关闭了状态检测功能后,Ping回显应答报文生成的会话信息:

 

而对于其他类型的ICMP报文,无论状态检测功能是开启还是关闭状态,只要这些报文通过了包括安全策略在内的各项安全机制的检查,防火墙都会转发报文,不建立会话。

最后我们再来总结一下防火墙对TCP、UDP和ICMP协议的报文创建会话的情况,如下表所示。当然,前提还是这些报文要通过防火墙上包括安全策略在内的各项安全机制的检查,然后才会创建会话。

 协议  开启状态检测功能  关闭状态检测功能
 TCP  SYN报文  创建会话,转发报文  创建会话,转发报文
 SYN+ACK、ACK报文  不创建会话,丢弃报文  创建会话,转发报文
 UDP  创建会话,转发报文  创建会话,转发报文
 ICMP  Ping回显请求报文  创建会话,转发报文  创建会话,转发报文
 Ping回显应答报文  不创建会话,丢弃报文  创建会话,转发报文
 其他ICMP报文  不创建会话,转发报文  不创建会话,转发报文

 

另外,还有一些特殊的报文,防火墙转发这些报文时不会创建会话,这些特殊的报文包括:

  • RAW IP(即IP Protocol字段没有值)报文不创建会话

  • OSPF、RIP和ISIS路由协议报文不创建会话

  • IGMP(组播)报文不创建会话

  • 二层模式下目的MAC为Unkown MAC而需要在VLAN内广播的报文不创建会话

通过上面的介绍,我们知道了防火墙在开启或者关闭状态检测功能的情况下,对TCP、UDP和ICMP协议报文的不同处理方式。相信大家对状态检测和会话机制有了进一步的了解,希望大家继续关注强叔侃墙系列连载贴。

你可能感兴趣的:(状态检测和会话机制补遗)