1. PMTUD 依赖 ICMP 不可达消息,遇到 ICMP 黑洞时如何排查与规避?
路径 MTU 发现(PMTUD)依赖 ICMP 不可达消息,遇到 ICMP 黑洞时如何排查与规避?
- PMTUD 用 IP 头 DF 标志 + ICMP "分片丢弃"消息发现路径 MTU
- ICMP 黑洞:防火墙丢弃 ICMP 不可达导致大包静默丢失
- 排查:tcpdump 看 ICMP、降低 MTU 测试、ping -M do 探测
PMTUD 通过发送带 DF(Don't Fragment)标志的包,若中间设备需要分片则回 ICMP "Packet Too Big",发送方据此降低 MTU。但很多防火墙/安全策略会丢弃 ICMP 不可达消息,形成 ICMP 黑洞,导致大包静默丢弃、连接超时或卡住。排查:用 tcpdump -i any icmp 抓 ICMP 不可达,用 ping -M do -s 1400 逐级探测可用 MTU,对比不同大小是否通。规避:在 Linux 上设置 ip link set mtu 1400 或全局 net.ipv4.tcp_mtu_probing=1;在代理/网关用 tcp mss 固定 MSS(如 Nginx tcp_nodelay 配合 MSS clamp),使 TCP 不依赖 PMTUD 也能工作。
ICMP 黑洞的本质是"PMTUD 依赖的 ICMP 被丢弃"。规避路径是"不依赖 ICMP"——要么固定 MSS 让 TCP 用足够小的分段,要么开启 tcp_mtu_probing 主动探测。
# 排查 ICMP 不可达
tcpdump -i eth0 icmp
# 探测路径 MTU
ping -M do -s 1472 10.0.0.1
# 规避:固定 MSS / 开启 MTU 探测
ip link set eth0 mtu 1400
sysctl net.ipv4.tcp_mtu_probing=1