资讯动态

Linux网络排查利器:traceroute原理、参数与实战详解

发布时间:2026/10/16 18:16:49 来源:尧图企业网站定制
你有没有遇到过这种情况某个线上服务突然变慢ping一下服务器延迟正常但用户就是反馈卡成狗。这时候大多数人会在服务器上抓包、查日志折腾半天也没找到原因。其实有一个Linux下的命令行工具能帮你快速定位问题它就是traceroute几秒钟之内就能告诉你数据包从本机到目标服务器之间究竟走了哪条路、每一跳的延迟是多少。这个工具在Linux网络排查中几乎是标配可惜很多朋友只停留在“ping通没通”的层面对traceroute的了解仅限于“装个包跑一下”输出结果看不懂、参数不会用遇到满屏星号就慌了。这篇文章我就从安装、原理、参数、实战到避坑把这个工具彻底讲透。适合所有Linux使用者无论你是刚接触命令行的新人还是已经维护过一段时间生产环境的工程师看完应该都会有一些收获。1. 先搞明白traceroute到底在做什么1.1 一句话讲透工作原理traceroute的原理并不高深核心就是利用IP协议里的TTLTime To Live字段。IP包每经过一个路由器TTL值就会减1当TTL减到0的时候路由器不再转发这个包直接将其丢弃并且向包的源地址发送一个ICMP Time Exceeded超时消息。traceroute的做法很巧妙先发一个TTL1的数据包第一跳路由器收到后TTL变成0直接返回超时消息于是我们知道了第一跳的IP接着发TTL2的包第一跳正常转发第二跳TTL变0返回超时消息第二跳的IP也拿到了。以此类推直到数据包到达目标主机返回一个ICMP Echo Reply或者端口不可达消息整条路径就完整呈现出来了。打个比方这就像你在陌生的城市里找人帮忙传递纸条但想看这张纸条经过了多少个驿站。你可以让每个驿站的人在纸条上盖个章再继续传每轮的“放行数量”由你控制。traceroute干的就是这个活只不过它用TTL来控制“放到第几站就回头报告”。1.2 三种探测方式UDP、ICMP、TCPLinux下的traceroute默认使用UDP探测源端口是随机的高位端口目标端口从33434开始每轮探测递增1。UDP包到达目标主机后多数情况下目标主机上并没有进程监听这个端口于是返回一个ICMP Port Unreachable端口不可达消息traceroute收到这个消息就认为已经到达终点。Windows系统自带的tracert命令默认使用ICMP ECHO请求和ping用的是同一类包。两者的原理基本一样差别只在探测包的协议类型。Linux的traceroute可以用-I参数改成ICMP探测用-T参数改成TCP SYN探测。这三种方式各有明确的适用场景我专门整理了一张表探测方式参数默认目的地特征适用场景UDP无默认目标端口从33434递增Linux下默认方案传统且兼容性好ICMP-I类似ping的ICMP Echo适合网络设备对ICMP放行较多的情况TCP-T目标端口默认80可指定防火墙环境下穿透性最好实际使用中UDP探测在公网上经常会被中间设备拦截导致大量星号ICMP探测和ping的包特征一致很多防火墙对ICMP超时消息会比较宽容TCP探测模拟真实应用握手最接近线上业务流量也最容易绕过只放行特定端口的策略。三种方式没有绝对的优劣我的经验是默认UDP一次不通就换-T再不行就用-I总有一种能画出完整路径。1.3 看懂traceroute的每一列输出也许你运行过traceroute但每次看到那几列数字都一头雾水。其实输出格式非常固定我们看一个典型例子traceroute to 某目标 (203.0.113.10), 30 hops max, 60 byte packets 1 192.168.1.1 (192.168.1.1) 1.283 ms 1.147 ms 1.021 ms 2 10.0.0.1 (10.0.0.1) 5.632 ms 5.418 ms 5.329 ms 3 * * * 4 203.0.113.1 (203.0.113.1) 12.341 ms 12.198 ms 12.087 ms第一行是摘要信息告诉你目标地址、最大跳数默认30、每个数据包的字节数。后面的每一行就是一个跳点第一列是跳数编号第二列是路由器IP或主机名后面的三列是三次探测各自花费的时间单位毫秒。每跳默认探测三次所以有三列时间。时间列有几个容易误读的地方。第一次探测和第二次探测的时间差距大不一定代表网络波动可能只是某个路径上的设备做了限速处理。只有连续多跳都出现明显延迟跳变才值得重点关注。比如某一跳突然从10ms飙升到150ms之后又降回来这个节点就需要进一步观察。星号*表示这一跳没有收到响应可能是设备禁用了超时消息也可能是网络拥塞导致丢包。看到星号不用太慌如果后续跳点可以正常返回说明数据还是通的只是某个路由器出于安全或性能原因不回应超时消息罢了。真正的断链是某一跳开始连续出现星号并且后续跳点也无法恢复。2. 不同Linux发行版下的安装与验证2.1 Debian/Ubuntu系列在Debian系里安装非常简单命令如下sudo apt update sudo apt install traceroute安装完成后建议顺手验证一下which traceroute traceroute --version第一条命令显示可执行文件路径通常在/usr/bin/traceroute第二条命令显示版本信息。版本号在2.0以上的traceroute基本都支持上面提到的三种探测方式。Debian系的软件源里通常有多个网络工具包安装时注意不要装成别的同名软件确认版本信息是可靠手段。还有一点值得注意Debian/Ubuntu的apt源默认就包含traceroute不需要额外添加第三方源。如果apt update时提示找不到软件包大概率是sources.list里没有开启universe组件检查一下源配置即可。2.2 CentOS/RHEL系列CentOS 7及更早版本用yum安装sudo yum install tracerouteCentOS 8及以上版本包括Rocky Linux、AlmaLinux这些常用替代发行版用dnf安装sudo dnf install traceroute可能有人分不清yum和dnf其实dnf是yum的下一代版本命令用法几乎一样。CentOS 8之后yum已经退居幕后直接用dnf就好。在Red Hat系发行版上traceroute依赖的libpcap、libc等基础库一般默认已安装因此安装过程通常非常顺利不会遇到缺依赖的情况。2.3 其他发行版与容器环境Fedora同样是dnfsudo dnf install tracerouteArch系用pacmansudo pacman -S tracerouteopenSUSE用zyppersudo zypper install traceroute如果用的是轻量容器镜像比如Alpine Linux使用apkapk add traceroute容器环境里有个小坑很多精简镜像默认不包含traceroute而基础网络排查命令又不齐全所以进入容器后最好第一时间把traceroute补上。某些运行在Podman或Docker里的镜像网络栈和宿主机不完全隔离探测到的路径和宿主机未必一致排查时心里要有数。2.4 没有软件源权限时的备选方案有时候你面对的是一台权限受限的机器或者内网环境没有外网软件源traceroute装不上。这时候还有一些备选方案。如果只是想快速判断某条路由是否可达可以直接用ping的-m参数来设置TTL前提是系统里有ping且支持-m参数但这种做法只能看到某一跳的信息不能列出完整路径。也可以尝试下载静态编译的可执行文件复制到目标机器直接运行不需要root权限也能跑。这种方法适合应急场景但不建议作为常规方案。说到底traceroute在几乎所有主流发行版的默认软件源里都有正常情况下一条命令就能装好离线折腾大多出现在服务器被严格控制的环境里。遇到这种情况最好的做法是提前在镜像模板里打好包避免临时抓瞎。3. 核心参数详解与使用时机3.1 参数速查表很多人用traceroute永远只有默认命令这样虽然也能看到路径但遇到复杂问题时总觉得“信息不够用”。traceroute提供了不少实用参数我把日常用得最多的整理成速查表参数功能使用示例-n不解析IP为主机名速度更快traceroute -n 目标IP-I使用ICMP探测traceroute -I 目标IP-T使用TCP SYN探测traceroute -T 目标IP-p指定目标端口配合-T或-U使用traceroute -T -p 443 目标IP-m设置最大跳数默认30traceroute -m 64 目标IP-q每跳探测次数默认3traceroute -q 1 目标IP-w等待每次响应的超时时间默认5秒traceroute -w 2 目标IP-f设置起始TTL跳过前面几跳traceroute -f 5 目标IP-z每次探测之间的暂停时间单位秒traceroute -z 0.5 目标IP3.2 参数背后的选择逻辑-n参数是我个人强烈建议优先加的。在DNS解析正常但比较慢的网络环境里如果不加-n每一跳的IP都会被做一次反向DNS解析整个命令执行时间会大幅拉长有时甚至比探测本身还慢。反向DNS解析失败时还可能输出一堆干扰信息。我实际排查故障的习惯是第一遍用-n跑先不看节点归属只关注路径和时间需要了解节点具体位置时再针对个别IP做解析。-I和-T参数的选择逻辑更贴近实际业务。默认的UDP探测一旦被中间防火墙拦截输出就是一片星号这时改用-T -p 443往往有奇效。443通常是HTTPS端口绝大多数网络安全策略都会放行TCP探测到这里会被正常响应。而-I模式的包特征和ping一致某些对ICMP做了限速或放行的网络里表现更好。多试几种探测方式相当于从不同角度验证链路得到的路径信息也更可信。3.3 一条完整命令的拆解假设我们要快速诊断一台服务器到某个目标的路径想跳过本机网关和前面几跳每跳只探测1次并希望快速返回结果sudo traceroute -n -T -p 443 -f 3 -q 1 -w 2 203.0.113.10拆开来解读一下sudo使用TCP探测时需要root权限创建原始套接字-n不做反向DNS解析提速-T使用TCP SYN探测-p 443目标端口443-f 3从第3跳开始探测跳过本机网关和前面几个内网设备-q 1每跳只探测1次加快速度-w 2每跳最多等待2秒这样一个命令跑下来正常情况下十几秒就能出结果非常适合线上环境的快速判断。如果想看到更详细的时间波动就把-q调回默认的3代价是耗时相应增加。参数组合没有标准答案核心思路是明确你要回答什么问题再决定跳过哪些跳点、探测几次、等待多久。4. 实战场景用traceroute解决几个真实问题4.1 场景一延迟高但ping正常前阵子有位朋友找我排查应用卡顿的问题他自己测了ping从本机到目标服务器延迟只有10ms左右但打开网页就是慢。我让他跑了一个traceroute -n结果发现路径中间有一个节点延迟达到了150ms以上。这里要解释一个关键点ping的延迟是端到端的它只能告诉你总延迟看不到中间哪一段拖了后腿。而traceroute能让你看到每一跳的时间开销当某一跳的延迟明显高于前后跳时那个点很可能就是瓶颈所在。这位朋友的场景里问题就出在某个骨干节点上跨网访问走了一条绕远的路。后来通过调整出口路由问题迎刃而解。日常运维中这种“ping正常但应用卡顿”的情况并不少见很多人的第一反应是查服务器负载、查应用日志却忽略了中间链路的问题。traceroute的价值就在于把不可见的网络路径变成可见的数据帮你快速排除或确认链路因素。4.2 场景二链路丢包定位还有一次某项服务时不时连接重置通过抓包也没发现应用层异常。我用了traceroute -n -I去测发现中间的某个IP连续几次都是星号同时两端延迟出现明显波动判断是中间链路存在拥塞。这里要强调一个经验不要因为看到几个星号就觉得网络断了。如果在第N跳出现星号但第N1跳又能正常返回通常只是第N跳的设备不响应超时消息数据仍然能正常穿过。真正需要警惕的是从某一跳开始连续出现星号且后续跳点无法恢复这往往说明从当前跳点往后路径已经不可达。丢包率的观察还得靠时间列的稳定性。如果三次探测中某几跳的响应时间忽高忽低或者直接消失配合两端的时间差基本能判断哪一段链路在丢包。再加上mtr做持续观察定位会更精确这个话题后面会细说。4.3 场景三判断是否存在绕路办公环境的出口在A地但实际访问某个目标竟然经过了B地再绕回来。通过traceroute查看节点IP基本可以推算路径的大致地理位置。虽然没有商业化地图查询工具那么直观但IP归属数据库可以帮助你判断每个节点所处的城市或区域。只要看到路径明显绕路比如本来直连不到10跳能到的目标实际却走了二十几跳就可以考虑是不是出口路由选优策略的问题。这种情况常见于多线机房、跨境链路或运营商之间的互联点。联系网络管理员调整路由策略或者更换更优的接入点往往是解决思路。绕路问题最典型的特征是“路径长且延迟高”但单看延迟并不能完全确认绕路因为物理距离和光缆走向都会影响延迟。结合节点IP归属来判断链路走向是比较稳妥的做法。不要因为某个节点IP归属地看起来“奇怪”就下结论至少要看到两条相邻路径都在绕才能基本坐实这个判断。4.4 场景四配合MTU排查大包不通TCP连接能建立但传输大文件奇慢有时候是路径上某个节点的MTU较小造成的。部分新版traceroute支持--mtu参数可以在探测路径的同时探测每跳的MTU。某些网络设备对DFDont Fragment标志的响应行为不同这个参数能帮助定位MTU黑洞。MTU黑洞是指路径上某个节点不支持较大的数据包但又不返回ICMP Fragmentation Needed消息导致大包直接被丢弃表现为小包通、大包不通。这类问题用常规的ping大包测试很难定位到具体节点因为ping只能确认端到端的结果而traceroute可以逐步定位到是哪一跳出了问题。实际使用时可以先跑一次正常traceroute确认路径再用--mtu参数重新探测对比不同跳点返回的MTU值。如果某一跳的MTU明显低于两端且后续探测大包失败基本可以锁定问题节点。调整本机网卡的MTU或者与上游网络沟通修改节点MTU配置都能缓解这类问题。5. 常见问题与排查技巧实录5.1 装了却用不了权限问题运行traceroute时报“Operation not permitted”或提示无法创建原始套接字这通常是因为普通用户默认不允许创建raw socket。解决办法很简单加上sudo。个别企业安全策略限制得比较严格还需要在系统配置里放开相关权限。需要说明的是UDP探测方式不一定需要root某些发行版允许普通用户使用UDP模式。但-I和-T两种方式都依赖原始套接字必须root才行。所以排查时如果发现普通用户跑traceroute没问题但-I时报权限错误不用惊讶这是系统设计的预期行为。5.2 输出全是星号该怎么办看到全星号先别急按顺序排查先确认目标IP是否真的可达ping一下如果ping都不通大概率是链路整体不通不是traceroute本身的问题。如果ping通但traceroute全星多半是中间防火墙拦截了UDP探测或ICMP超时消息。这时候改用-T -p 443再试一次穿透性会好很多。还有一种情况目标主机响应了但回包路径和探测路径不一致导致回包没有回到本机。多线机房或负载均衡场景中比较常见。全星号不代表链路一定不通很多时候只是探测包被策略丢弃了。如果情况紧急光靠traceroute不够还可以配合ping和端口连通性测试比如用nc或telnet验证业务端口是否正常综合判断链路状态。5.3 探测时间偶尔很高不一定代表网络故障有些网络设备对ICMP超时消息的处理优先级较低繁忙时会延迟响应甚至直接丢弃。这会让你看到某个跳点的延迟高得离谱。判断方法很简单连续跑几次traceroute如果每次都是同一跳高延迟且前后跳正常才值得怀疑如果时高时低大多是设备限速或临时拥塞不必过度紧张。记住一个原则单次traceroute只是一个快照不足以支撑结论。至少要跑三次观察趋势是否一致再结合业务表现判断是否真正影响使用。有些时候一条路径跳数很多但每一跳的延迟都比较低整体质量也不差跳数少但某几跳延迟极高反而可能拖垮体验。要综合判断不要只盯着某一个数字。5.4 traceroute、mtr和ping到底怎么选经常有人把这三个工具混在一起。简单区分的话ping看的是端到端连通性和总延迟traceroute看的是单次路径上的每一跳mtr则是结合了两者的动态工具持续刷新每跳的丢包率和延迟适合观察网络波动。我日常的做法是先用traceroute -n快速定位路径结构对可疑节点有初步印象再用mtr持续观察一段时间。mtr会在终端里动态刷新丢包和延迟的变化都一目了然比反复敲traceroute高效得多。遇到复杂网络问题两个工具配合使用绝大多数路由问题都能有一个基本判断。5.5 常见问题速查表现象可能原因解决方向权限报错非root使用ICMP/TCP模式加sudo执行全星号防火墙拦截探测包改用-T -p 443尝试某几跳超时设备不响应超时消息用mtr观察整体路径延迟突高节点限速或拥塞多次探测确认趋势路径绕路出口路由选择问题联系网络管理员调整大包不通MTU黑洞用--mtu参数定位节点6. 结尾收尾最后分享一个自己摸索出来的习惯只要条件允许我会在需要频繁排查网络问题的工作机上顺手装好traceroute和mtr并提前准备好几个常用探测目标的命令别名。网络故障往往是突发的与其临时翻文档查参数不如平时就把工具链打磨顺手。traceroute看起来只是一个简单命令但真正理解它的原理和参数后你会发现排查网络问题的能力会明显上一个台阶。希望这篇文章能帮你在遇到链路故障时少走一些弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑