Linux 服务器网络问题常见排查思路

Linux 服务器网络问题常见排查思路

服务器“网络不通了”“访问特别慢”“端口连不上”——这些告警消息几乎每天都会在群里刷屏。网络问题不像CPU/内存那么直观,排查起来经常让人抓狂,因为它涉及物理层到应用层多个环节,任何一环出问题都可能导致整条链路失效。

今天这篇文章就来系统梳理一下Linux服务器网络问题的常见排查思路。我把思路按“从底层到上层、从本地到远程、从简单到复杂”的原则组织,配上最实用的命令和场景案例。

一、排查前的黄金思维:分层 + 定位影响范围

网络故障排查最怕“乱抓药”,正确的姿势是遵循OSI七层模型(或TCP/IP四层)逐层向下/向上验证,同时快速判断是单机问题、本机房问题、还是全网/运营商问题

常见症状分类:

  • 完全不通(ping不通任何地址)
  • 内网通外网不通
  • 特定域名/IP不通
  • 能ping通但应用超时/慢
  • 间歇性抖动/丢包
  • 端口打不开(telnet/ nc失败)

快速判断影响范围的小技巧:

  • 多台机器同时出问题 → 优先查交换机/防火墙/出口路由/运营商
  • 只一台机器 → 优先查本机配置、防火墙、进程
  • 部分IP通部分不通 → 路由、防火墙策略、MTU

二、基础连通性检查(5分钟搞定80%简单问题)

2.1 检查物理层 & 数据链路层

先确认“网线有没有插好”——听起来low,但真的救过无数次命。

命令:

Bash
# 查看所有网卡状态(现代首选 ip,取代 ifconfig)
ip link show
# 或简写
ip -c a    # -c 带颜色,更好看

# 重点看:UP状态、LOWER_UP(物理链路是否up)、mtu是否异常
# 如果是ens33/eth0 DOWN了:
ip link set eth0 up

检查网卡是否获取到IP(DHCP或静态):

Bash
ip addr show eth0
# 没IP?手动up或重启网络服务(不同发行版不同)
systemctl restart NetworkManager   # CentOS 7+/Ubuntu
systemctl restart networking       # Debian老版本

2.2 本地环回测试

Bash
ping 127.0.0.1          # 本地TCP/IP栈是否正常
ping localhost

失败 → 极少见,通常是内核或网络模块加载问题,重启或modprobe即可。

2.3 内网连通性

Bash
# ping同网段其他机器(找一台已知正常的)
ping 192.168.1.100

# ping网关(默认网关)
ip route | grep default     # 先看默认网关是谁
ping <网关IP>

网关不通 → 检查交换机端口、VLAN、网线、ARP表(arp -a)。

三、网络层核心排查(IP路由 & DNS)

3.1 检查路由表

Bash
ip route show
# 或 route -n(老命令)

# 常见问题:默认路由丢失或错误
# 临时添加默认路由
ip route add default via 192.168.1.1 dev eth0

3.2 测试路径(traceroute/mtr神器)

Bash
# traceroute(追踪到目标的每一跳)
traceroute 8.8.8.8
traceroute www.google.com

# 更推荐 mtr(实时丢包+延迟统计)
mtr -r -c 100 8.8.8.8     # -r report模式,-c 发100包

mtr哪里开始丢包/延迟飙升,基本就能定位到是机房出口、运营商节点还是目标侧。

3.3 DNS解析问题(最常见之一)

Bash
# 测试域名解析
nslookup www.baidu.com
dig www.baidu.com @8.8.8.8     # 指定公共DNS

# 查看本机DNS配置
cat /etc/resolv.conf

# 常见坑:
# 1. resolv.conf被覆盖(NetworkManager或systemd-resolved)
# 2. /etc/hosts 有错误条目
# 3. DNS服务器不可达

解决方案:临时写死公共DNS:

Bash
echo "nameserver 8.8.8.8" > /etc/resolv.conf

四、传输层 & 应用层排查(端口、连接、防火墙)

4.1 检查监听端口

Bash
# 现代首选 ss(取代 netstat)
ss -tuln                     # -t TCP, -u UDP, -l listening, -n numeric
ss -tunlp                    # +p 显示进程PID

# netstat -tunlp(如果还装着的话)

没看到LISTEN?说明服务没起来或没绑定正确IP(0.0.0.0 vs 127.0.0.1)。

4.2 检查防火墙(最常被忽略的坑)

CentOS/RHEL:

Bash
firewall-cmd --list-all
iptables -L -n -v

Ubuntu:

Bash
ufw status
iptables -L -n -v

nftables(新系统):

Bash
nft list ruleset

临时关防火墙测试(生产慎用):

Bash
systemctl stop firewalld
iptables -F

4.3 连接状态 & 半连接

Bash
ss -ant                        # 所有TCP连接
ss -ant | grep ESTAB           # 活跃连接
ss -s                          # 统计摘要

# TIME_WAIT过多?常见于高并发短连接
netstat -ant | grep TIME_WAIT | wc -l

调优:调低 net.ipv4.tcp_fin_timeout 等参数。

五、高级抓包 & 深度分析(当以上都正常但还是有问题)

5.1 tcpdump(网络瑞士军刀)

抓特定端口:

Bash
tcpdump -i eth0 port 80 -nn -c 100
tcpdump -i any host 1.2.3.4 and port 443 -w capture.pcap

抓DNS:

Bash
tcpdump -i eth0 port 53

抓HTTP请求:

Bash
tcpdump -i eth0 -A -s 0 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

5.2 其他高级工具

  • ethtool:查看网卡协商速率、丢包统计
    Bash
    ethtool eth0
    ethtool -S eth0     # 统计
  • nload / iftop:实时流量监控
  • sar -n DEV:历史网络吞吐(需sysstat)
  • conntrack:查看NAT连接跟踪(ipvs/nat场景)

六、常见网络故障场景速查表

  1. 完全断网 → 物理 → 网卡up → IP → 路由 → 网关ping
  2. 外网不通内网通 → 默认路由 → DNS → 出口防火墙/NAT
  3. 域名解析慢/失败 → /etc/resolv.conf → dig @114.114.114.114 测试
  4. 端口不通 → ss检查监听 → 防火墙 → SELinux(getenforce) → 服务绑定地址
  5. 间歇性丢包/高延迟 → mtr定位丢包点 → MTU问题(ping -M do -s 1472) → 网卡offload关闭
  6. 连接数爆表/慢 → ss统计 → ulimit -n → tcp backlog → TIME_WAIT优化
  7. 被墙/运营商劫持 → traceroute对比正常机器 → 换DNS/走代理

七、一键概览脚本(直接复制用)

Bash
#!/bin/bash
echo "=== 网络接口 ==="; ip -c a
echo "=== 默认路由 ==="; ip route | grep default
echo "=== 监听端口 ==="; ss -tunlp
echo "=== 防火墙状态 ==="; iptables -L -n | head -10; [ -f /usr/sbin/firewall-cmd ] && firewall-cmd --list-all
echo "=== DNS配置 ==="; cat /etc/resolv.conf
echo "=== ping外网 ==="; ping -c 3 8.8.8.8
echo "=== 当前连接数 ==="; ss -s

结语

网络问题排查的核心是“结构化 + 快速排除法”:先用最简单的命令确认最基础的几层是否OK,再逐步深入。90%的线上网络故障,都能在 ping → ip a → ss → traceroute → tcpdump 这套组合拳里找到答案。

最后提醒一句:生产环境改配置前一定要备份(iptables-save > rules.bak),改完记得验证并持久化。遇到复杂问题别死磕,及时拉网络/安全/开发同学一起看。

Telegram
Telegram@IDCSELL