返回首页

服务器网络排障方法论 — 分层定位七步法

📅 创建于 2026-05-11 🔄 更新于 2026-05-29 📝 806 字

服务器网络排障方法论

网络排查的核心思路:分层定位,从近到远,从本机到对端。 把自己能控制的先排除干净,再去找网络运营商或机房。

七步排查法

① 确认问题范围

不要急着登服务器:

  • 从另一台机器 ping 目标服务器,确认是否局部问题
  • 让同事也试试,排除个人网络故障
  • 云服务器先看控制台监控(CPU/带宽/丢包率)

常见翻车: 排查半天发现是自己电脑 WiFi 断了。

② 控制台登录

SSH 连不上时用云厂商的远程控制台(VNC/KVM)登入,相当于坐在机房显示器前。SSH 服务安全配置参见 ssh-brute-force-protection-guide

③ 本机排查:IP / 网卡 / 路由 / DNS

网卡状态:

ip addr show                    # 查看 IP 和 UP/DOWN 状态
ip link set eth0 up             # 拉起网卡

默认路由:

ip route show                   # 确认有 default via 行
# 临时修复
ip route add default via 192.168.1.1 dev eth0

无 default 路由 = 所有外网访问全部失败。

DNS 解析:

nslookup www.baidu.com
dig www.baidu.com
cat /etc/resolv.conf

经典故障:IP 能 ping 通,域名 ping 不通 → 这是 DNS 问题,不是网络问题。

④ 防火墙 & iptables

本机 IP、路由、DNS 都正常但服务访问不了?八成是防火墙。

# Firewalld(CentOS 7+)
firewall-cmd --list-all
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

# iptables
iptables -L -n -v
iptables-save > /root/iptables.bak    # 操作前先备份!

⚠️ --permanent 不加的话,重启就全没了。 生产环境操作 iptables 前一定先备份,误操作锁死自己连控制台都救不回来。

⑤ 服务端口:网络 vs 服务

别急着怀疑网络——先确认服务是否在监听:

ss -tlnp                              # 查看端口监听
curl http://127.0.0.1:8080            # 本地测试
telnet 127.0.0.1 8080

排查逻辑:

  • 本机 curl 127.0.0.1 通 → 服务正常,问题在网络层
  • 本机 curl 127.0.0.1 不通 → 服务没起来,查日志
  • ss -tlnp 看不到端口 → 服务进程挂了

⑥ 向外追踪:ping / traceroute / tcpdump

ping 与丢包监控:

ping -I eth0 8.8.8.8                  # 多网卡指定网卡
ping 192.168.1.1 | while read line; do echo "$(date): $line"; done

traceroute 定位故障跳数:

traceroute -n www.baidu.com           # ICMP
traceroute -T -p 80 www.baidu.com     # TCP(绕过 ICMP 过滤)

某一跳之后全部超时 = 上游设备故障。

tcpdump 终极抓包:

tcpdump -i eth0 port 8080 -nn         # 实时监控
tcpdump -i eth0 host x.x -w /tmp/a.pcap  # 存文件分析

tcpdump 能看到的 ping 和 telnet 看不到的细节:SYN 无 ACK(对端防火墙拦了)、握手完成无响应(服务卡死)、只有出包无入包(路由问题)。

⑦ 云服务器:安全组 & VPC

系统防火墙和云安全组是两层独立的墙。iptables 全放通了仍访问不了?查安全组:

  • 入方向:是否允许来源 IP 访问目标端口
  • 出方向:是否被误设为拒绝
  • VPC 路由表:多网卡/多子网环境是否正确

云服务器排查口诀: 安全组 → 系统防火墙 → 服务监听 → 路由

命令速查表

类别 命令 用途
网卡 ip addr show 查看 IP/状态
ip link set eth0 up 拉起网卡
路由 ip route show 查看路由表
mtr -r -c 10 目标IP 持续监控丢包(推荐)
DNS nslookup www.baidu.com 测试 DNS
dig @8.8.8.8 www.baidu.com 指定 DNS 服务器
防火墙 firewall-cmd --list-all firewalld 规则
iptables -L -n -v iptables 规则
iptables-save > bak 备份(必做)
抓包 tcpdump -i eth0 port 8080 -nn 实时抓包
tcpdump -i eth0 host x -w a.pcap 存文件分析

配置持久化排查:ONBOOT & NetworkManager

网络恢复后配置丢失,重启后故障复现,最常见的原因是 配置文件持久化问题

检查网卡配置文件

# CentOS/RHEL
cat /etc/sysconfig/network-scripts/ifcfg-eth0

# 关键字段
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes          # 必须为 yes,否则重启后网卡不启动
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8

ONBOOT=no 是网络重启后反复不通的最常见原因——部署脚本或系统更新可能误改此字段。

NetworkManager 冲突排查

# 检查 NM 与 network 服务是否冲突
systemctl status NetworkManager
systemctl status network

# 查看 NM 事件时间线
journalctl -u NetworkManager --since "2 hours ago" | grep -i eth0

# 或查看系统日志
grep -i "eth0\|network" /var/log/messages | tail -50

双服务运行场景:NetworkManager 可能覆盖 network 服务的配置,导致 /etc/sysconfig/network-scripts/ 中的静态配置不生效。可在 /etc/sysconfig/network-scripts/ifcfg-eth0NM_CONTROLLED=no 让 NM 不接管该网卡。

修复后验证

# 1. 修改 ifcfg-eth0 后重启网络
systemctl restart network

# 2. 确认启动后配置正确
ip addr show eth0
ip route show
ping -c 4 8.8.8.8
curl -I https://www.baidu.com

# 3. 重启机器做最终验证(模拟故障复发场景)
reboot

排障决策树

网络不通
 │
 ├─ ping 127.0.0.1 ──> 不通 ──> 协议栈/内核问题
 │
 ├─ ping 网关 ──> 不通
 │    │
 │    ├─ ip link show ──> DOWN ──> 网卡没启动
 │    ├─ ip addr show ──> 无IP ──> IP 未配置
 │    └─ ip route show ──> 无默认路由 ──> 路由缺失
 │
 ├─ ping 外网IP通,域名不通
 │    └─ /etc/resolv.conf ──> DNS 配置丢失
 │
 └─ 根因追查
      ├─ 配置文件 ONBOOT=no
      ├─ NetworkManager 与 network 服务冲突
      └─ journalctl 时间线溯源

网络排障是运维排障的基础层。按问题类型选择入口:

问题表现 优先排查路线 参考页面
服务器网络不通 本七步法 本文
502/504 / Nginx 代理异常 网络排障 → Nginx 配置排查 nginx-config-pitfalls
应用性能慢 / 接口超时 网络排障 → 全栈性能排障 fullstack-performance-troubleshooting
K8s 内 Pod 间不通 K8s Service / NetworkPolicy 排查 service-troubleshooting
K8s 服务访问 502/504 超时 K8s 服务访问排查十步工作流 k8s-service-access-troubleshooting
Keepalived VIP 不漂移 VRRP 网络排查(tcpdump vrrp) keepalived-nginx-ha

实战案例

现象: telnet 服务器 8080 端口报 Connection refused。

  1. ss -tlnp → 8080 正常监听 ✅
  2. curl 127.0.0.1:8080 → 正常返回 ✅(服务没问题)
  3. firewall-cmd --list-all → 8080 不在开放端口列表 ❌
  4. --permanent 规则 + reload → 解决 ✅

复盘: 部署新服务的人只加了 firewalld 临时规则(未加 --permanent),重启后规则丢失。

关联页面

页面关联点
linux-nfs-mount-parameters-guideNFS 挂载参数全解析(NFS 依赖网络层,排障需要网络视角)
container-networking-troubleshooting容器网络排障 6 层模型(K8s/Docker/containerd 统一排查体系,补充容器网络维度)
k8s-coredns-custom-domain-resolutionCoreDNS 自定义域名解析(DNS 层排障的分层视角)
tcp-connection-attack-vs-bugTCP 连接数爆表排查:攻击 vs Bug
nfs-troubleshooting-sopNFS 故障排查 SOP — 7 步排查法 / 6 类故障 / 4 大实战案例 / 生产最佳实践
linux-kernel-tuning-guideLinux 高并发内核优化手册 — 文件句柄/网络/内存/安全四维调优(含 sysctl 配置模板)
dns-troubleshooting-practical-guideDNS 故障排查实战指南 — dig/nslookup 工具详解、四阶段排查流程、SERVFAIL/
online-troubleshooting-checklist四维排查速查清单(CPU/磁盘/内存/网络 + Java 工具 jstack/jmap/jstat/tcpdump)