路径 MTU 黑洞排查:解决小包正常而大连接卡住

2026-10-12 / 0 评论 / 2 阅读

路径 MTU 黑洞排查:解决小包正常而大连接卡住 教程示意图

适用场景

设备能 ping 通目标,TCP 三次握手也可能成功,但网页加载到一半、VPN 内文件传输停住、较大的 SSH 输出卡顿,换成小请求又正常,这类现象可能与路径最大传输单元(Path MTU)有关。本教程从 Linux 客户端进行低风险诊断,目标是估算可用 MTU并判断是否存在“MTU 黑洞”,而不是盲目修改所有网卡。

原理

MTU 是一条链路能承载的 IP 包上限,而端到端路径 MTU 是整条路径上最小的那个值。IPv4 的路径 MTU 发现依靠禁止分片的数据包和 ICMP“需要分片”反馈;IPv6 路由器不负责中途分片,依赖 ICMPv6“数据包太大”(Packet Too Big)反馈。如果防火墙错误丢弃这些控制报文,发送端可能一直发送过大的包:小包和握手能通过,大数据却超时,形成黑洞。隧道、PPPoE、VPN 和额外封装都会消耗空间,所以物理接口显示 1500,不代表远端路径也能承载 1500。

准备工作

选择一台出现问题的 Linux 客户端和一个经授权测试、会响应 ICMP 的目标。不要用无关公共网站做持续探测。记录接口名、当前 MTU、路由和故障发生时间。下面的<目标主机>代表目标的域名或 IP,<接口名>代表实际网卡,如通过 ip route get 输出确认的接口;尖括号不可照抄。测试只发送少量包,避免把排障变成流量压力。

分步骤操作

  1. 查看路由选择和本机接口 MTU:
ip route get <目标主机>
ip link show dev <接口名>

第一条会显示实际出口和下一跳;第二条中的 mtu 是本机链路设置,并非最终路径 MTU。如果域名同时有 IPv4、IPv6,应分别测试,不要混合结论。

  1. 先做基础 IPv4 探测:
ping -4 -c 4 <目标主机>

-c 4只发送四次。成功只能说明这种大小的 ICMP 包可达,不能证明大包无问题。

  1. 对常见的 1500 字节 IPv4 路径,用禁止分片方式测试 1472 字节负载:
ping -4 -M do -s 1472 -c 4 <目标主机>

普通 IPv4、无额外选项时,1472 字节负载加 20 字节 IPv4 头和 8 字节 ICMP 头,总计约 1500。-M do要求执行路径 MTU 发现并拒绝本地分片。如果返回“message too long”或需要分片,就逐步减小 -s,例如先试 1400,再以较小步长逼近最大成功值:

ping -4 -M do -s <负载字节数> -c 4 <目标主机>

<负载字节数>替换为整数。最大成功负载加 28,可作为该次普通 IPv4 ICMP 测试的近似 MTU;存在 IP 选项时头部可能更长,因此不要把结果当绝对常数。

  1. 使用 tracepath 获取路径提示:
tracepath -n <目标主机>

-n避免反向 DNS 查询干扰时间。观察输出中的 pmtu 变化和在哪一跳后出现异常。部分路由器不回应探测,星号不必然表示数据转发中断。

  1. 对 IPv6 单独测试:
ping -6 -c 4 <目标主机>
tracepath -6 -n <目标主机>

IPv6 的最小链路 MTU 是 1280;路径发现依赖 ICMPv6 Packet Too Big。不同 ping 实现的 IPv6 参数行为可能有差别,应先查看本机 ping --help 或手册,不要直接套用 IPv4 的加 28 计算。

  1. 把成功与失败的负载大小、IPv4/IPv6、出口接口、是否经过 VPN 以及时间点整理成表,再交给防火墙、路由器或 VPN 管理员核对。重点检查是否允许必要的 ICMP/ICMPv6 错误报文,以及隧道两端 MTU 或 TCP MSS 策略是否一致。

验证方法

修复后重复完全相同的命令。原先失败的大负载应稳定成功,tracepath 报告的路径 MTU应合理,真实网页、文件传输或 VPN 会话也应恢复。验证必须包含真实业务,因为目标可能不回应 ICMP,却仍正常传输;反之,ICMP 成功也不能证明所有协议都正常。分别验证 IPv4 和 IPv6,避免一种协议恢复掩盖另一种仍有故障。

常见错误

把 1472 直接当成 MTU 是最常见错误;它只是典型 IPv4 ICMP 负载,需加头部。普通 ping 成功就排除网络问题也不正确。所有大包都无响应时,既可能是 MTU 黑洞,也可能是目标完全过滤 ICMP,需结合抓包、应用行为和路径设备日志判断。随意把服务器接口 MTU降到很小,可能掩盖根因并降低效率。巨型帧只能在端到端网络都明确支持时使用,不能通过单端设置获得。

安全与回退

本教程的探测命令不修改配置。优先修复被错误过滤的 ICMP“需要分片”或 ICMPv6 Packet Too Big,并根据隧道设计统一 MTU;不要关闭整个防火墙。如果经变更审批临时调整接口 MTU,先记录原值并保留本地管理路径,验证失败后恢复:

sudo ip link set dev <接口名> mtu <原MTU值>

<接口名>替换为真实接口,<原MTU值>替换为变更前记录的整数。此命令可能瞬间影响连接,而且通过命令临时设置的值未必能跨重启保留;持久化方法取决于网络管理工具。远程单链路设备不应在没有控制台或自动回退机制时修改 MTU。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消