用 ss——它是所有现代 Linux 发行版的现行标准,netstat 在那里只是遗留工具。在 Ubuntu、Fedora 和 Debian 上,netstat 二进制现在装在一个可选的 net-tools 包里,而 ss 内置于 iproute2,处处都有。ss 在繁忙的服务器上也更快,因为它直接从内核读套接字统计,而不是逐个文件地遍历 _/proc_。代价是语法:-tulpn 在不同系统上含义并不相同,所以这篇指南给你精确的 flag 对照表、值得背下来的命令,以及凌晨两点事故中你会问到的那些问题的答案。
netstat 被弃用了吗?
在 Linux 上,事实上是的。net-tools 包——包含 netstat、ifconfig 和 route——已经多年不跟进现代内核特性,任何主流发行版都不再默认安装。它还在、还能跑、也没什么可卸载的,但新特性只落在 iproute2(ss 和 ip 背后的包)里。
三个实际后果:
- 全新安装里没有它。默认的 Ubuntu 24.04 或 Fedora 服务器上没有
netstat,除非手动装net-tools。这就是为什么这么多人搜”netstat 替代品”——二进制根本不在。 - 看不到现代套接字信息。
netstat诞生于 TCP fast open、子流级套接字统计、cgroup 套接字归属这些特性之前。ss原生报告它们。 - 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。这张值得贴在显示器上的对照表:
| 你想要 | netstat | ss |
|---|---|---|
| 监听中的 TCP 端口 + 进程 | netstat -tlpn | ss -tlpn |
| 所有 TCP + UDP 连接 | netstat -tulpna | ss -tulpna |
| 路由表 | netstat -r | ip route |
| 网卡统计 | netstat -i | ip -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 带 lsof 和 netstat,但没有 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.
what is this?喜欢这些文章?我的本职工作就是这样的工程。 雇用我