ℹ️NOTE演示内容说明:本文为「视野之外」演示日志,记录排查连接超时故障的技术诊断路径。
在日常观测中,突然发生的连接超时(Connection Timeout)往往比显式的 ECONNREFUSED 更加棘手。本文记录了一次特定 IP 在每隔 24 小时准点出现 TLS 握手假死现象的定位过程。
1. 现象描述与初步观测
- 症状:客户端发起 TCP 三次握手成功(SYN -> SYN/ACK -> ACK 耗时 35ms),但在发送 Client Hello 后,服务器没有任何 ACK 响应,直至 60 秒后客户端超时断开。
- 环境:Ubuntu 22.04 LTS, Nginx + OpenSSL 3.0。
2. 分层抓包对比 (TCPDump)
在客户端与服务端同时启动无头抓包:
# 服务端执行抓包
tcpdump -i eth0 -nn -s 0 port 443 -w server_dump.pcap
观察到的数据包流向差
[ Client 端视角 ]
10:00:00.000 IP 1.2.3.4 > 5.6.7.8: Flags [S] (SYN)
10:00:00.035 IP 5.6.7.8 > 1.2.3.4: Flags [S.], seq (SYN-ACK)
10:00:00.035 IP 1.2.3.4 > 5.6.7.8: Flags [.], ack (ACK)
10:00:00.036 IP 1.2.3.4 > 5.6.7.8: Flags [P.], length 512 (Client Hello)
... (重传 Client Hello 3 次) ...
[ Server 端视角 ]
10:00:00.035 IP 1.2.3.4 > 5.6.7.8: Flags [S]
10:00:00.035 IP 5.6.7.8 > 1.2.3.4: Flags [S.]
10:00:00.035 IP 1.2.3.4 > 5.6.7.8: Flags [.]
... (后续无任何 Client Hello 包到达网卡!) ...
3. 根因与定位结论
抓包结果明确表明:TCP SYN 与小包 ACK 顺利穿过中间路径,但长度为 512 字节的 Client Hello 在中间路径被静默丢弃(Blackhole Drop)。
解决方案:调整 Client Hello 结构,启用 SNI 混淆并在中继层拆分 TLS Record 分片,断开固定特征长度匹配。重新连通后连续观测 72 小时无再发异常。
* 点击复制包含绝对主地址的分享链接