Linux traceroute 默认用UDP(端口33434起递增),可切ICMP(-I)或TCP(-T)以绕过防火墙限制:UDP免root但易被滤;ICMP更易放行但需权限;TCP适用于严格策略环境,需root且指定开放端口。

Linux 下 traceroute 默认用 UDP,但可切到 ICMP 或 TCP —— 切换不是为了“更高级”,而是为绕过实际网络中的协议限制。
UDP 模式:Linux 默认行为
默认发送 UDP 数据包,目的端口从 33434 开始逐跳递增(33434、33435…),源端口随机。中间路由器 TTL 减至 0 时,返回 ICMP Time Exceeded(Type 11);目标主机因无应用监听这些高端口,返回 ICMP Port Unreachable(Type 3, Code 3)。
优点:无需 root 权限(多数实现下);兼容性广。
缺点:易被防火墙或安全策略丢弃——很多出口设备默认屏蔽未授权的 UDP 高端口入向响应。
ICMP 模式:用 -I 参数启用
执行 traceroute -I www.example.com 后,发送的是 ICMP Echo Request(类似 ping),TTL 仍从 1 递增。每跳路由器返回 ICMP Time Exceeded;目标主机则返回标准 ICMP Echo Reply。
优势:更贴近真实探测流量,部分网络对 ICMP 的放行策略比 UDP 宽松;输出更易解读(无“端口不可达”歧义)。
注意:某些系统或容器环境可能禁用非 root 用户发 ICMP 包,此时会报错 “Operation not permitted”,需加 sudo 或调整 capabilities。
TCP 模式:用 -T 参数突破防火墙
执行 traceroute -T -p 443 www.example.com,发送 TCP SYN 包(不建全连接),目标端口指定为 443(或其他常用服务端口)。中间节点同样返回 ICMP Time Exceeded;目标若开放该端口,会回 RST(而非 SYN-ACK),traceroute 以此判定到达终点。
适用场景:企业内网、云 VPC、运营商 NAT 后等严格策略环境,只放行 80/443 等少数 TCP 端口。
要求:需要 root 权限(因原始套接字构造 TCP 包);目标端口必须可达(否则整条路径可能卡在最后一跳显示 * * *)。
怎么选?看网络环境再决定
• 如果 traceroute 输出大量 * * * 且前几跳就中断 → 先试 -I,排除 UDP 被滤。
• 如果 -I 仍失败,但你能访问目标网站(如 curl -I https://xxx)→ 用 -T -p 443。
• 怀疑某跳存在负载均衡或策略路由 → 加 -q 5(发 5 次包)观察 IP 是否波动,UDP 和 ICMP 行为可能不同。
• 始终加 -n:避免 DNS 查询拖慢过程,也防止反向解析失败干扰判断。










