离谱的断网故障 机房里有一台装了 Linux 的旧工控机,局域网内可以互相 Ping 通,但就是死活无法访问外网的 API 接口。路由器的防火墙查了没拦截,工控机网关也没配错。

面对这种灵异事件,单纯看配置已经没用了,只能深入协议栈去抓包看底层数据。

终端极简抓包 连上工控机的 SSH,直接利用系统自带的 tcpdump 工具,针对外网接口的指定端口进行抓取,把数据包保存为 .pcap 文件:

1# 抓取网卡 eth0 上,目标端口为 80 或 443 的 1000 个包
2tcpdump -i eth0 port 80 or port 443 -c 1000 -w offline_capture.pcap

Wireshark 离线分析破案offline_capture.pcap 下载到我自己的 Windows 电脑上,用 Wireshark 打开。 跟着 TCP 三次握手的数据流追踪过去,发现工控机发出 SYN 包后,收到了外部服务器的回包 SYN, ACK。但诡异的是,工控机没有回发 ACK,而是直接发了一个 RST(重置连接)包! 仔细对比包头的参数,发现这台工控机的 MTU(最大传输单元)被改成了极其奇葩的 900,导致超出大小的握手包在网络层被碎片化后无法正确重组,直接被内核丢弃。

收尾 一行命令改回正常的 1500:ifconfig eth0 mtu 1500。接口瞬间请求通畅。在底层网络的世界里,数据包永远不会说谎。