基于状态检测防火墙的“穿越”误区
2020-11-11湖北杨华
■ 湖北 杨华
编者按:在使用防火墙设备时难免会存在一些误区,就比如本文所讨论的ICMP协议数据包的“穿越”问题。本文对一些相关概念问题进行简要的解析。
防火墙技术在网络运维中占有重要的份量,也是一个专业网络工程师必备的技能。但有些人由于对一些基本概念掌握不够细致,在应用环境中,会产生一些误区,多走不少弯路。本文针对初学者中比较常见的基于状态检测的流量穿越误区进行剖析探讨。
实验环境
实验环境包括EVE网络模拟器,一台防火墙ASA,两台三层交换机SW3-1与SW3-2,通过SW3-1模拟内网,SW3-2模拟外网,ASA上进行基本配置,内网访问外网进行NAPT翻译。如图1所示。
实验目的
通过本次实验来验证状态防火墙,数据流量主动从高安全级别(inside或turst)到低安全级别(outside or untrust)是可以正常连接的(基于连接状态检测)。反之则会禁止,除非通过访问策略放行。
实验内容
在SW3-1通过Telnet远程登录到SW3-2上,可以正常访问。
SW3-1#TELNET 200.0.0.1 //连接成功
图1 实验环境模拟图
Trying 200.0.0.1 ...Open
User Access Verifi cation
Password:
ASA-5520# sh xlate//NAPT翻译成功
1 in use,1 most used
TCP PAT from inside:192.168.1.1/18148 to out side:200.0.0.10/52167
原理分析
根据防火墙的访问规则,从SW3-1出去到SW3-2的数据包是可以正常通行的,但回来的数据包是从低级别到高级别,不是应该被防火墙阻止的吗?
这在之前的包过滤防火墙是这样的,若要放行,需要配置大量的访问控制策略,但在状态检测防火墙中它会检测出去的数据流量连接状态,发现它是一个从高级别发起到低级别的数据包,而且监控到连接信息,就会认定它是安全,回来时就默认放行了。
故障现象
对于初学者来讲,能完成以上实验配置,并分析其原理,应该非常成功了。但对于一个网络工程师,怎么会放通过Ping去测试一下连通性这个下意识的动作呢?
通过发送SW3-1#ping 200.0.0.1之后发现,结果大失所望了,竟然不通。
通过抓包分析,在防火墙上ICMP数据已成功进行NAPT翻译:
ASA-5520# sh xlate
2 in use,2 most used
ICMP PAT from inside:192.168.1.1/1 to outside:200.0.0.10/8154
但是回来的数据包被阻止了,通过输入“debug icmp”,看不到回来的数据包了,这与上面的实验结论是相背的。笔者开始分析是否防火墙上进行ICMP的过滤,但通过检测并没有。
原来,状态检测是基于TCP/UDP的连接来进行识别的,TCP默认是监控的,有状态化信息,记录源IP及目的IP、源端口及目的端口等信息,形成映射。所以回包的时候会对比这些映射信息,符合条件就放行了。而ICMP数据包并没有通过TCP/UDP去承载,出去的时候ASA没有记录状态化信息,没有形成映射,所以回包的时候没法对比,默认就丢掉了。
故障排除
对于一个优秀的网络工程师来讲,没有什么解决不了的问题,虽然它并不影响实验结果。该问题可以通过两个方法来解决。
1.增加访问控制策略
定义策略:access-list icmp_out extended permit icmp any any
策略应用:access-group icmp_out in int outside
2.增加状态检测监控协议数据包
ASA(config)# policymap global_policy //默认ASA有的global_policy
ASA(config-pmap)#class inspection_default//默认监控
ASA(config-pmap-c)#inspect icmp //增加icmp监控
ASA-5520# sh run | in inspect //再次显示默认的监控列表
class-map inspection_default
class inspection_default
inspect dns preset_dns_map
inspect ftp
inspect h323 h225
inspect h323 ras
……
inspect icmp
从以上监控列表不难看出,TCP和UDP是例外的,不在该范围之内。FTP是动态应用,虽然有TCP的22、23端口,但是它的流量都是临时产生的,FTP必须有用户名和密码的登录。这就是动态的交互,也就是TCP上有特殊字段会被标记的,标记部分没有告知ASA放行的话,ASA是不识别的,所以FTP比较特殊,这里仍让能看到FTP的检测。
技术延伸
细心的朋友会发现ICMP在做NAPT翻译时,居然有对应的端口,众所周知ICMP数据包本身是没有端口号的。
经过反复实验,笔者发现了其中的玄机。原来NAPT的端口转换是为了区分inside local地址。
对于有端口的应用来说,一般转换为较大的端口号从而避免和常用端口冲突。而对于一些没有端口号的应用(比如ICMP)来说,所谓端口号仅仅是为了区分不同ICMP包,可以理解为就是特定的数字标记,不具有任何其他意义。通过不断的Ping下去,端口号会一直增加,一个echo_request的端口数字对应一个echo_replay端口数字,和四层包头的端口号没有任何关系。
通过使用“SW3-1#ping 200.0.0.1”命令,笔者试着进行了两次数据包的连接测试,结果如下:
ASA-5520# sh xlate
ICMP PAT from inside:192.168.1.1/3 to outside:200.0.0.10/45184
ICMP PAT from inside:192.168.1.1/2 to outside:200.0.0.10/56735
ASA在进行NAPT时,如果发现IP包头中协议号为1,就会知道是ICMP的包,而不用考虑四层端口号,直接用一个端口数字标记转换即可。
当然,不同的设备厂商可能有不同的处理机制,让NAT通过一些特殊的字段来识别。
例如,在ICMP中有Iden tifier和Sequence Number,identifier用来辨别不同的Ping流程。比如我们启动两个控制台窗口,分别输入Ping命令,就会运行两个不同的Ping进程。这两个Ping进程就依靠不同的identifier来区分。而一次Ping过程不止发送一个数据包,如果一次发送多个数据包,那么同一个Ping流程内就用sequence number把不同的数据包给区分开来,这个字段一般都是递增的。
实验心得
不同厂商的防火墙设备可能有不同的处理机制,为了方便用户,可能隐藏了一些我们未知的技术细节,比如上面的ICMP协议数据包的监控。