先把当时的情况摆出来。跨地域专线时 traceroute 到第六跳开始每个节点都是星号,业务接口的 curl 却一直返回 200,运维据此判断链路有丢包,差点提交工单。
这类报错背后常见的原因有几处,逐个排除就行。中间设备对 ICMP TTL 超时不做回应,星号只是不回包不代表路径断了。另一种情况是部分云网关对 UDP 探测端口做了限速,连续探测直接丢弃。
不容易想到的是,traceroute 默认用 UDP,路径上的安全策略只放行 TCP。还有一种情况,目标主机禁了 ICMP,最后一跳也显示星号。
上来先换 TCP 模式再探一次路径
traceroute -T -p 443 -n 47.100.1.2
再往下用 mtr 看每一跳的丢包是否持续
mtr -T -P 443 -c 50 -r 47.100.1.2
直接从两端抓包对照
tcpdump -i eth0 -nn host 47.100.1.2 and tcp port 443 -c 20
等前面都确认过,再确认应用层是否真的受影响
curl -s -o /dev/null -w 'connect=%{time_connect} total=%{time_total}\n' https://www.example.com/
别只看报错消失,验证要多做一步。traceroute -T 能看到完整路径,mtr 里目标节点丢包为 0,curl 的 time_connect 稳定在正常范围。
补一句。星号只能说明探测包没回来,不能说明业务不通;判断丢包要看目标节点的统计,中间跳的丢包经常被限速策略放大。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
