1.6 状态检测和会话机制补遗
在1.5“状态检测和会话机制”一节中,我们学习了状态检测的工作原理,了解到会话中包含的五元组信息。看过之后,各位读者可能会有疑问:防火墙的会话中就只包含五元组信息吗?防火墙会为哪些协议的报文建立会话呢?状态检测功能在所有网络环境下都适用吗?
作为上一节内容的补充,本节中强叔将继续和大家探讨状态检测和会话机制,揭示会话中的各种信息,总结防火墙在开启或者关闭状态检测的情况下对报文的处理方式,为大家答疑解惑。
1.6.1 再谈会话
还是从一个简单的网络环境开始,如图1-19所示,PC、Web服务器与防火墙直接相连,防火墙上已经将连接PC和Web服务器的接口加入到不同的安全区域,并且配置了规则允许PC访问Web服务器。
图1-19 PC访问Web服务器组网
PC访问Web服务器,业务正常。在防火墙上使用 display firewall session table verbose命令可以看到会话正常建立,我们在命令中使用了verbose参数,通过这个参数可以看到会话的更多信息,如下所示。
[FW]display firewall session table verbose
Current Total Sessions : 1
http VPN:public-->public
Zone: trust-->untrust TTL:00:00:10 Left:00:00:04
Interface: GigabitEthernet0/0/2 NextHop:172.16.0.1 MAC:54-89-98-fc-36-96
<--packets:4 bytes:465 -->packets:7 bytes:455
192.168.0.1:2052-->172.16.0.1:80
上述信息中,除了上次介绍过的五元组信息之外,还有一些之前没见过的信息,我们逐一介绍。
· Zone:表示报文在安全区域之间流动的方向,trust--> untrust表示报文是从Trust区域流向Untrust区域。
· TTL:表示该条会话的老化时间,这个时间到期后,这条会话也将会被清除。
· Left:表示该条会话剩余的生存时间。
· Interface:表示报文的出接口,报文从这个接口发出。
· NextHop:表示报文去往的下一跳的IP地址,本组网中是Web服务器的IP地址。
· MAC:表示报文去往的下一跳的MAC地址,本组网中是Web服务器的MAC地址。
· <--packets:4 bytes:465:表示会话反向方向上的报文统计信息,即Web服务器向PC发送报文的个数和字节数。
· -->packets:7 bytes:455:表示会话正向方向上的报文统计信息,即PC向Web服务器发送报文的个数和字节数。
上述信息中有两点需要说明一下。首先是会话的老化时间,即TTL。会话是动态生成的,但不是永远存在的。如果长时间没有报文匹配,则说明通信双方已经断开了连接,不再需要该条会话了。此时,为了节约系统资源,防火墙会在一段时间后删除会话。该时间称为会话的老化时间。
老化时间的取值非常重要,某种业务的会话老化时间过长,就会一直占用系统资源,有可能导致其他业务的会话不能正常建立;会话老化时间过短,有可能导致该业务的连接被防火墙强行中断,影响业务运行。华为防火墙已经针对不同的协议设置了相应的会话默认老化时间,比如ICMP的会话老化时间是20s, DNS的会话老化时间是30s等。通常情况下采用这些默认值就可以保证各个协议正常运行,如果需要调整默认值,可以通过firewall session aging-time命令来设置。例如,将DNS的会话老化时间调整为10s。
[FW]firewall session aging-time dns 10
网络中还有一种类型的业务,一条连接上的两个连续报文可能间隔时间很长,最具代表性的就是SQL数据库业务。用户查询SQL数据库服务器上的数据时,查询操作的时间间隔可能会远大于SQL数据库业务的会话老化时间,防火墙上该业务的会话老化之后,就会出现用户访问SQL数据库变慢或者无法继续查询的问题。
如果只靠延长这些业务所属协议的会话老化时间来解决这个问题,会导致一些同样属于这个协议,但是其实并不需要这么长的老化时间的会话长时间不能得到老化,占用了系统资源,影响其他业务。
为此,华为防火墙提供了“长连接”功能,通过ACL规则来识别报文,只有匹配ACL规则的特定报文的会话老化时间才会被延长。与单纯的通过调整协议的会话老化时间相比,长连接功能的控制粒度更加精确。默认情况下,应用了长连接功能的报文的会话老化时间是168h(相当长了吧!),当然这个时间也可以手动调整。
说明
目前仅支持对TCP协议类型的报文配置长连接功能。
对于长连接功能在安全区域或安全域间的配置,下面给出了在Trust安全区域与Untrust安全区域之间,针对192.168.0.1访问IP地址为172.16.0.2的SQL数据库报文配置长连接的示例。
[FW]acl 3000 [FW-acl-adv-3000]rule permit tcp source 192.168.0.1 0 destination 172.16.0.2 0 destination-port eq sqlnet [FW-acl-adv-3000]quit [FW]firewall interzone trust untrust [FW-interzone-trust-untrust]long-link 3000 outbound WARNING: Too large range of ACL maybe affect the performance of firewall, please use this command carefully! Are you sure? [Y/N]y
其次是报文统计信息,会话中“<--”和“-->”这两个方向上的报文统计信息非常重要,可以帮助我们定位网络故障。通常情况下,如果我们查看会话时发现只有“-->”方向有报文的统计信息,“<--”方向上的统计信息都是0,那就说明PC发往Web服务器的报文顺利通过了防火墙,而Web服务器回应给PC的报文没有通过防火墙,双方的通信是不正常的。有可能是防火墙丢弃了Web服务器回应给PC的报文,或者是防火墙与Web服务器之间的网络出现故障,或者是Web服务器本身出现故障。这样我们就缩小了故障的范围,有利于快速定位故障,当然,凡事都有例外,在特殊的网络环境中,如果其中一个方向的报文统计信息是0,双方的通信也有可能是正常的,这种特殊的网络环境是什么呢?这里先卖个关子,下面我们会讲到。
1.6.2 状态检测与会话创建
防火墙上的状态检测功能将属于同一个连接的报文都视为一个整体数据流,用会话来表示这条连接,具体是怎么实现的呢?这就要求防火墙能够分析各个协议的交互模式。以TCP协议为例,我们都知道,建立一个TCP连接,通信双方需要三次握手,如图1-20所示。
图1-20 TCP三次握手
判断一个TCP连接的主要标志就是SYN报文,我们也把SYN报文称为TCP连接的首包。对于TCP协议,防火墙只有收到SYN报文并且配置的规则允许SYN报文通过才会建立会话,后续的TCP报文匹配会话直接转发。如果防火墙没有收到SYN报文,只收到了SYN+ACK或ACK等后续报文,是不会创建会话的,并且会将这些报文丢弃。
在正常情况下这样处理是没有问题的,但是在某些特殊的网络环境中就会出现问题。如图1-21所示,内部网络访问外部网络的请求报文直接通过路由器到达外部网络,而外部网络的回应报文,先经过路由器转发到防火墙,由防火墙处理后再转发到路由器,最后由路由器发送到内部网络。也就是说,防火墙无法收到SYN报文,只收到了SYN+ACK报文。这种通信双方交互的报文不同时经过防火墙的情况,叫作报文来回路经不一致。
图1-21 报文来回路径不一致示意图
在这种网络环境中,防火墙收到SYN+ACK报文后,由于没有相应的会话,就会丢弃SYN+ACK报文,导致内部网络和外部网络之间的通信中断。这种情况下该怎么办呢?
别担心,防火墙早已经考虑到这个问题了,我们可以关闭状态检测功能。关闭状态检测功能后,防火墙就不会对连接的状态进行分析了,相当于回到了包过滤防火墙的时代,后续报文只要规则(安全策略)允许其通过,就可以转发并建立会话了,这样就不会导致通信中断。
注意
关闭状态检测功能将彻底改变防火墙的工作模式,本节仅以此为例介绍实现原理,在实际网络环境中除非有特殊的需求,否则请不要关闭状态检测功能。
下面我们就以报文来回路径不一致的环境为例,看一看防火墙在开启和关闭状态检测功能时对常用的TCP、UDP和ICMP协议报文的处理方式。
1.TCP
首先来看一下TCP协议。我们使用eNSP来模拟一个报文来回路径不一致的网络环境,我们让PC访问Web服务器的报文通过路由器直接到达Web服务器,让Web服务器回应给PC的报文将会先转发到防火墙,然后再发送到PC。网络拓扑如图1-22所示。
图1-22 TCP协议的报文来回路径不一致组网示意图
说明
为了构造来回路径不一致的环境,需要在路由器上配置策略路由,将Web服务器回应给PC的报文重定向至防火墙,关于策略路由的配置请参考路由器自带的文档。同时防火墙上还要配置去往PC的路由,下一跳为路由器上与防火墙接口GE0/0/1相连的接口地址,此处假设是10.1.2.2。
首先在防火墙上配置表1-3所示的规则,允许Web服务器回应给PC的报文通过。
表1-3 允许Web服务器回应给PC的报文通过的规则
然后先不关闭状态检测功能,让PC访问Web服务器,发现无法成功访问,如图1-23所示。
图1-23 PC无法访问Web服务器
在防火墙上也无法查看到会话信息。
[FW]display firewall session table
Current Total Sessions : 0
此时在防火墙上使用display firewall statistic system discard命令查看丢包的情况,发现存在Session miss丢包。
[FW]display firewall statistic system discard Packets discarded statistic Total packets discarded: 8 Session miss packets discarded: 8
这表示防火墙因为无法找到会话而将报文丢弃。因为防火墙只收到了服务器回应的SYN+ACK报文,没有收到SYN报文,也就没有相应的会话,所以SYN+ACK报文被丢弃。
接下来我们使用undo firewall session link-state check命令关闭状态检测功能。
[FW]undo firewall session link-state check
然后再让PC访问Web服务器,发现可能访问成功,在防火墙上也可以查看到会话信息。
[FW]display firewall session table verbose Current Total Sessions : 1 tcp VPN:public-->public Zone: untrust-->trust TTL:00:00:10 Left:00:00:10 Interface: GigabitEthernet0/0/1 NextHop:10.1.2.2 MAC:54-89-98-e4-79-d5 <--packets:0 bytes:0 -->packets:5 bytes:509 172.16.0.1:80-->192.168.0.1:2051
在会话信息中,“<--”方向的统计信息是0,只有“-->”方向存在统计信息,这就说明只有服务器回应的SYN+ACK报文经过了防火墙。由此我们得出结论,关闭状态检测功能后,防火墙收到SYN+ACK报文后也会建立会话,PC和Web服务器之间的通信不会中断。
在报文来回路径不一致的网络环境中,我们在防火墙上关闭状态检测功能后,会话中的一个方向上的报文统计信息是0,此时双方的通信也是正常的,这就是我们上面所说的特殊的网络环境。可见在实际的网络环境中,我们还是要具体情况具体分析。
2.UDP
接下来我们看一下UDP协议。UDP协议不同于TCP协议,它是没有连接状态的协议。对于UDP协议,防火墙收到UDP报文后,无论状态检测功能是处于开启还是关闭状态,只要防火墙上配置的规则允许UDP报文通过,防火墙就会建立会话。
3.ICMP
最后来看一下ICMP协议。一提到ICMP协议,我们首先就会想到Ping。Ping常用来测试网络中另一台设备是否可达,是我们在日常维护中经常会用到的操作。执行Ping操作的一方会发送Ping回显请求报文(Echo request),收到该请求报文后,响应一方会发送Ping回显应答报文(Echo reply)。
对于Ping报文,在开启状态检测功能时,防火墙只有收到Ping回显请求报文,并且防火墙上配置的规则允许Ping回显请求报文通过,才会建立会话。如果防火墙没有收到Ping回显请求报文,只收到了Ping回显应答报文,是不会创建会话的,并且会将Ping回显应答报文丢弃。在关闭状态检测功能时,防火墙收到Ping回显请求报文和Ping回显应答报文,都会创建会话。
下面是在报文来回路径不一致的网络环境中,防火墙上关闭了状态检测功能后,Ping回显应答报文生成的会话信息。
[FW]display firewall session table verbose Current Total Sessions : 1 icmp VPN:public-->public Zone: untrust-->trust TTL:00:00:20 Left:00:00:11 Interface: GigabitEthernet0/0/1 NextHop:10.1.2.2 MAC:54-89-98-e4-79-d5 <--packets:0 bytes:0 -->packets:1 bytes:60 172.16.0.1:2048-->192.168.0.1:45117
而对于其他类型的ICMP报文,无论状态检测功能是开启还是关闭状态,只要防火墙上配置的规则允许这些报文通过,防火墙都会转发报文,不建立会话。
最后我们再来总结一下防火墙对TCP、UDP和ICMP协议的报文创建会话的情况,如表1-4所示。当然,前提还是防火墙上配置的规则允许这些报文通过,然后才能进行表中的处理。
表1-4 TCP、UDP和ICMP协议创建会话情况
通过上面的介绍,我们清楚了会话中的各种信息,知道了防火墙在开启或者关闭状态检测功能的情况下,对TCP、UDP和ICMP协议报文的不同处理方式,相信大家对状态检测和会话机制也有了进一步的了解。下节我们将介绍安全区域、状态检测、会话机制的配置注意事项和故障排除指导。