前言

“服务起不来”、“连不上数据库”、“网页打不开”——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 篇。