2.7.1 常见网络故障排查流程与工具集

常见网络故障排查应遵循“现象确认—范围界定—定位层级—验证假设—恢复与复盘”的闭环流程。先收集业务症状(访问慢、连接失败、偶发抖动)、影响范围(单机/单网段/跨地域)、时间窗口与最近变更;再按分层模型定位(链路层、网络层、传输层、应用层),通过工具与日志交叉验证,最终输出可复用的排障结论与防复发措施。

一、排查流程原理草图

文章图片

二、标准排查流程(含示例)
1. 确认现象与SLA:明确失败类型、影响用户比例、开始时间与恢复时间。
示例:记录故障窗口与用户报错截图,确认是超时还是拒绝。
2. 界定范围:同机房/跨机房、内网/公网、单业务/多业务;比对正常节点作为基线。
示例:同业务不同节点对比延迟与丢包。
3. 定位层级
- L1/L2:链路状态、网卡、交换机端口
- L3:IP、路由、网关、ARP
- L4:端口、TCP状态、连接数
- L7:协议/应用响应、证书、负载
4. 验证假设:用工具复现与对比,排除偶发与误报。
5. 恢复与复盘:临时绕行/切流/限流,最终修复并记录根因与监控改进。

三、工具集安装与基础用法
- 工具安装(Debian/Ubuntu)

sudo apt update
sudo apt install -y iproute2 iputils-ping traceroute mtr-tiny \
  dnsutils tcpdump lsof ethtool curl netcat-openbsd
  • 工具安装(RHEL/CentOS)
sudo yum install -y iproute iputils traceroute mtr bind-utils \
  tcpdump lsof ethtool curl nc

四、关键命令与示例(含解释)

1)连通性与路径

# ping:-c 次数,-i 间隔,-W 超时(秒)
ping -c 4 -i 0.2 -W 1 10.0.0.10

# tracepath:显示路径与MTU
tracepath 10.0.0.10

# mtr:持续探测,-r 报告模式,-c 次数
mtr -r -c 20 10.0.0.10

预期:
- ping 显示丢包率与平均延迟
- tracepath 显示每一跳与PMTU
- mtr 可定位丢包发生的跳点

2)接口与链路状态

# ip a:查看地址与网卡UP/DOWN
ip a show dev eth0

# ip link:查看状态与错误包
ip -s link show dev eth0

# ethtool:查看速率/双工/链路
sudo ethtool eth0

解释:ip -s linkRX errors/TX errors 增长通常是链路层问题(网线/模块/协商失败)。

3)路由与ARP/邻居表

# 查看路由
ip r

# 查看邻居表(ARP)
ip neigh

# 清理异常ARP条目(谨慎)
sudo ip neigh del 10.0.0.1 dev eth0

解释:ARP表反复变化或出现同IP不同MAC,需排查ARP冲突。

4)端口与会话

# ss:-l 监听,-n 数字化,-t TCP,-p 进程
ss -lntp

# 查看特定端口连接状态
ss -antp | grep ':3306'

# lsof:查看占用端口的进程
sudo lsof -iTCP:3306 -sTCP:LISTEN

解释:大量 SYN-SENT/SYN-RECV 通常表示握手未完成;TIME_WAIT 激增可能是短连接过多。

5)DNS排错

# dig:+trace 追踪解析路径,+short 简洁输出
dig +trace www.example.com
dig www.example.com +short

# resolvectl:查看系统DNS
resolvectl status

解释:不同节点解析结果不一致可能是上游DNS缓存或污染。

6)应用层探测

# curl:-v 显示握手与响应头,-m 超时
curl -v -m 3 http://10.0.0.10:8080/health

# nc:探测端口连通性
nc -vz 10.0.0.10 8080

解释:curl 卡在 TLS handshakewaiting for response 可定位到应用层或证书问题。

7)抓包与过滤

# tcpdump:-i 接口,-nn 不解析,-s0 全包,-w 写入文件
sudo tcpdump -i eth0 -nn -s0 host 10.0.0.10 and port 8080 -w /tmp/http_8080.pcap

# 读取抓包文件并过滤RST
sudo tcpdump -nn -r /tmp/http_8080.pcap 'tcp[tcpflags] & tcp-rst != 0'

解释:抓包用于确认TCP握手、重传、RST与TLS握手阶段。

五、典型故障排查脚本(示例)

#!/usr/bin/env bash
# 文件: /usr/local/bin/netcheck.sh
# 用途: 快速收集网络排查信息

HOST=${1:-10.0.0.10}
PORT=${2:-8080}
IFACE=${3:-eth0}

echo "== 时间 =="
date

echo "== 接口状态 =="
ip -s link show dev "$IFACE"

echo "== 路由表 =="
ip r

echo "== ARP/邻居表 =="
ip neigh | head -n 20

echo "== 连通性 =="
ping -c 3 -W 1 "$HOST"

echo "== 端口连通 =="
nc -vz "$HOST" "$PORT"

echo "== 会话状态 =="
ss -antp | grep ":$PORT" | head -n 10

执行与预期:

chmod +x /usr/local/bin/netcheck.sh
/usr/local/bin/netcheck.sh 10.0.0.10 8080 eth0

预期输出包含接口错误包、路由、ARP、连通性与端口状态,便于快速定位层级。

六、故障模式与排错要点(含操作示例)

  • 访问超时
    排查:先 ping/mtr 看丢包,再查路由与MTU。
    示例:
mtr -r -c 20 10.0.0.10
tracepath 10.0.0.10

若路径中某跳丢包高或 PMTU 过小,进一步排查链路或防火墙策略。

  • 连接被拒绝 (Connection refused)
    排查:端口是否监听/防火墙是否拦截。
    示例:
ss -lntp | grep ':8080'
sudo iptables -L -n | grep 8080
  • 间歇性丢包
    排查:链路抖动、双工不匹配、端口错误包。
    示例:
ip -s link show dev eth0
sudo ethtool eth0 | egrep 'Speed|Duplex|Link'
  • 解析异常
    排查:不同DNS解析结果、缓存问题。
    示例:
dig www.example.com @8.8.8.8 +short
dig www.example.com @114.114.114.114 +short

七、排查结果输出模板(示例)

现象: 业务访问超时
影响范围: A机房所有Web节点
证据链: mtr显示第3跳丢包40%,tcpdump发现大量重传
根因: 交换机端口错误包激增导致丢包
修复: 更换端口与光模块
防复发: 增加端口错误包监控与自动告警

八、练习
1. 使用 mtr -r -c 50 分析本机到公网域名的路径与丢包率,输出结论。
2. 通过 ss -antp 找出本机 TIME_WAIT 数量较多的端口,并分析可能原因。
3. 使用 tcpdump 抓取访问某服务的握手与响应,定位是否有 RST。
4. 模拟 DNS 解析异常(修改 /etc/resolv.conf),比较 dig 的解析结果并恢复配置。