本期摘要
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倍的新一代工具》