Linux 网络故障排查终极教程:ping/traceroute/mtr + tcpdump/wireshark 实战

2026-01-22 07:02:56 16阅读

网络故障排查的核心逻辑是 “先定位范围,再深挖根因”—— 从 “通不通” 到 “哪里断”,再到 “数据包哪里异常”,逐步缩小排查维度。本文结合 5 个高频故障场景,详解 ping、traceroute、mtr、tcpdump、wireshark 的核心用法,所有案例均来自企业级运维实战,可直接复刻操作。

一、基础连通性检测:ping 命令(快速判断 “网络可达性”)

ping 基于 ICMP 协议,是排查网络故障的 “第一步”,核心解决 “目标主机是否能访问” 的问题。

1. 核心用法与参数(实战高频)

\# 基础用法:无限发送ICMP包,Ctrl+C终止
ping www.baidu.com
ping 192.168.1.100
\# 实用参数组合(避免无限循环+精准测试)
ping -c 5 -i 1 -w 3 www.baidu.com  # -c:发5个包;-i:间隔1秒;-w:超时3秒
ping -s 1024 -n 192.168.1.1        # -s:包大小1024字节;-n:只显IP不解析主机名(提速)
ping -f 192.168.1.100              # -f:洪水ping(测试链路承载能力,谨慎使用)

2. 输出结果解读(3 个关键指标)

\# 正常输出示例
PING www.baidu.com (14.215.177.38) 56(84) bytes of data.
64 bytes from 14.215.177.38: icmp\_seq=1 ttl=55 time=11.2 ms
64 bytes from 14.215.177.38: icmp\_seq=2 ttl=55 time=10.8 ms
64 bytes from 14.215.177.38: icmp\_seq=3 ttl=55 time=11.5 ms
\--- www.baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 10.823/11.189/11.541/0.301 ms

3. 实战案例:ping 不通目标主机场景

服务器 A(192.168.1.20)ping 服务器 B(192.168.1.30)显示100% packet loss,但同网段其他服务器可 ping 通 B。

排查步骤

\# 1. 确认目标主机是否在线(登录同网段服务器测试)
ping -c 3 192.168.1.30  # 若能通,说明问题在服务器A
\# 2. 检查服务器A的网卡配置
ip addr  # 确认IP是否在192.168.1.0/24网段,网卡是否UP
\# 3. 检查服务器A的防火墙(是否拦截ICMP)
firewall-cmd --list-all | grep icmp  # CentOS
iptables -L -n | grep ICMP          # Ubuntu
\# 4. 若防火墙拦截,临时放行ICMP
firewall-cmd --add-icmp-block-inversion  # 放行所有ICMP

根因与解决

服务器 A 的 firewalld 默认禁用了 ICMP 协议,放行后 ping 恢复正常。

二、路由跟踪:traceroute + mtr(定位 “故障节点”)

ping 只能判断 “通不通”,但无法知道 “哪里断了”。traceroute 跟踪数据包转发路径,mtr 持续监控路由质量,两者结合可精准定位故障节点。

(一)traceroute:跟踪路由跳转1. 核心用法与参数

\# 安装(CentOS默认未安装)
yum install -y traceroute
\# 基础用法:跟踪目标域名/IP
traceroute www.baidu.com
traceroute 192.168.3.50
\# 解决UDP被拦截的问题(用TCP模式)
traceroute -T -p 80 www.baidu.com  # -T:TCP模式;-p:指定端口80
traceroute -n -w 2 192.168.3.50    # -n:显IP不解析;-w:每跳超时2秒

2. 输出结果解读

traceroute to www.baidu.com (14.215.177.38), 30 hops max, 60 byte packets
 1  192.168.1.1 (192.168.1.1)  0.45 ms  0.42 ms  0.39 ms  # 本地路由器
 2  10.0.0.1 (10.0.0.1)  2.13 ms  2.09 ms  2.05 ms        # 运营商网关
 3  \* \* \*                                                # 该节点禁用ICMP响应(正常)
 4  223.5.5.5 (223.5.5.5)  10.2 ms  10.1 ms  9.8 ms      # 阿里云节点
 5  14.215.177.38 (14.215.177.38)  12.3 ms  12.1 ms  11.9 ms  # 目标主机

(二)mtr:持续监控路由质量(ping+traceroute 结合体)1. 核心用法与参数

\# 安装
yum install -y mtr
\# 基础用法:持续监控,Ctrl+C终止
mtr www.baidu.com
mtr 192.168.3.50
\# 生成统计报告(发送100个包后退出)
mtr -c 100 -w 192.168.3.50 > /tmp/mtr\_report.txt  # -w:简洁报告;-c:包数量

2. 输出结果解读(重点看丢包率)

HOST: localhost  Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 192.168.1.1          0.0%   100    0.5    0.6    0.4    1.2    0.1
  2.|-- 10.0.0.1             5.0%   100    2.1    2.3    2.0    3.8    0.3  # 5%丢包
  3.|-- 223.5.5.5            0.0%   100   10.2   10.5    9.8   15.3    0.8

3. 实战案例:跨网段访问超时场景

服务器 A(192.168.1.20)访问服务器 C(192.168.3.50)超时,ping 和 traceroute 结果如下:

traceroute 192.168.3.50
 1  192.168.1.1 (192.168.1.1)  0.5 ms  0.4 ms  0.4 ms
 2  \* \* \*
 3  \* \* \*

排查步骤

\# 1. 用mtr持续监控,确认故障节点
mtr -T -p 80 192.168.3.50  # TCP模式避免被拦截
\# 2. 检查服务器A的路由配置
ip route show  # 确认是否有192.168.3.0/24的静态路由
\# 3. 若路由缺失,添加静态路由
ip route add 192.168.3.0/24 via 192.168.1.1 dev eth0
\# 4. 验证路由是否生效
ip route show | grep 192.168.3.0/24

根因与解决

服务器 A 缺少 192.168.3.0/24 的静态路由,添加后跨网段访问恢复正常。

三、抓包分析:tcpdump + wireshark(深挖 “协议层问题”)

当 ping/traceroute 确认网络连通,但应用服务(如 Web、数据库)无法访问时,需通过抓包分析 “数据包是否正常传输、协议是否异常”。

(一)tcpdump:Linux 命令行抓包(服务器端必备)1. 核心用法与过滤规则

\# 基础用法:捕获所有网卡数据包(Ctrl+C终止)
tcpdump
\# 精准抓包(常用组合)
tcpdump -i eth0 host 192.168.1.20 and port 3306  # 捕获eth0网卡、目标IP+端口3306(MySQL)
tcpdump -i eth0 tcp and src 192.168.1.20 -w /tmp/mysql.pcap  # 保存抓包文件
tcpdump -r /tmp/mysql.pcap  # 读取保存的抓包文件
\# 过滤规则进阶
tcpdump -i eth0 not arp and not icmp  # 排除ARP和ICMP包
tcpdump -i eth0 tcp flags syn  # 只捕获TCP SYN包(发起连接)
tcpdump -i eth0 tcp port 80 and host 14.215.177.38  # 捕获HTTP流量

2. 输出结果解读(TCP 三次握手示例)

tcpdump -i eth0 tcp and host 192.168.1.20 and port 80
10:30:45.123456 IP 192.168.1.20.54321 > 14.215.177.38.80: Flags \[S], seq 12345, win 65535  # SYN(发起连接)
10:30:45.124567 IP 14.215.177.38.80 > 192.168.1.20.54321: Flags \[S.], seq 67890, ack 12346  # SYN+ACK(响应)
10:30:45.124678 IP 192.168.1.20.54321 > 14.215.177.38.80: Flags \[.], ack 67891  # ACK(确认连接)

(二)wireshark:图形化分析(可视化更直观)

tcpdump 适合服务器端抓包,wireshark 适合图形化分析,支持协议解析、过滤、统计,是排查复杂问题的 “终极工具”。

1. 基础操作流程

安装:官网下载(),支持 Windows/Linux/Mac;

选择网卡:打开后选择抓包网卡(如 eth0),点击 “开始”;

设置过滤规则:过滤栏输入规则(与 tcpdump 互通,如ip.addr == ``192.168.1.20`` and tcp.port == 3306);

触发业务:如执行mysql -h ``192.168.1.30`` -u root -p,让 wireshark 捕获数据包;

停止抓包:点击 “停止”,分析数据包。

2. 核心过滤规则(实战高频)过滤规则作用

ip.addr == 192.168.1.20

只显示与该 IP 相关的包

tcp.port == 3306

只显示 MySQL 端口的包

tcp.flags.syn == 1

只显示 TCP 连接请求包

tcp.flags.reset == 1

只显示连接拒绝包

http.request

只显示 HTTP 请求包

ssl.handshake

只显示 HTTPS 握手包

3. 实战案例:MySQL 连接失败(协议层问题)场景

服务器 A(192.168.1.20)连接服务器 B(192.168.1.30)的 MySQL(3306 端口)失败,报错 “Connection refused”,ping 和 telnet 192.168.1.30 3306 显示端口开放。

排查步骤

\# 1. 在服务器A上用tcpdump抓包
tcpdump -i eth0 host 192.168.1.30 and port 3306 -w /tmp/mysql\_fail.pcap
\# 2. 下载pcap文件到本地,用wireshark打开
\# 3. 过滤规则:ip.addr == 192.168.1.30 and tcp.port == 3306

分析结果

wireshark 显示服务器 A 发送 SYN 包后,服务器 B 回复 RST 包(Flags ),说明 MySQL 服务拒绝连接。

根因与解决

登录服务器 B 查看 MySQL 配置,发现my.cnf中设置了bind-address = ``127.0.0.1(仅允许本地连接),修改为bind-address = ``0.0.0.0后重启 MySQL,连接恢复正常。

四、5 个高频故障排查流程(直接套用)故障 1:服务器无法访问外网

ping 8.8.8.8 → 若不通,检查默认网关(ip route show default);

若网关正确,用 traceroute 8.8.8.8 → 定位路由中断节点;

若网关错误,修改网卡配置文件(/etc/sysconfig/network-scripts/ifcfg-eth0)中的 GATEWAY;

重启网络:systemctl restart network。

故障 2:Web 服务访问超时(80 端口)

telnet 目标 IP 80 → 确认端口是否开放;

若端口开放,用 tcpdump 抓包:tcpdump -i eth0 host 目标IP and port 80 -w /tmp/web.pcap;

wireshark 分析:查看是否有三次握手、HTTP 请求是否有响应;

若只有 SYN 包无响应,检查目标服务器防火墙是否拦截 80 端口。

故障 3:HTTPS 访问报错 “证书无效”

用 wireshark 抓包:过滤规则ssl.handshake;

查看 SSL 握手过程,确认证书是否过期、域名是否匹配;

若证书不匹配,更换目标服务器的 HTTPS 证书。

故障 4:网络间歇性丢包(卡顿)

用 mtr 持续监控:mtr -c 200 -w 目标IP > /tmp/mtr.log;

查看 mtr 报告,找到丢包率 > 5% 的路由节点;

若为本地路由器,重启路由器;若为运营商节点,联系运营商处理。

故障 5:DNS 解析失败(域名无法访问)

nslookup 目标域名 → 确认 DNS 解析是否正常;

若解析失败,用 tcpdump 抓 DNS 包:tcpdump -i eth0 port 53 -w /tmp/dns.pcap;

wireshark 分析:查看 DNS 请求是否有响应,是否返回正确 IP;

若 DNS 服务器无响应,修改 /etc/resolv.conf,更换 DNS(如 223.5.5.5)。

五、避坑指南(新手必看)

ping 不通≠网络故障:很多服务器禁用 ICMP(如阿里云 ECS),此时用 telnet/nc 测试端口;

traceroute 的* * *不是故障:路由设备可能禁用 ICMP 响应,需结合 mtr 丢包率判断;

抓包时过滤无关数据:先明确故障场景(如 MySQL 连接),精准过滤 IP 和端口,避免数据包过多;

HTTPS 抓包需解密:需导出服务器 SSL 密钥,在 wireshark 中配置(编辑→首选项→Protocols→SSL);

跨网段故障先查路由:确认本地是否有目标网段的静态路由,路由器是否配置转发规则。

(注:文档部分内容可能由 AI 生成)

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。