Linux ss 命令怎么排查网络连接异常?从监听端口到连接状态定位

先确认范围和风险

很多 Linux 服务器出问题时,管理员第一反应是查看 CPU、内存、磁盘空间,但如果故障表现为“请求变慢、登录卡顿、偶发连接失败、某个服务突然拒绝新连接”,网络连接状态往往更值得先看。ss 命令就是排查这类问题的基础工具,它可以快速查看监听端口、已建立连接、半连接、进程归属和 TCP 状态,比老工具 netstat 更快,也更适合现代 Linux 发行版。

Linux 服务器网络连接排障示意图
使用 ss 命令查看监听端口、连接状态和异常来源,是 Linux 网络排障的基础步骤。

排查前先明确一个原则:不要一上来就重启服务、清空防火墙或批量杀进程。网络连接异常可能来自业务高峰、攻击扫描、后端阻塞、连接泄漏、内核队列堆积,也可能只是客户端网络波动。正确做法是先用只读命令确认现场,把监听、连接数、状态分布和异常来源看清楚,再决定是否调整服务配置或限流。

查看端口是否真的在监听

如果某个服务访问不了,第一步不是猜防火墙,而是确认服务进程有没有监听目标端口。常用命令是:

ss -lntp

其中 -l 表示只看监听状态,-n 表示不要反查域名和服务名,避免排查时被 DNS 解析拖慢,-t 表示查看 TCP,-p 可以显示进程信息。正常情况下,你应该能看到本地地址、端口、监听队列以及对应进程。例如 Nginx 通常监听 0.0.0.0:800.0.0.0:443[::]:80

这里有两个细节很容易被忽略。第一,监听在 127.0.0.1 的服务只能本机访问,外部访问不到并不代表服务没启动。第二,监听在 IPv6 的 [::] 是否同时覆盖 IPv4,要看系统和服务配置,不能只凭一行输出下结论。遇到“本机 curl 正常,外部访问不通”的情况,还要继续检查安全组、防火墙、NAT、反向代理和程序绑定地址。

看连接状态分布

端口在监听,只能说明服务入口存在,不代表请求处理正常。下一步可以查看 TCP 状态分布:

ss -ant | awk 'NR>1 {count[$1]++} END {for (s in count) print s, count[s]}'

常见状态包括 ESTABTIME-WAITSYN-SENTSYN-RECVCLOSE-WAITFIN-WAIT-1FIN-WAIT-2 等。单独看到这些状态并不可怕,关键是数量是否异常、是否集中在某个端口、是否持续增长。

ESTAB 多,通常说明当前活跃连接多,可能是业务高峰,也可能是长连接占用。SYN-RECV 大量堆积,可能与半连接队列、SYN Flood、上游代理异常或内核参数有关。CLOSE-WAIT 持续升高,往往说明本机应用没有正确关闭连接,更偏向程序或连接池问题。TIME-WAIT 很多并不一定是故障,它是 TCP 正常关闭流程的一部分,但如果端口耗尽或新连接失败,就需要结合连接来源和系统参数继续看。

定位哪个进程占用连接

如果只知道连接多,却不知道是谁造成的,排查就会变成猜谜。可以用下面的命令按端口或进程查看:

ss -antp | grep ':443'
ss -antp | grep nginx
ss -antp | grep php-fpm

在生产服务器上,-p 通常需要 root 权限才能完整显示进程名和 PID。如果没有权限,至少可以先查看端口和连接状态,再让有权限的账号补充进程信息。对于 Web 服务,连接可能集中在 Nginx、PHP-FPM、Java、Node.js、MySQL、Redis 等进程上,不同进程代表完全不同的处理方向。

例如,Nginx 连接很多但后端 PHP-FPM 队列也高,问题可能不是入口带宽,而是动态请求处理慢;MySQL 连接长期不释放,可能是应用连接池配置不合理;Redis 连接暴涨,可能是某个任务脚本没有复用连接。排查网络连接的价值就在于把“网站慢”拆成更具体的问题,而不是盲目升级服务器配置。

从来源 IP 判断是否异常

当某个端口连接数异常时,可以统计来源 IP:

ss -ant '( sport = :443 )' | awk 'NR>1 {print $5}' | sed 's/:[0-9]*$//' | sort | uniq -c | sort -nr | head

如果服务器主要提供 HTTPS 服务,可以把 :443 换成 :80:3306 或其他业务端口。统计结果能帮助你判断连接是否集中来自少数 IP、某个代理节点、某个爬虫段,还是正常分散的用户访问。少量 IP 占用大量连接时,要结合访问日志确认是正常客户、搜索引擎、监控探测,还是恶意扫描。

这里不要只看连接数就直接封禁。企业出口、CDN 回源、负载均衡、办公室 NAT 都可能让大量正常请求集中到一个 IP。更稳妥的做法是同时查看 Nginx access log、User-Agent、请求路径、响应码和请求速率。需要做限流或封禁时,优先从反向代理、防火墙规则或云安全组按范围控制,避免误伤真实用户。

排查队列和积压问题

ss -lnt 输出里有 Recv-QSend-Q。在监听 socket 上,它们通常能反映连接队列相关信息;在已建立连接上,则可辅助判断接收或发送是否存在积压。虽然不同内核版本和场景下字段含义会有差异,但如果某个服务的队列长期不为 0,或者高峰期明显堆积,就值得进一步检查。

队列积压常见原因包括应用处理速度跟不上、后端数据库慢、磁盘 I/O 卡住、PHP-FPM/应用 worker 数不足、上游反向代理超时设置不合理、网络链路不稳定等。此时可以把 ss 结果和 topiostatjournalctl、Nginx error log、应用日志放在一起看。单个命令很难给出最终答案,但它能告诉你问题更像“进不来”“处理慢”还是“发不出去”。

和日志一起交叉验证

网络连接状态最好不要孤立解读。比如 CLOSE-WAIT 多,应该去看应用日志是否有连接关闭异常;SYN-RECV 多,要看系统日志、防火墙日志和上游入口;ESTAB 多但 CPU 不高,要看是否存在长轮询、WebSocket、慢查询或外部接口等待;TIME-WAIT 多,要看是否有短连接风暴。

如果是网站业务,建议同步查看:

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
journalctl -u nginx -n 100 --no-pager
journalctl -u php-fpm -n 100 --no-pager

不同发行版和安装方式下日志路径会不一样,实际排查时要以服务配置为准。对于托管在云服务器上的业务,如果不想从零搭环境,也可以选择 速维云云服务器 这类带基础运维支持的方案,把监控、备份、网络入口和常见服务配置一起规划好,后续遇到连接异常时更容易定位边界。

形成固定排查顺序

ss 用熟以后,建议形成一套固定顺序:先看端口是否监听,再看连接状态分布,然后按端口统计连接来源,接着定位进程,最后结合日志和资源指标判断原因。这样的顺序比“想到哪查哪”更稳定,也更适合多人协作交接。

可以把常用命令整理成一个只读检查脚本,但不要把自动封禁、自动重启、自动清理连接写进同一个脚本里。排查脚本应该负责收集证据,处置动作则应该单独确认。尤其是生产环境,重启服务、修改内核参数、变更防火墙规则都可能扩大影响,必须先确认当前连接到底属于正常业务、异常流量还是程序泄漏。

总结一下:ss 不是万能工具,但它是 Linux 网络排障里非常靠前的一步。它能帮你快速回答三个问题:端口有没有开,连接现在处于什么状态,异常连接主要来自哪里。只要这三个问题清楚了,后面的日志分析、配置调整和容量规划都会更有方向。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享