netstat 命令速查表 - Linux 网络排查常用命令大全
「这个端口开了吗、谁连着我、谁占着它」是运维问得最多的三个问题,netstat 把内核里的已建立连接、监听套接字、路由表、协议统计四张表一次摊平。关键是三个开关的组合语义:-l 只看监听,-n 不做名字解析(否则慢一大截,且域名反查会让 10.0.0.1 变成反直觉的主机名),-p 显示占用进程;日常体检 -tlnp 一条就够。按状态筛选一组用于识别异常:大量 TIME_WAIT 说明服务在硬撑短连接,可考虑长连接或连接池;SYN_RECV 堆积要怀疑 SYN flood 或 accept 队列打满;CLOSE_WAIT 堆积往往是应用忘了关闭对端句柄,属于代码问题。路由与接口统计用于确认多网卡下的实际路径。替代工具一组明确列出 ss 与 ip:ss 走 netlink 直接读内核状态,快一个数量级,ip 接替 route 与 ifconfig。
典型使用场景
面向排查网络连接与端口占用的后端与运维工程师。netstat 的核心用途只有一个——回答「这个端口谁在占」和「连接都在什么状态」。本表按连接查看、监听端口、路由与接口、协议统计、状态筛选与排障、高级选项、替代工具七组组织。值得注意的是本表同时给了 ss / ip 的对应命令:新系统的 netstat 已逐步被替代,输出格式也更干净。
查看连接 6
netstatnetstat -anetstat -atnetstat -aunetstat -annetstat -anp监听端口 6
netstat -lnetstat -ltnetstat -lunetstat -lxnetstat -lntpnetstat -lnup路由表与接口统计 5
netstat -rnetstat -rnnetstat -inetstat -ienetstat -rn | grep UG协议统计信息 5
netstat -snetstat -stnetstat -sunetstat -s | grep -i errornetstat -s | grep -i retrans按状态筛选与排障 6
netstat -an | grep ESTABLISHEDnetstat -an | grep TIME_WAITnetstat -an | grep :80netstat -lntp | grep :80netstat -an | awk '{print $6}' | sort | uniq -cnetstat -an | grep ESTABLISHED | wc -l高级选项 6
-n-p-c 1-o-e-v替代工具(ss / ip) 5
ss -tlnpss -tn state establishedss -sip addrip route参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
-l | 只显示监听中的连接 | netstat -lt |
-n | 不解析域名与端口名,输出更快 | netstat -an |
-p | 显示占用端口的 PID 与进程名(需 root) | netstat -lntp |
-a | 包含监听与非监听全部连接 | netstat -an |
-t / -u | 只看 TCP / 只看 UDP | netstat -at |
-e / -i | 附加用户与 inode 列 / 接口统计 | netstat -ie |
-r | 查看路由表 | netstat -rn |
-s | 各协议统计信息 | netstat -st |
-c 1 | 每秒刷新一次,实时观察变化 | netstat -c 1 |
grep ESTABLISHED | 筛出已建立连接 | netstat -an | grep ESTABLISHED |
grep TIME_WAIT | 筛出等待关闭的连接 | netstat -an | grep TIME_WAIT |
ss -tlnp | 现代替代:更快且输出更清晰 | ss -tlnp |
ip addr | 查看网络接口(替代 ifconfig) | ip addr |
ip route | 查看路由表 | ip route |
易错点与避坑指南
现象PID 列显示为 -,看不到是哪个进程占用端口。
原因查看进程信息需要 root 权限,普通用户看不到其他用户的进程映射。
处置加 sudo 重新执行;或用 ss -tlnp 配合权限确认。
现象端口明明被占用,但 netstat 里看不到监听记录。
原因服务只绑定了 127.0.0.1 而从外部访问,或协议是 UDP 却只看了 TCP。
处置用 netstat -anp 同时看 TCP 与 UDP;确认服务绑定的地址是否只是本地回环。
现象执行 netstat 很慢,连接数上万时几乎卡住。
原因默认要解析域名与端口名,且 -p 需要查进程映射。
处置加 -n 跳过解析(最有效);新系统改用 ss,走 netlink 直接读内核数据。
现象TIME_WAIT 状态连接数暴涨,短连接端口耗尽。
原因大量短连接关闭后处于等待状态,内核需保留一段时间才能释放端口。
处置改用长连接或连接池;临时可调 net.ipv4.tcp_tw_reuse,但根治要看连接设计。
现象看到 ESTABLISHED 连接但服务端似乎没在监听。
原因连接可能来自已退出的进程留下的孤儿连接,或 TIME_WAIT 残留。
处置结合 -p 与 ss -tn state established 交叉确认;必要时重启相关服务清理。
现象不同系统上 netstat 输出格式不一致,脚本解析失败。
原因BSD 与 Linux 的 netstat 列含义与选项支持存在差异。
处置统一改用 ss(格式跨发行版更一致);脚本里固定使用 -n 输出。
排障路径
1查端口被哪个进程占用
netstat -lntp | grep :80需 root 才能看到 PID;这是端口类问题最快的一步。
2统计当前连接状态分布
netstat -an | awk '{print $6}' | sort | uniq -c各状态数量一目了然,ESTABLISHED 或 TIME_WAIT 异常增多时最直观。
3统计活跃连接数
netstat -an | grep ESTABLISHED | wc -l适合放进监控脚本作为连接数指标。
4确认默认网关路由
netstat -rn | grep UG排查「能 ping 通但连不上」时先看网关是否正确。
5新系统上的等价命令
ss -tlnpss 走 netlink 直接读内核,比 netstat 快一个数量级,输出也更易读。
命令示例
查出 80 端口被谁占用
netstat -lntp | grep :80
# 或更快的现代写法
ss -tlnp | grep :80-l 只看监听、-n 不解析、-t 只看 TCP、-p 显示进程,最后一个参数需 root。新系统优先用 ss,直接读内核 netlink 快很多。
输出
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1420/nginx
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1420,fd=6))统计各连接状态的分布
netstat -an | awk '{print $6}' | sort | uniq -c | sort -rnTIME_WAIT 大量堆积通常说明连接未复用;CLOSE_WAIT 多则是对端已关闭而本地没及时释放,需要查应用侧的连接处理。
输出
2841 ESTABLISHED
312 TIME_WAIT
118 LISTEN
47 CLOSE_WAIT用 ss 按状态筛选已建立连接
ss -tn state established | headss 的状态过滤是一等公民,不需要 grep 管道,输出也更整齐。排查连接泄漏时先用它取基线。
输出
ESTAB 0 0 10.0.0.5:52344 93.184.216.34:443 ESTAB 0 0 10.0.0.5:41890 151.101.1.140:443
常见坑与注意事项
- netstat 不加 -n 会做 DNS 反查,数据量大时慢到不可用;务必带 -n。
- -p 显示进程名需要 root 权限,非 root 执行会看不到占用进程那一列。
- 大量 TIME_WAIT 不一定要调内核参数,先确认应用是否每请求都新建 TCP 连接、能否启用 keep-alive。
- netstat 在现代系统上已逐步被 ss 取代,新脚本优先用 ss,旧系统或排查兼容问题时再用 netstat。
- 端口不通可能是防火墙而非服务未启动,netstat 只能证明进程在本机监听,不能证明外部可达。
提示
- netstat 已被 ss 命令逐步替代,新系统建议优先用 ss(更快更现代)。
- 查看进程需要 root 权限,否则 PID 列显示为 -。
- TIME_WAIT 过多可能是短连接频繁,考虑用长连接或连接池。
- netstat -an 速度最快,-p 会降低性能因为要查进程映射。
- ss 使用 netlink 接口直接读取内核数据,比 netstat 快一个数量级。
- 排查端口占用最常用的组合是 netstat -tlnp | grep <端口>。
- netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn 可以直接按连接状态计数排行,排查 TIME_WAIT 或 CLOSE_WAIT 堆积时最直观。
- 配合 grep 精确定位时用 netstat -tlnp | grep -w ":80\s",避免 grep 80 把 8080 一起匹配出来造成误判。
- 需要确认某个进程的全部连接而非仅监听时,用 netstat -tulpn 加 --pid 过滤输出行,比逐个端口查更快。
常见问题
怎么查出 80 端口是被哪个进程占用的?
netstat -lntp | grep :80,-l 只看监听、-n 不解析域名、-t 只看 TCP、-p 显示占用进程,需要 root 权限才能看到进程名。新系统上更推荐 ss -tlnp,速度更快输出也更清爽。确认 PID 后可以用 ps -p <pid> -o pid,cmd 看清是哪个程序。
TIME_WAIT 状态的连接堆积要不要处理?
少量属正常现象,是主动关闭方为保证最后一段数据能送达而保留的等待状态,通常 60 秒左右自动消失。但如果短时间堆积到数万条,说明连接复用的配置有问题,应检查应用是否每次请求都新建 TCP 连接、是否可以启用 keep-alive。先用 netstat -an | grep TIME_WAIT | wc -l 观察数量增长趋势,再决定是否要调 tcp_tw_reuse 之类的参数。
netstat 和 ss、lsof 该怎么选?
ss 是 netstat 的现代替代品,直接读内核 netlink,比 netstat 快很多,新系统优先用。netstat 的优势是几乎所有系统都有、脚本兼容性好。lsof -i :80 则偏向「反查」——已知端口或进程,想知道它打开了哪些文件和网络连接时更方便。三者常配合使用。
为什么 netstat 不加 -n 输出特别慢?
因为它会尝试把每个 IP 反向解析成主机名、把端口号查成服务名(http、ssh 等),一次连接查询可能触发多次 DNS 请求。数据量大时这部分开销占绝大多数。加上 -n 让它直接显示原始 IP 和端口号,速度提升非常明显,这也是 -ntp 成为最常用组合的原因。
netstat -s 里的统计信息能看出什么问题?
-s 输出各协议层的累计计数,排查网络故障时重点看两项:grep -i error 找错误包总数,grep -i retrans 找 TCP 重传次数。重传率明显偏高通常指向链路丢包、拥塞或对端处理慢,而不一定是本机的问题。需要对比增量而非绝对值,可以间隔一段时间跑两次相减。
由 巧匠 维护
公开更新于 2026年7月21日,内容持续校对官方文档。