netstat 可发现连接泄漏,关键看 close_wait 和 time_wait 状态异常:close_wait 持续增长表明应用未关闭连接;time_wait 远超 established 暗示短连接滥用;还需检查监听地址是否暴露(如 0.0.0.0)及可疑外连。

netstat 能帮你发现连接泄漏,关键不是看“有多少连接”,而是看“连接卡在哪一环”。真正危险的不是活跃连接多,而是大量连接停在 CLOSE_WAIT 或 TIME_WAIT 状态迟迟不释放。
盯住 CLOSE_WAIT:程序没关连接
CLOSE_WAIT 表示对方已关闭连接,本机却还没调用 close()。这说明应用层代码有缺陷——比如 HTTP 请求后忘了 response.close(),或数据库查询完没显式关闭连接池。
- 运行 netstat -an | findstr CLOSE_WAIT(Windows)或 netstat -an | grep CLOSE_WAIT(Linux)
- 如果数量持续增长(比如几分钟内从个位数涨到上百),基本可判定存在泄漏
- 配合 -o 参数(Windows)或 -p(Linux)查 PID,再定位到具体进程和代码逻辑
警惕异常增长的 TIME_WAIT
TIME_WAIT 是主动关闭方留下的正常状态,但默认会持续 2×MSL(通常 60 秒)。短连接高频场景下容易堆积,但若数量远超并发请求数(例如 5000+),就可能压垮端口资源。
- 用 netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 统计各状态数量
- 重点对比 ESTABLISHED 和 TIME_WAIT 比值:正常应接近 1:1 或更低;若 TIME_WAIT 是 ESTABLISHED 的 5 倍以上,需检查是否滥用短连接
- 注意:单纯调大 net.ipv4.ip_local_port_range 并不能根治,得从应用层改用连接复用(如 HTTP Keep-Alive、数据库连接池)
排查监听端口是否被意外暴露
服务只该监听必要地址。0.0.0.0:* 表示全网可连,127.0.0.1:* 才是仅限本地。若本该只供内部调用的服务监听了外网地址,就是泄漏风险点。
- 执行 netstat -tuln(Linux)或 netstat -ano -p tcp(Windows)
- 逐行检查 Local Address 列:出现 0.0.0.0:8080、:::3000 这类通配地址,且对应进程非 Web 服务,就要核实配置
- 特别关注非常用端口(如 4444、5555、6666)被未知进程监听,很可能是后门或恶意软件
识别可疑对外连接
主动外连不等于异常,但固定指向境外 IP、非常用端口、且进程名可疑(如 svchost.exe 却连非微软域名),就需要深挖。
- 先用 netstat -ano -p tcp 导出当前所有 TCP 连接
- 过滤 ESTABLISHED 状态:findstr ESTABLISHED(Win)或 grep ESTABLISHED(Linux)
- 对 Foreign Address 列做去重统计:awk '{print $3}' | sort | uniq -c | sort -nr,找出高频外连 IP
- 结合任务管理器或 ps 查 PID 对应进程,确认是否为可信程序(如更新服务、云同步客户端)










