ss -tunp 是最实用的实时连接查看命令,可一眼看清当前所有活跃tcp连接、监听端口及对应进程;它直接读取内核socket表,比netstat更快更准,但需sudo权限才能显示全部进程信息。

ss -tunp 是最实用的实时连接查看命令
想一眼看清当前所有活跃连接、监听端口和对应进程,ss -tunp 是首选。它从内核 socket 表直接读取,比 netstat 更快、更准,且几乎所有现代发行版都预装(属于 iproute2 包)。
常见错误现象:执行 ss -tunp 报错 Permission denied —— 这是因为 -p 需要读取其他用户进程的命名空间,必须加 sudo;不加 sudo 时只能看到当前用户的连接。
-
-t:只显示 TCP 连接(加-u可同时看 UDP) -
-n:禁用 DNS 和服务名解析,避免卡顿或超时 -
-p:显示 PID 和进程名,但必须 root 权限才完整 - 如果只想看 ESTABLISHED 状态,追加
| grep ESTAB
查某个端口谁在用,别只靠 grep :80
用 ss -tunlp | grep :80 看 80 端口没问题,但容易漏掉非标准绑定(比如监听 127.0.0.1:80 或 [::1]:80)。更稳妥的方式是:
- 用
ss -tunlp 'sport == :80 or dport == :80'——ss原生支持表达式过滤,能覆盖 IPv4/IPv6 和本地/远程端口 - 若输出为空但你知道服务在跑,检查是否 bind 到
localhost而非0.0.0.0;此时ss -tunlp仍会显示,但netstat -tuln可能因解析差异漏掉 - 遇到
Address already in use启动失败,先跑sudo ss -tunlp | grep :PORT,再结合sudo lsof -i :PORT交叉验证
netstat 还能用吗?能,但有硬伤
netstat 没被删,但已标记为 deprecated,部分新系统(如 Alpine、某些容器镜像)默认不带。它依赖 /proc/net/* 文件解析,而这些文件在高并发下可能短暂不一致,导致连接状态(如 TIME_WAIT 数量)比 ss 少报或延迟更新。
- 等效命令:
netstat -tunp≈ss -tunp,但前者更慢、更占 CPU - 如果系统没装
net-tools,Debian/Ubuntu 执行sudo apt install net-tools,RHEL/CentOS 用sudo yum install net-tools - 不要用
netstat -anp查全部连接——-a包含大量非活跃状态(如 LISTEN、CLOSE_WAIT),干扰判断;优先用-tunp明确限定
连接“看似存在”但不通?得看三层
查到连接在 ESTABLISHED 并不等于通信正常。真实故障常卡在链路层、IP 层或应用层,不能只盯 ss 输出。
- 物理层:用
ethtool eth0看link detected: yes,否则网线松了或交换机 down 了 - 路由层:
ip route get 8.8.8.8确认出口路径,避免策略路由或黑洞路由 - 防火墙层:
sudo iptables -L -n -v或sudo nft list ruleset查 DROP 计数器是否上涨 - 应用层:即使连接建立,服务也可能返回空响应或 RST;此时需
curl -v http://localhost:80或telnet localhost 80实测
真正难排查的,往往是连接状态正常但数据发不出去——这时候盯着 ss 输出只会徒劳,得切到链路和策略层面动手。











