前言
“服务起不来”、“连不上数据库”、“网页打不开”——90% 的线上问题最后都指向网络。这篇整理 Linux 网络排查的命令工具链和标准流程。
一、看懂网络接口与 IP
老的 ifconfig/netstat 已逐步被 ip/ss 取代(iproute2 工具集):
# 查看网卡与 IP
ip addr # 简写 ip a
ip -br addr # 精简模式, 一行一块网卡(推荐!)
# 输出示例:
# lo UNKNOWN 127.0.0.1/8
# eth0 UP 10.0.4.13/24
关键信息:网卡名(eth0/ens5)、状态(UP)、IP 与掩码(/24 = 255.255.255.0)。
# 查看路由表(下一跳在哪里)
ip route # default via 10.0.4.1 dev eth0
# 查看网卡统计(丢包、错误)
ip -s link show eth0
临时改 IP(重启失效,永久改用 nmcli 或写配置文件):
ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up/down
RHEL 系永久配置用 NetworkManager:
nmcli con show # 看连接名
nmcli con mod "System eth0" ipv4.addresses 10.0.4.13/24
nmcli con up "System eth0"
二、端口与连接:ss
# 监听中的端口(-t tcp, -u udp, -l listen, -n 数字, -p 进程)
ss -tlnp
# 所有 TCP 连接(含状态)
ss -tan
# 谁连着我的 3306
ss -tnp state established '( dport = :3306 )'
# 统计各状态连接数(TIME_WAIT 堆积?)
ss -tan | awk '{print $1}' | sort | uniq -c
TCP 状态速查(排查必背):
| 状态 | 含义 | 大量出现说明 |
|---|---|---|
| LISTEN | 服务在等连接 | 正常 |
| ESTAB | 连接建立中 | 正常(活跃连接) |
| TIME_WAIT | 主动关闭后的等待期 | 短连接太频繁,考虑连接池/长连接 |
| CLOSE_WAIT | 对端关了,本端还没关 | 代码没调 close(),查应用 bug |
| SYN_RECV | 半连接 | 可能是 SYN 攻击 |
三、连通性测试
# ICMP 连通性(防火墙可能禁 ping, 不通不代表挂了)
ping -c 4 8.8.8.8
# 端口级探测(比 ping 更贴近业务)
curl -v telnet://10.0.4.5:3306 # 试试 3306 通不通
nc -zv 10.0.4.5 3306 # -z 只测端口
timeout 2 bash -c '</dev/tcp/10.0.4.5/3306' && echo OK
# 路径追踪: 看卡在哪一跳
traceroute -n 8.8.8.8
mtr 8.8.8.8 # traceroute + ping 持续统计(更好用)
# DNS 检查
dig +short antidebug.cn # 解析出 IP 即正常
dig @114.114.114.114 antidebug.cn # 指定 DNS 服务器
nslookup antidebug.cn
四、防火墙
# firewalld(RHEL 系默认)
systemctl is-active firewalld
firewall-cmd --list-all # 当前开放情况
firewall-cmd --add-service=http --permanent # 放行 80
firewall-cmd --add-port=8080/tcp --permanent # 放行自定义端口
firewall-cmd --reload # 重载生效
# nftables / iptables 底层规则
nft list ruleset | head -30
iptables -L -n | head -20
⚠️ 云服务器还有第三层"墙":云平台安全组。本机防火墙全关也可能因安全组没放行而连不上——排查时先看安全组。
五、标准排查流程:端口不通的六步法
以"外部访问 http://服务器IP:8080 不通"为例:
# 1. 进程在吗? 端口在听吗?
ss -tlnp | grep 8080
# 2. 本机能通吗?(排除应用自身问题)
curl -I http://127.0.0.1:8080
# 3. 本机防火墙放行了吗?
firewall-cmd --list-all | grep 8080
# 4. 云安全组放行了吗?(控制台看, 这步最常被忽略)
# 5. 从外部探测
nc -zv 服务器IP 8080
# 6. 抓包看真相(终极手段)
tcpdump -i any -nn port 8080 -c 50
九成问题在第 1、3、4 步就现形:要么进程没起来/只监听了 127.0.0.1,要么是墙没放行。
六、容易踩的坑
| 现象 | 原因 |
|---|---|
| 服务本机 curl 通、外部不通 | 进程只监听 127.0.0.1,要改成 0.0.0.0 |
| ping 通但端口不通 | ICMP 与 TCP 是两回事,端口有防火墙/安全组拦截 |
| 改了 DNS 不生效 | systemd-resolved 有缓存;resolvectl flush-caches |
| TIME_WAIT 几万个 | 短连接风暴,应用侧上连接池或内核调参 |
小结
排查网络问题,按"进程 → 本机 → 防火墙 → 安全组 → 外部 → 抓包“六步走,基本无死角。ip -br a、ss -tlnp、curl -v、tcpdump 是必须形成肌肉记忆的四个命令。
本文是「Linux 基础」系列第 5 篇。