本期摘要

netstat 是网络连接查看的经典命令,尽管新一代 ss 性能更快,但 netstat 仍然是最普及、最直观的网络排查工具。本文聚焦五个核心场景:列出所有监听端口(找服务有没有起来)、统计每个状态的连接数(看TIME_WAIT是否爆炸)、按 IP 统计连接数(是不是被某个IP扫)、根据端口号找进程(哪个进程占用了端口)、查看路由表。同时解释了 LISTEN / ESTABLISHED / TIME_WAIT / CLOSE_WAIT 四个最常见状态的业务含义,读完你就能在收到网络告警时快速定位原因。

netstat是什么?

netstat 是 network statistics 的缩写,用于显示网络连接、路由表、接口统计等信息。

虽然很多教程已经开始转向 ss,但 netstat 仍然是最广泛存在的工具,尤其是在老系统和临时排查环境中。

netstat 可能未预装,可用 yum install net-tools 或 apt install net-tools 安装。

最常用的5种姿势

1. 列出所有监听端口(找服务)

bash

netstat -tulnp
参数 含义
-t TCP
-u UDP
-l 仅显示监听状态的端口
-n 不解析名字(显示 IP 和端口号)
-p 显示进程 PID 和名称

输出示例:

text

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1234/nginx
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      567/sshd
tcp6       0      0 :::3306                 :::*                    LISTEN      890/mysqld

解读:

  • 0.0.0.0:* 表示监听所有 IPv4 地址,:::* 表示监听所有 IPv6 地址

  • 127.0.0.1:3306 表示只监听本机,外部无法访问

2. 统计各状态的连接数

bash

netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

输出类似:

text

ESTABLISHED 234
TIME_WAIT    1890
CLOSE_WAIT     12
LISTEN          8

各状态业务含义:

状态 对程序员/运维的意义
LISTEN 服务在等请求——正常
ESTABLISHED 正常通信连接
TIME_WAIT 主动关闭一方留下的,大量出现表示短连接频繁
CLOSE_WAIT 被动关闭方未调用 close,说明程序有 bug——连接泄漏
SYN_RECV 收到 SYN 但连接未建立,可能受到 SYN Flood 攻击

3. 按 IP 统计连接数(抓坏蛋)

bash

netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn

输出类似:

text

245 1.2.3.4
128 5.6.7.8
12 10.0.0.1

某个 IP 连接数异常高 → 可能是爬虫、攻击或程序错误重连。

4. 查看某个端口上的连接

bash

netstat -an | grep :8080

5. 根据端口号找进程

bash

netstat -tulnp | grep :80

-p 需要 root 权限才能看到完整进程名。

进阶技巧

实时刷新(类似 top)

bash

watch -n 1 "netstat -an | grep ESTABLISHED | wc -l"

每秒刷新一次,观察连接数变化。

查看路由表

bash

netstat -rn

输出网关信息,排查网络不通问题时很有用。

查看接口统计(丢包、错误)

bash

netstat -i

RX-ERR / TX-ERR 列有非零值表示网卡有错误。

真实场景

场景1:服务启动失败,检查端口是否被占

bash

netstat -tulnp | grep :8080

如果被占用,kill 掉占用的进程或换端口。

场景2:TIME_WAIT 过多

TIME_WAIT 太多会耗尽端口,排查方法:

  • netstat -an | grep TIME_WAIT | wc -l 统计数量

  • 超过 1 万需要优化:开启 tcp_tw_reuse,或改用长连接

场景3:CLOSE_WAIT 泄漏

bash

netstat -an | grep CLOSE_WAIT | wc -l

如果这个值持续增长且不降,说明程序没有正确关闭连接——最经典的连接泄漏表现。

场景4:某个 IP 在扫你的端口

bash

netstat -an | grep SYN_RECV | wc -l

若 SYN_RECV 数量很大,可能遭受 SYN Flood。配合 netstat -an | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | uniq -c 找到攻击源 IP。

备选方案 ss 对比

ss 是 netstat 的现代替代品,速度更快,输出更清晰。

功能 netstat ss
监听端口 netstat -tulnp ss -tulnp
连接统计 netstat -an + awk ss -tan state time-wait 等
按进程筛选 -p 参数 -p 参数同样支持

ss 的优势在于可以对状态直接过滤:ss -tan state time-wait 直接列出所有 TIME_WAIT。但在老系统或容器环境中,netstat 往往更通用。

常用参数速查

参数 含义
-t TCP
-u UDP
-l 仅监听
-a 所有连接(包含监听)
-n 不解析名字,显示数字 IP
-p 显示 PID/进程名
-c 连续输出
-r 路由表
-i 网络接口统计

下期预告

《每日一命令17:ss——比netstat快10倍的新一代工具》

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐