问题

某日,一个重要客户报障,新上线的一套ERP系统,使用负载均衡做流量调度。本地用户访问无问题,但是通过×××拨号连接的用户无法正常应用,客户端登录成功,但数据传输失败。

处理过程

部分用户正常,部分用户有问题,最常见的可能性就是和MSS报文大小相关。现场测试,客户端跳过负载均衡直接连接后台服务器访问正常。确认问题在负载均衡设备处,在负载均衡设备上抓包查看:

发现如下的ICMP Type 3 Code 4 PMTU Discovery 报文

一次负载均衡的排障: PMTU_PMTU_02

该报文表明,从服务器到×××客户端之间的MTU值最大不应超过1443字节, 使用默认的1500字节大小是无法发送成功的。

回归基本原理

PMTU发现的工作原理如下

一次负载均衡的排障: PMTU_PMTU_03

 

(1)    源端主机按照自己的MTU对报文进行分片,之后向目的主机发送报文。

(2)        中间转发设备接收到该报文进行转发时,如果发现转发报文的接口支持的MTU值小于报文长度,则会丢弃报文,并给源端返回一个ICMP差错报文(也就是我们在负载均衡抓到的报文),其中包含了转发失败的接口的MTU

(3)        源主机收到该差错报文后,将按照报文中所携带的MTU重新对报文进行分片并发送。

(4)        如此反复,直到目的端主机收到这个报文,从而确定报文从源端到目的端路径中的最小MTU

解决问题

根据流程,可以判断是负载均衡设备未将收到的 PMTU报文转发给服务器,导致服务器未能正确获知链路上的MTU,继续使用较大的MTU发送报文,结果在中途被drop掉,不能发送给客户端。

检查负载均衡配置,允许ICMP转发后,再次测试×××客户,一切访问正常。

经验总结

1)确认您选择的负载均衡设备支持PMTU功能

2)确认负载均衡设备可以转发PMTU ICMP报文给服务器(不要在负载均衡设备或者服务器上设置过于严格的安全策略,例如丢弃所有ICMP报文)

(J.L)