netstat 是排查网络接口状态异常的常用工具,需聚焦 listen 和 time_wait 状态失衡:用 -tuln 检查端口监听是否成功,-tulnp 关联 pid 与进程名,结合 established 分布识别攻击或连接泄漏,监听地址(0.0.0.0 vs 127.0.0.1)决定服务可达范围。

netstat 是排查网络接口状态异常的常用工具,但它的输出信息繁杂,容易忽略关键线索。真正有效的排查,不在于罗列所有连接,而在于聚焦异常模式、结合上下文快速定位根源。
重点关注 LISTEN 和 TIME_WAIT 状态失衡
服务无法访问时,先检查端口是否真正在监听:
- 用 netstat -tuln | grep :端口号 确认进程是否绑定成功;若无输出,说明服务未启动或绑定失败(如配置错端口、权限不足、地址绑定为 127.0.0.1 却从外网访问)
- 大量 TIME_WAIT(尤其远超正常并发量)可能预示短连接风暴,常见于 HTTP 客户端未复用连接、负载均衡后端健康检查过于频繁;可通过调整 net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_fin_timeout 缓解,但需同步检查应用层连接管理
识别非预期监听地址和端口
监听在 0.0.0.0 表示全网可访问,监听在 127.0.0.1 则仅本地可达——这常是服务暴露范围不符预期的根源:
- 例如 Nginx 配置了 listen 80,但 netstat 显示只监听 127.0.0.1:80,说明配置中写了 listen 127.0.0.1:80 或未指定 address,默认绑定到了回环;应改为 listen *:80 或明确写 listen 0.0.0.0:80
- 发现陌生端口处于 LISTEN 状态(如 6379、27017),需立即确认是否为预期服务;若无对应进程,可能是恶意程序或残留旧实例
关联 PID 和进程信息,避免“黑盒”判断
仅看端口和状态不够,必须确认是谁在用:
- 加 -tulnp 参数(需 root 权限)直接显示进程名和 PID;若提示 “can’t identify protocol”,通常是权限不足或内核模块缺失,可改用 ss -tulnp 替代
- 遇到 PID 显示为 “-” 或无法解析,往往是容器环境(如 Docker)或用户命名空间隔离所致,此时应进容器内执行 netstat 或用 docker ps -a + docker inspect 查端口映射
- 发现多个相同端口被不同进程监听(如两个 nginx worker),属正常;但若出现同一端口被完全无关进程重复监听(如 python 和 java 同时 bind 8080),则必有冲突或误操作
结合连接数突变与 ESTABLISHED 异常分布
活跃连接数陡增或集中于某 IP,往往指向攻击或故障:
- netstat -an | grep ESTABLISHED | wc -l 快速统计当前连接数,对比基线值;若飙升 5 倍以上,再用 netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10 查来源 IP 分布
- 单个 IP 建立数百 ESTABLISHED 连接,大概率是扫描、CC 攻击或客户端重试逻辑缺陷;配合 iptables 或云防火墙封禁,同时检查服务日志是否有频繁失败请求
- ESTABLISHED 连接长时间不释放(如 >1 小时),可能是客户端异常断连未发 FIN,也可能是服务端未正确关闭 socket(如未调用 close() 或未设置 SO_LINGER),需查应用代码或中间件配置
netstat 不是万能诊断器,但它像一张实时网络快照——关键不在数据多寡,而在能否从中读出矛盾点:该听的没听,不该听的听了,该通的不通,不该连的连了一堆。多看几遍,比跑十次命令更管用。








