Linux命令-traceroute(IP 路由路径追踪)
traceroute 是网络诊断的经典工具,通过发送递增 TTL(生存时间)的探测包,逐跳追踪 IP 数据包从源到目标的完整路由路径。它支持 ICMP、UDP 和 TCP 三种探测模式,比 tracepath 更灵活但需要 root 权限。
快速参考
bash
traceroute [选项] 主机 [数据包大小]
权限提示 :
traceroute需要发送原始 IP 数据包,默认需要 root 权限。普通用户可以使用tracepath作为替代。在生产网络中大量发送探测包前,请确认不会触发安全告警。
基本用法
bash
# 基本追踪
sudo traceroute example.com
sudo traceroute 8.8.8.8
# 不解析主机名(加速显示)
sudo traceroute -n 8.8.8.8
# 指定最大跳数
sudo traceroute -m 15 8.8.8.8
# 指定每个跳数的探测次数
sudo traceroute -q 3 8.8.8.8 # 默认 3 次
sudo traceroute -q 1 8.8.8.8 # 每跳只探测 1 次
# 指定超时时间
sudo traceroute -w 5 8.8.8.8 # 5 秒超时
# 指定数据包大小
sudo traceroute 8.8.8.8 1500
探测模式
bash
# === UDP 模式(默认) ===
sudo traceroute example.com
# 使用高端口 UDP 数据包(默认端口 33434+)
# 适合通用路由追踪
# === ICMP 模式 ===
sudo traceroute -I example.com
# 使用 ICMP Echo Request
# 更容易穿透防火墙
# 需要 root 权限
# === TCP 模式(推荐用于防火墙检测) ===
sudo traceroute -T example.com
sudo traceroute -T -p 80 example.com # 探测 TCP 80 端口
sudo traceroute -T -p 443 example.com # 探测 TCP 443 端口
sudo traceroute -T -p 22 example.com # 探测 TCP 22 端口
# TCP 模式可以发现哪些端口被防火墙阻断
sudo traceroute -T -p 80 -n firewall.example.com
# 如果某跳显示 * * * 且下一跳正常 → 该跳过滤了 TCP 80
# 如果所有跳都显示 * * * → 所有跳都过滤了 TCP 80
理解输出
bash
# traceroute 输出示例:
# traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
# 1 gateway.local (192.168.1.1) 0.534 ms 0.612 ms 0.456 ms
# 2 10.0.0.1 (10.0.0.1) 1.234 ms 1.456 ms 1.345 ms
# 3 * * *
# 4 172.16.0.1 (172.16.0.1) 8.765 ms 9.123 ms 8.987 ms
# 5 isp-router (203.0.113.1) 15.234 ms 16.123 ms 15.567 ms
# 6 google-gw (8.8.8.8) 18.456 ms 19.234 ms 18.789 ms
# * * * 表示:
# - 防火墙丢弃了探测包
# - 路由器不响应 TTL 超时
# - 网络拥塞导致超时
# 三列时间 = 三次探测的 RTT
# 主机名可能显示为 IP(-n 选项或 DNS 解析失败)
高级选项
bash
# 接口指定
sudo traceroute -i eth0 8.8.8.8
# 源地址
sudo traceroute -s 192.168.1.100 8.8.8.8
# Type of Service (TOS)
sudo traceroute -t 1 8.8.8.8 # 低延迟
sudo traceroute -t 2 8.8.8.8 # 高吞吐量
# 不设置分片标志
sudo traceroute -F 8.8.8.8
# 设置具体数值
sudo traceroute --mtu 8.8.8.8 # 类似 tracepath 的 MTU 检测
# 紧凑输出
sudo traceroute -N 1 8.8.8.8 # 不显示多行 RTT
# 显示 AS 编号
sudo traceroute -A 8.8.8.8 # 需要安装 whois
防火墙探测
bash
#!/bin/bash
# 使用 traceroute TCP 模式检测防火墙规则
# 用法: ./fw_detect.sh [目标]
TARGET="${1:-example.com}"
PORTS=(22 80 443 3306 8080 8443)
echo "防火墙规则检测: $TARGET"
echo "=============================="
echo ""
for PORT in "${PORTS[@]}"; do
echo "--- 端口 $PORT ---"
RESULT=$(sudo traceroute -T -n -p "$PORT" -m 10 -q 1 -w 2 "$TARGET" 2>&1)
# 检查是否到达目标
LAST_LINE=$(echo "$RESULT" | tail -1)
if echo "$LAST_LINE" | grep -q "$PORT"; then
echo " 端口 $PORT: 开放(可达)"
else
# 统计有多少跳不响应
STAR_COUNT=$(echo "$RESULT" | grep -c '^\s*[0-9].*\*')
echo " 端口 $PORT: ${STAR_COUNT} 跳不响应"
fi
done
mtr - traceroute 的升级版
bash
# mtr (My Traceroute) 结合了 traceroute 和 ping 的功能
# 安装:
sudo apt-get install mtr # Debian/Ubuntu
sudo yum install mtr # RHEL/CentOS
# 基本用法
sudo mtr example.com
mtr --report example.com # 报告模式
# 不解析 DNS
mtr -n example.com
# ICMP/TCP 模式
sudo mtr -T -p 80 example.com # TCP 80
sudo mtr -u example.com # UDP
sudo mtr -I example.com # ICMP
# 输出报告(脚本中常用)
mtr --report --report-cycles 10 -n example.com
选项速查
| 选项 | 说明 |
|---|---|
-I |
使用 ICMP 探测 |
-T |
使用 TCP 探测 |
-U |
使用 UDP 探测(默认) |
-n |
不解析主机名 |
-m N |
最大跳数 |
-q N |
每跳探测次数 |
-w SEC |
超时时间 |
-p PORT |
目标端口(TCP 模式) |
-i IFACE |
指定源接口 |
-s ADDR |
指定源地址 |
-A |
显示 AS 编号 |
-F |
不设置分片标志 |
traceroute是网络诊断的经典工具,从 1987 年诞生至今仍是排查网络连通性问题的首选。TCP 模式(-T)是检测防火墙规则的利器,而mtr则提供了更直观的实时诊断视图。对于不需要 root 权限的场景,优先使用tracepath。