现在IP网络里面离不开TCP、UDP这两种传输层协议,主流应用都基于这两种协议来做封装传输,对于TCP来说,在发送实际数据的时候必须先建立可靠的连接,俗称 ”三次握手”,而UDP则不需要建立连接,它有数据就直接发送出去。当然除了这些协议以外,网络层用的比较多的ICMP、ESP、OSPF、BGP等协议,这就要求防火墙能够分析各种协议的交互模式,能够准确的识别并且建立会话信息,我们来了解了解这些常见主流协议的会话建立,对于后续排错是很有帮助的。
上面说过TCP的建立需要双方进行三次会话交流,也就是“三次握手”的过程,我们来看防火墙是如何建立会话的。
对于一个正常的网络构建TCP建立,首先进行三次握手
(1)Client发送SYN(序列号假设为a),防火墙收到这个报文后会检查是否符合TCP协议规范,并且看安全策略是否允许该报文通过,通过后开始建立会话信息,并且实时关注后续的建立过程。
(2)服务器回应,发送SYN+ACK(seq=b,ack=a+1),其中ack用于确认已经收到来自于Client的SYN,表示已经收到了,服务器也会发送SYN来与Client进行建立同步会话,这里序列号为b
(3)防火墙收到这个报文后检查会话表发现是来自于刚建立(1)会话表的同一个会话,直接允许通过,Client收到后,回应服务器一个ack(b+1),表示已经收到了,发送出去,防火墙发现整个TCP会话建立已经完成,会把TCP的状态变成established,表示整个TCP建立完成,等待实际数据发送。
结合抓包跟状态表查看就是
首先Client 192.168.1.1往192.168.2.1发送SYS,seq=0,服务器收到后回应ACK1(对应Client发过来的SYN的seq=0+1),并且也同时发送一个SYN给客户端seq=也是0,客户端收到后直接回复ACK=1(对应服务器发送过来的SYN),最终会话建立,开始发送HTTP实际访问。
总结:TCP连接的首发标志就是SYN报文,防火墙在状态检测开启的情况下,在收到TCP的SYN首包情况并且安全策略允许的情况下就会创建会话信息。
UDP对于TCP来说就简单很多了,它是没有连接状态的协议,在防火墙上面的话则只要安全策略允许通过,则会直接创建会话信息。
ICMP的类型非常多,我们常用的比如ping、tracert都属于ICMP范围,ping的话有两种主要的类型,一个是echo request(回显请求报文)、一个是echo replay(回显应答报文),在状态开启的情况下,防火墙收到来自于echo request(回显请求报文),并且安全策略允许的情况下,就会建立会话,如果防火墙没有收到ping的回显请求,却收到了ping的回应报文,那么会话是不会建立的,直接丢弃。
这里注意下,ICMP是网络层协议,没有端口号的,但是防火墙会把ICMP报头中的序列号字段作为源端口号,以固定值2048作为会话的目的端口号。
正常情况下,数据包的来回路径是保持一致的,这样是很正常,但是也存在特殊的环境,比如跨运营商或者是网络规划以及配置上的失误导致了来回路径不一致的情况出现,那么出现了这种情况,会遇到什么样的问题呢?(这个也是第五篇最后提的一个问题),我们来实际验证下。
难度一点的,这个环境实现其实比较简单的,防火墙策略全放,然后写静态去往server1指向ISP2,而回Client的流量边界指向ISP1,这样就来回路径不一致了,但是这个有点太繁琐了,所以博主这里比较推荐大家用一个简单点的拓扑。
PC去往服务器的时候直接通过路由器抵达,而返回的数据包,则路由器利用策略路由特性强制它交给防火墙,防火墙在写192.168.1.1的路由指向10.1.1.1交给路由器,形成一个路径不一致的环境,策略可以全放。(具体步骤就不在给出了,购买课程了的朋友可以直接看视频讲解,留言处有环境源文件提供,都可以直接参考)
实际测试下(分别抓取E0/0/1以及G1/0/0 10.1.2.2接口的包,这里图上面显示错误了,实际G1/0/0在上面 G1/0/1是下面的口)
首先客户的发起访问,这个结果肯定是失败的。
可以发现,路由器上面能够看到客户端发起的SYN建立,以及服务器回应的SYN+ACK,而防火墙上面只收到了SYN+ACK。
(1)Client1发起TCP首包SYN建立,交给路由器处理
(2)路由器查询路由表直接丢给Server1
(3)Server1回应SYN+ACK,在路由器返回的时候,由于对接服务器的接口调用了策略路由,它会把这个数据包强制的交给10.1.2.2处理,这个时候防火墙收到后发现会话表并没有存在该数据包的匹配信息,而且这个包不是TCP的首发SYN包,则直接丢弃。
导致这个丢弃的原因我们在上面已经深入了解了防火墙对于TCP建立会话的前提条件就是收到的包必须是首发SYN的包,而这里防火墙收到的是首发是SYN+ACK,那么防火墙则直接不予处理丢弃掉。那么在实际中真的遇到这样的情况了,防火墙也是可以处理的,由于状态检测机制的存在,它会检测各种协议的特征与是否规范,我们可以关闭这个功能,防火墙就不会对连接的状态进行分析,就相当于包过滤的策略一样,后续报文只要有安全策略允许,则直接通过。
[USG6000V1]undo firewall session link-state check :关闭很简单,一条命令搞定,这里博主提醒,关闭状态检测功能,防火墙就失去了它的魅力所在了,除非在一些特殊的环境,不建议关闭这个功能。
这个时候客户端访问成功了。
防火墙的会话表会发现,收到的为0,发出去的有数据,这是因为Client1发送的流量直接路由器转发给服务器了,服务器回应的流量才经过防火墙,所以出现了这种特殊的状况。
会话创建的情况包括开启状态检测机制与关闭,上面TCP已经验证完毕了,也可以趁着这个环境验证下UDP与ICMP,博主就不在演示了,这里给出一个总结 。
建议大家可以在开启与关闭下测试测试TCP、UDP、ICMP协议的情况,对于大家在学习状态检测、会话机制有很大的帮助,也为排错提供了一个很好的思路。
在实际中如果遇到了特殊环境,确实需要关闭状态检测的情况下,但是关闭状态检测防火墙就回到了传统的包过滤时代功能了,防火墙提供了一个非常好的功能,就是可以指定某些流量关闭状态检测,其余的保持不变。
#
acl number 3000
rule 5 permit ip source 192.168.2.1 0 destination 192.168.1.1 0
#
firewall session link-state exclude acl 3000
#
firewall session link-state check
可以看到这个功能就很实用,带来的风险也不大,对于特定会话存在这种情况的,用ACL匹配出来,可以利用exclude来关闭状态检测,这样的话对应ACL的不启用状态检测,其余的还是会启用。
至此安全区域与状态检测就学习完毕了,但是里面涉及到安全策略是不是很陌生,那么它跟我们学习完的安全区域、状态检测会话有什么关联呢?为什么在讲解安全策略之前要先把这些讲解完毕,下一篇我们就进入安全策略的内容。
《华为下一代USG防火墙(由浅入深实际案例系列)》是博主原创的针对华为厂商下一代USG防火墙组网系列应用部署为主的系列课程,结合实际环境出发,加上了博主部署经验以及会遇到哪些问题等进行综合,做到学以致用,给各位看官朋友一个不一样的学习体验。
如果大家有任何疑问或者文中有错误跟疏忽的地方,欢迎大家留言指出,博主看到后会第一时间修改,谢谢大家的支持,更多技术文章尽在网络之路Blog,版权归网络之路Blog所有,原创不易,侵权必究,觉得有帮助的,关注、转发、点赞支持下!~。