由于TCP校验和错误导致业务异常

发布时间:  2014-09-20 浏览次数:  2856 下载次数:  0
问题描述
如图4-1所示,在Client上安装了某系统的客户端,可以ping通服务器,也可以Telnet服务器的7001端口,客户咨询过该系统软件商,称只要连接上服务器7001端口就能访问服务器,但是客户端无法正常启动(正常情况是启动客户端会弹出输入用户名和密码的提示框,不正常时启动客户端,不弹出输密码的提示框,卡住不动),将USG换成DLINK路由器,可以正常访问服务器。

客户端通过USG 做NAT上网,并访问远程的服务器。
处理过程
1. 在客户端抓包,发现服务器回应的数据报文TCP校验和不对,导致被客户端TCP协议栈丢弃,进而引起业务异常。使用DLINK路由器替换USG后,业务正常时,抓包发现服务器回应的数据报文TCP检验和是正确的。

2. 客户端收到服务器的TCP校验和错误的数据报文,有可能是因为防火墙NAT转换时TCP校验和计算出错,也有可能是因为防火墙收到的服务器数据报文TCP检验和就已经出错。在防火墙内外网口同时镜像抓包,确认防火墙收到的服务器数据报文TCP校验和就已经出错。

3. 对比DLINK内外网抓包和USG内外网抓包数据,发现报文NAT转换后,DLINK路由器源端口没有变化,仍为4位端口号,而USG源端口改变了,将4位端口转换为5位端口号。可能是该差异导致服务器端或者中间网络设备计算TCP检验和出错。
4. 对该客户端配置全局NAT Server进行测试,业务正常,服务器回应的数据报文TCP检验和正确。

5. 为了进一步确认是源端口变化引起还是源端口为5位导致,使用小工具在一线电脑上测试,确认只要转换后的源端口大于61170,服务器回应的数据报文TCP校验和就是错误的,小于该值就正常,与NAT转换源端口变化无关。
6. 现场通过在防火墙上配置nat port range 12288 61100命令,设置转换后的NAT端口范围解决。
根因
测试发现客户端经过USG 做NAT转换后的源端口只要大于61170,USG收到的服务器回应的数据报文TCP校验和计算就会错误,可能服务器计算TCP校验和出错,或者中间NAT设备计算TCP校验和出错,最终导致业务异常。
建议与总结
定位问题分析抓包数据时,需要关注TCP/UDP检验和等IP/TCP/UDP首部各个字段的正确性。

END