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。

系统与运维·共 39 条命令·最后更新 2026-07-21

典型使用场景

面向排查网络连接与端口占用的后端与运维工程师。netstat 的核心用途只有一个——回答「这个端口谁在占」和「连接都在什么状态」。本表按连接查看、监听端口、路由与接口、协议统计、状态筛选与排障、高级选项、替代工具七组组织。值得注意的是本表同时给了 ss / ip 的对应命令:新系统的 netstat 已逐步被替代,输出格式也更干净。

查看连接 6

netstat
查看所有活跃连接
netstat -a
查看所有监听和非监听端口
netstat -at
只查看 TCP 连接
netstat -au
只查看 UDP 连接
netstat -an
不解析域名和端口名(更快)
netstat -anp
显示 PID 和进程名(需 root)

监听端口 6

netstat -l
查看所有监听端口
netstat -lt
查看 TCP 监听端口
netstat -lu
查看 UDP 监听端口
netstat -lx
查看 Unix 域套接字监听
netstat -lntp
查看 TCP 监听及进程(需 root),最常用
netstat -lnup
查看 UDP 监听及进程

路由表与接口统计 5

netstat -r
查看路由表,等价于 route
netstat -rn
查看路由表不解析主机名(更快)
netstat -i
查看网络接口统计(收发包)
netstat -ie
查看接口详情,等价于 ifconfig
netstat -rn | grep UG
只看默认网关路由

协议统计信息 5

netstat -s
查看所有协议统计信息
netstat -st
查看 TCP 协议统计
netstat -su
查看 UDP 协议统计
netstat -s | grep -i error
查看网络错误统计
netstat -s | grep -i retrans
查看 TCP 重传统计

按状态筛选与排障 6

netstat -an | grep ESTABLISHED
查看已建立的连接
netstat -an | grep TIME_WAIT
查看 TIME_WAIT 连接
netstat -an | grep :80
查看 80 端口相关连接
netstat -lntp | grep :80
查看 80 端口被哪个进程监听
netstat -an | awk '{print $6}' | sort | uniq -c
统计各连接状态分布
netstat -an | grep ESTABLISHED | wc -l
统计当前活跃连接数

高级选项 6

-n
不解析 IP 和端口为名称,显示更快
-p
显示占用端口的进程 PID 和名称(需 root)
-c 1
每秒持续输出,实时监控连接变化
-o
显示连接计时器信息
-e
显示详细信息,附加用户和 inode 列
-v
详细模式,显示未配置的接口

替代工具(ss / ip) 5

ss -tlnp
ss 替代 netstat -tlnp,速度更快
ss -tn state established
ss 按状态过滤已建立连接
ss -s
ss 查看连接统计摘要
ip addr
ip 替代 ifconfig/netstat -ie 查看接口
ip route
ip 替代 netstat -r 查看路由表

参数矩阵

参数作用示例
-l只显示监听中的连接netstat -lt
-n不解析域名与端口名,输出更快netstat -an
-p显示占用端口的 PID 与进程名(需 root)netstat -lntp
-a包含监听与非监听全部连接netstat -an
-t / -u只看 TCP / 只看 UDPnetstat -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. 1查端口被哪个进程占用

    netstat -lntp | grep :80

    需 root 才能看到 PID;这是端口类问题最快的一步。

  2. 2统计当前连接状态分布

    netstat -an | awk '{print $6}' | sort | uniq -c

    各状态数量一目了然,ESTABLISHED 或 TIME_WAIT 异常增多时最直观。

  3. 3统计活跃连接数

    netstat -an | grep ESTABLISHED | wc -l

    适合放进监控脚本作为连接数指标。

  4. 4确认默认网关路由

    netstat -rn | grep UG

    排查「能 ping 通但连不上」时先看网关是否正确。

  5. 5新系统上的等价命令

    ss -tlnp

    ss 走 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 -rn

TIME_WAIT 大量堆积通常说明连接未复用;CLOSE_WAIT 多则是对端已关闭而本地没及时释放,需要查应用侧的连接处理。

输出

   2841 ESTABLISHED
    312 TIME_WAIT
     118 LISTEN
      47 CLOSE_WAIT

用 ss 按状态筛选已建立连接

ss -tn state established | head

ss 的状态过滤是一等公民,不需要 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们