返回博客

ss vs netstat:Linux 查端口该用哪个命令

2026年9月5日

ss——它是所有现代 Linux 发行版的现行标准,netstat 在那里只是遗留工具。在 Ubuntu、Fedora 和 Debian 上,netstat 二进制现在装在一个可选的 net-tools 包里,而 ss 内置于 iproute2,处处都有。ss 在繁忙的服务器上也更快,因为它直接从内核读套接字统计,而不是逐个文件地遍历 _/proc_。代价是语法:-tulpn 在不同系统上含义并不相同,所以这篇指南给你精确的 flag 对照表、值得背下来的命令,以及凌晨两点事故中你会问到的那些问题的答案。

netstat 被弃用了吗?

在 Linux 上,事实上是的。net-tools 包——包含 netstatifconfigroute——已经多年不跟进现代内核特性,任何主流发行版都不再默认安装。它还在、还能跑、也没什么可卸载的,但新特性只落在 iproute2ssip 背后的包)里。

三个实际后果:

  1. 全新安装里没有它。默认的 Ubuntu 24.04 或 Fedora 服务器上没有 netstat,除非手动装 net-tools。这就是为什么这么多人搜”netstat 替代品”——二进制根本不在。
  2. 看不到现代套接字信息。netstat 诞生于 TCP fast open、子流级套接字统计、cgroup 套接字归属这些特性之前。ss 原生报告它们。
  3. Windows 是例外。在 Windows 上,netstat 活得好好的——netstat -ano 仍是把 PID 映射到监听端口的标准做法。弃用故事只属于 Linux。

Linux 里的 ss 命令是什么?

ss 是 “socket statistics” 的缩写。它输出内核眼中每一条 TCP、UDP 和 Unix 套接字:状态、地址、端口、进程、定时器和队列深度。主力形式是:

# 所有监听中的套接字,连同属主进程
sudo ss -tulpn

逐个 flag 读:TCP(-t)、UDP(-u)、只看监听套接字(-l)、显示进程(-p)、数字输出——不做 DNS 查询(-n)。sudo-p 很关键:没有 root,你能看到端口,但看不到不属于你的套接字的进程名。

再给两条覆盖大部分日常的一行命令:

# 与端口 443 之间的所有已建立连接,带进程
sudo ss -tnp 'sport = :443 or dport = :443'

# 汇总表:每种状态的套接字各有多少
ss -s

这套过滤语法是相对 netstat “grep 碰运气”路数的真正升级——它在内核内运行,结果是精确匹配而非文本匹配。

怎么查哪个进程占用了端口?

这是人们伸手拿这两样工具的第一大理由。用 ss

sudo ss -ltnp 'sport = :8080'

一台跑着开发服务器的机器上,输出示例:

State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       511     *:8080              *:*               users:(("node",pid=214113,fd=18))

users:(...) 字段直接给你进程名和 PID——不需要第二条命令。如果端口被占用却没有显示进程,你看到的多半是另一个网络命名空间(容器)持有的套接字。在宿主机上跑 sudo ss -ltnp,找进程列为空的那个端口,再用 docker ps 对上,或者 nsenter 进容器的命名空间。

偏爱专用工具?sudo lsof -i :8080 -sTCP:LISTEN 干同样的活,而且在 macOS 和多数 BSD 上行为一致,所以它还留在各种运维手册里。不过在 Linux 上,ss 本来就在那儿。

ss 和 netstat 有什么区别?

同一份工作,不同的管线:netstat 在用户态抓 _proc/net/tcp_,而 ss 用 netlink 直接问内核——所以在 5 万条开放套接字的服务器上,ss 毫秒级返回,netstat 做不到。日常用起来,区别在 flag。这张值得贴在显示器上的对照表:

你想要netstatss
监听中的 TCP 端口 + 进程netstat -tlpnss -tlpn
所有 TCP + UDP 连接netstat -tulpnass -tulpna
路由表netstat -rip route
网卡统计netstat -iip -s link
内核套接字汇总ss -s
在内核里按端口过滤ss -tnp 'sport = :22'

注意前两行完全一致:运气好,ss 的短 flag 在常见场景下与 netstat 对齐,肌肉记忆大体能无痛迁移。下面的行才是 netstat 交白卷的地方——路由和网卡的工作移交给了 ip 命令,而汇总/过滤两行只存在于 ss

什么时候还该用 netstat?

两个诚实的场景。第一,可移植性:在 Linux、AIX 或老 BSD 混编的机器群里,netstat 是唯一无处不在的语法。第二,老运维手册里的肌肉记忆延续——手册写着 netstat -tlpn 而机器装了 net-tools,它照样能用。

除此之外,默认用 ss,然后更新手册。在服务器上重写这类手册时,journalctl 速查表是个顺手的搭档——排查一个起不来的服务时,端口检查和日志经常连着用:/en/blog/2026-09-02/journalctl-cheat-sheet

为什么找不到 ss 命令?

因为你要么在非常老的发行版上(2007 年前、iproute2 成为标准之前),要么——可能性大得多——你根本不在 Linux 上。ss 不是 macOS 命令;macOS 带 lsofnetstat,但没有 ss。BSD 大体同理。在 Windows 上,用 netstat -ano 或 PowerShell 的 Get-NetTCPConnection

如果你确实在 Linux 上而 ss 不见了,装 iproute2:

sudo apt install iproute2    # Debian/Ubuntu
sudo dnf install iproute2    # Fedora/RHEL

30 秒版答案

在 Linux 上,任何时候都选 ss 而不是 netstat:预装、更快、能在内核里过滤。netstat -tlpn 变成 ss -tlpn,找进程变成 sudo ss -ltnp 'sport = :PORT',路由表归 ip route 管。netstat 留给跨平台脚本和老肌肉记忆;这一页留给 flag 对照。

— mrsaynothing

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

写代码的本地 LLM 推荐:8GB 到 24GB 显存选型

喜欢这些文章?我的本职工作就是这样的工程。 雇用我