2.2.6 ICMP与网络诊断(ping、traceroute原理)

ICMP(Internet Control Message Protocol)用于在IP层传递控制与差错信息,不携带应用数据,但对网络可达性与故障定位至关重要。ICMP不依赖端口,常被防火墙/安全组限制,诊断结果必须结合安全策略判断。

原理草图(ICMP在路径中的作用):

文章图片

常见ICMP报文类型与作用:
- Echo Request/Reply:用于连通性探测与延迟测量(ping)
- Destination Unreachable:目的不可达(网络/主机/端口/协议不可达)
- Time Exceeded:TTL耗尽(traceroute路径探测)
- Redirect:提示更优路由(生产常禁用)
- Parameter Problem:IP头部或选项异常

ping 原理与使用(示例 + 解释)#

基本探测与统计:

# 向目标发送 4 个请求,间隔 0.5s
ping -c 4 -i 0.5 8.8.8.8

# 解释:
# -c 4   发送4个请求
# -i 0.5 每个包间隔0.5秒
# 输出中的 time= 反映 RTT,packet loss 反映丢包率

MTU 探测(大包不分片):

# 发送 1472 字节负载,IP+ICMP头共 28 字节,总 1500(典型MTU)
ping -c 3 -M do -s 1472 8.8.8.8

# 解释:
# -M do  不分片,若路径MTU不足会返回 "Frag needed"
# -s 1472 设置ICMP负载大小

常见现象与判断:
- 全部超时:对端不可达、路由断、ICMP被阻断
- 时延抖动大:链路拥塞、队列抖动、QoS限速
- 大包丢失小包正常:路径MTU问题

traceroute 原理与使用(示例 + 解释)#

基本路径探测(默认UDP):

traceroute -n -m 20 -w 1 8.8.8.8

# 解释:
# -n   禁用反向解析,避免DNS干扰
# -m 20 最大TTL为20
# -w 1 超时1秒

ICMP/TCP探测更贴近业务:

# ICMP 探测
traceroute -I -n 8.8.8.8

# TCP 探测(如HTTP服务)
traceroute -T -p 80 -n www.example.com

结果解读要点:
- 中间跳超时但后续可达:可能是路由器限速/丢弃ICMP
- 末跳超时:目标阻断ICMP或端口不可达,需改用 -I/-T 验证
- 路径变化频繁:ECMP或路由波动

抓包验证(tcpdump)#

验证是否有 ICMP Request/Reply:

# 在出口网卡抓 ICMP,查看请求与回复是否成对出现
sudo tcpdump -i eth0 -nn icmp

# 预期:
# 能看到 echo request 与 echo reply
# 若仅有 request,说明回程被阻断或目标不回包

验证 traceroute 的 TTL 响应:

# 观察 Time Exceeded 响应
sudo tcpdump -i eth0 -nn 'icmp and (icmp[0]=11 or icmp[0]=0)'

排错流程(命令链)#

# 1) 本机网络与路由检查
ip addr
ip route
resolvectl status

# 2) ping 网关
ping -c 3 <gateway_ip>

# 3) ping 关键节点
ping -c 3 <target_ip>

# 4) traceroute 定位中断
traceroute -n <target_ip>

# 5) 检查本机防火墙是否阻断ICMP
sudo iptables -S | grep -i icmp
sudo nft list ruleset | grep -i icmp

练习#

  1. 使用 ping -M do -s 找出到目标主机的路径MTU上限,记录失败与成功的阈值。
  2. 对同一目标分别使用 traceroutetraceroute -Itraceroute -T -p 443,对比路径差异并解释原因。
  3. 在本机临时丢弃ICMP回复(使用防火墙规则),观察 pingtraceroute 的表现变化并恢复规则。