服务器网络排障方法论
网络排查的核心思路:分层定位,从近到远,从本机到对端。 把自己能控制的先排除干净,再去找网络运营商或机房。
七步排查法
① 确认问题范围
不要急着登服务器:
- 从另一台机器 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-eth0 加 NM_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。
ss -tlnp→ 8080 正常监听 ✅curl 127.0.0.1:8080→ 正常返回 ✅(服务没问题)firewall-cmd --list-all→ 8080 不在开放端口列表 ❌- 加
--permanent规则 + reload → 解决 ✅
复盘: 部署新服务的人只加了 firewalld 临时规则(未加 --permanent),重启后规则丢失。
关联页面
| 页面 | 关联点 |
|---|---|
| linux-nfs-mount-parameters-guide | NFS 挂载参数全解析(NFS 依赖网络层,排障需要网络视角) |
| container-networking-troubleshooting | 容器网络排障 6 层模型(K8s/Docker/containerd 统一排查体系,补充容器网络维度) |
| k8s-coredns-custom-domain-resolution | CoreDNS 自定义域名解析(DNS 层排障的分层视角) |
| tcp-connection-attack-vs-bug | TCP 连接数爆表排查:攻击 vs Bug |
| nfs-troubleshooting-sop | NFS 故障排查 SOP — 7 步排查法 / 6 类故障 / 4 大实战案例 / 生产最佳实践 |
| linux-kernel-tuning-guide | Linux 高并发内核优化手册 — 文件句柄/网络/内存/安全四维调优(含 sysctl 配置模板) |
| dns-troubleshooting-practical-guide | DNS 故障排查实战指南 — dig/nslookup 工具详解、四阶段排查流程、SERVFAIL/ |
| online-troubleshooting-checklist | 四维排查速查清单(CPU/磁盘/内存/网络 + Java 工具 jstack/jmap/jstat/tcpdump) |