分类:debug| 发布时间:2024-07-08 09:42:00
最近我们的服务部署到某私有云时发现客户端连接到服务端后会马上报 "Connection reset"
由于在客户环境发生此问题,不方便直接调试,在确认了相关代码没问题并且其他环境都没发生此情况后, 怀疑是客户网络环境的问题导致(比如防火墙限制,ACL限制等),运维排查后表示没发现问题, 便只能在关键节点抓包排查,首先在客户端所在机器抓包:
通过在客户端使用 Wireshark 抓包发现连接断开是由于服务端返回了 RST 包导致的,至此可以确认问题不在客户端,
此时基本可以确定问题发生在服务端,在服务端所在物理机使用 tcpdump 抓包排查(服务部署在容器内,由于容器默认没有 tcpdump,因此先从物理机入手),发现确实是服务端给客户端发送了 RST 包,此时可以确认问题发生在服务端。
为了进一步确认问题在容器内同时抓包,发现 RST 包并不是容器内的服务发出的。 此时可以确定问题发生在物理机网络环境导致,继续排查发现集群的多个节点使用了相同 IP, 向网络同事求证确认了相同 IP 的两个机器使用了 keepalived 进行高可用部署,正常来说只有一个物理机会获取此 IP,重启机器的 keepalived 服务后问题解决。