《每日一命令16:netstat——谁在偷偷连你的服务器?》
netstat是网络排查基础工具,核心用法:-tulnp 查看监听端口、awk 统计状态分布、grep 过滤违规IP。注意 CLOSE_WAIT 泄漏和 TIME_WAIT 堆积是两个最需要关心的计数器。ss 速度更快且功能更强,但 netstat 仍是老系统/容器环境的保底选择。
本期摘要
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倍的新一代工具》
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)