Linux 服务器网络问题常见排查思路
服务器“网络不通了”“访问特别慢”“端口连不上”——这些告警消息几乎每天都会在群里刷屏。网络问题不像CPU/内存那么直观,排查起来经常让人抓狂,因为它涉及物理层到应用层多个环节,任何一环出问题都可能导致整条链路失效。
今天这篇文章就来系统梳理一下Linux服务器网络问题的常见排查思路。我把思路按“从底层到上层、从本地到远程、从简单到复杂”的原则组织,配上最实用的命令和场景案例。
一、排查前的黄金思维:分层 + 定位影响范围
网络故障排查最怕“乱抓药”,正确的姿势是遵循OSI七层模型(或TCP/IP四层)逐层向下/向上验证,同时快速判断是单机问题、本机房问题、还是全网/运营商问题。
常见症状分类:
- 完全不通(ping不通任何地址)
- 内网通外网不通
- 特定域名/IP不通
- 能ping通但应用超时/慢
- 间歇性抖动/丢包
- 端口打不开(telnet/ nc失败)
快速判断影响范围的小技巧:
- 多台机器同时出问题 → 优先查交换机/防火墙/出口路由/运营商
- 只一台机器 → 优先查本机配置、防火墙、进程
- 部分IP通部分不通 → 路由、防火墙策略、MTU
二、基础连通性检查(5分钟搞定80%简单问题)
2.1 检查物理层 & 数据链路层
先确认“网线有没有插好”——听起来low,但真的救过无数次命。
命令:
# 查看所有网卡状态(现代首选 ip,取代 ifconfig)
ip link show
# 或简写
ip -c a # -c 带颜色,更好看
# 重点看:UP状态、LOWER_UP(物理链路是否up)、mtu是否异常
# 如果是ens33/eth0 DOWN了:
ip link set eth0 up检查网卡是否获取到IP(DHCP或静态):
ip addr show eth0
# 没IP?手动up或重启网络服务(不同发行版不同)
systemctl restart NetworkManager # CentOS 7+/Ubuntu
systemctl restart networking # Debian老版本2.2 本地环回测试
ping 127.0.0.1 # 本地TCP/IP栈是否正常
ping localhost失败 → 极少见,通常是内核或网络模块加载问题,重启或modprobe即可。
2.3 内网连通性
# ping同网段其他机器(找一台已知正常的)
ping 192.168.1.100
# ping网关(默认网关)
ip route | grep default # 先看默认网关是谁
ping <网关IP>网关不通 → 检查交换机端口、VLAN、网线、ARP表(arp -a)。
三、网络层核心排查(IP路由 & DNS)
3.1 检查路由表
ip route show
# 或 route -n(老命令)
# 常见问题:默认路由丢失或错误
# 临时添加默认路由
ip route add default via 192.168.1.1 dev eth03.2 测试路径(traceroute/mtr神器)
# 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解析问题(最常见之一)
# 测试域名解析
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:
echo "nameserver 8.8.8.8" > /etc/resolv.conf四、传输层 & 应用层排查(端口、连接、防火墙)
4.1 检查监听端口
# 现代首选 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:
firewall-cmd --list-all
iptables -L -n -vUbuntu:
ufw status
iptables -L -n -vnftables(新系统):
nft list ruleset临时关防火墙测试(生产慎用):
systemctl stop firewalld
iptables -F4.3 连接状态 & 半连接
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(网络瑞士军刀)
抓特定端口:
tcpdump -i eth0 port 80 -nn -c 100
tcpdump -i any host 1.2.3.4 and port 443 -w capture.pcap抓DNS:
tcpdump -i eth0 port 53抓HTTP请求:
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场景)
六、常见网络故障场景速查表
- 完全断网 → 物理 → 网卡up → IP → 路由 → 网关ping
- 外网不通内网通 → 默认路由 → DNS → 出口防火墙/NAT
- 域名解析慢/失败 → /etc/resolv.conf → dig @114.114.114.114 测试
- 端口不通 → ss检查监听 → 防火墙 → SELinux(getenforce) → 服务绑定地址
- 间歇性丢包/高延迟 → mtr定位丢包点 → MTU问题(ping -M do -s 1472) → 网卡offload关闭
- 连接数爆表/慢 → ss统计 → ulimit -n → tcp backlog → TIME_WAIT优化
- 被墙/运营商劫持 → traceroute对比正常机器 → 换DNS/走代理
七、一键概览脚本(直接复制用)
#!/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),改完记得验证并持久化。遇到复杂问题别死磕,及时拉网络/安全/开发同学一起看。