ss 是更可靠、更快的 netstat 替代方案,因 netstat 在新系统中默认未安装且依赖过时接口导致结果不准;ss 直接读取内核 socket 表,支持实时、轻量、默认带进程名(需 root),并能精准过滤端口与进程。

netstat 在大多数新系统上已弃用,ss 是更可靠、更快的替代方案,尤其在排查端口监听时。
为什么 netstat 常报 “command not found” 或结果不准
Ubuntu 22.04+、CentOS 8+、Debian 11+ 默认不预装 netstat,它属于 net-tools 包,而内核和网络栈演进后,netstat 依赖的 /proc/net 接口存在竞态和延迟,可能漏掉短连接或显示过期状态。
- 运行
netstat -tuln却没看到刚起的nginx?很可能是它还没完成 bind 或被防火墙拦截了 SYN - 看到一堆
TIME_WAIT却查不到对应进程?netstat的 -p 参数常因权限不足(非 root)返回空,且无法穿透容器命名空间 - 想看 IPv6 端口但只显示 IPv4?
netstat默认不强制双栈,得加-6或-4显式指定
ss 查端口监听:最简有效命令组合
ss 直接读取内核 socket 表,无中间解析层,结果实时、轻量、默认支持 -p(需 root)。
- 看所有监听的 TCP/UDP 端口(含进程名):
sudo ss -tulnp - 只看特定端口(比如 3000):
sudo ss -tuln | grep ':3000' - 排除无关地址(如只看本机监听,不含 0.0.0.0):
sudo ss -tuln | grep ':3000' | grep -v '\*:' - 查某个进程(如
node)占用了哪些端口:sudo ss -tulnp | grep node
遇到 Permission denied 或进程名显示为 “-” 怎么办
这不是 bug,是 Linux capability 限制:ss -p 需要 cap_net_admin 或 root 权限才能读取其他进程的 socket 信息。普通用户即使能跑通命令,进程列也只会显示 “-”。
- 必须加
sudo,不要试图用setcap给ss赋权——风险高且多数发行版不认 - 容器内查宿主机端口?不行。
ss只能看到当前命名空间内的 socket,进容器后默认看不到宿主机监听 - 看到
users:(("nginx",pid=1234,fd=6))这种格式?正常,ss的 -p 输出比netstat更紧凑,pid 和 fd 都直接带出来
真正麻烦的是跨网络命名空间、systemd socket 激活、或端口被 iptables/nftables DROP 后仍显示监听——这些场景下,ss 只告诉你“端口开了”,但不保证能连上。得配合 curl -v http://localhost:端口 或 telnet localhost 端口 实测通路。










