告别netstat!现代网络诊断利器ss命令完全指南
在日常的Linux系统运维和网络问题排查中,查看网络连接、监听端口、套接字状态是必不可少的操作。过去,我们习惯使用经典的 netstat 命令。然而,随着技术的发展,一个更高效、更强大的替代品已经出现——它就是 ss(Socket Statistics)。本文将带你全面掌握 ss 命令,让你在运维工作中如虎添翼。
为什么选择ss而不是netstat?
在深入细节之前,我们先了解一下为什么要“弃用”netstat。
- 性能:
netstat通过读取/proc/net/tcp等伪文件来获取信息,这个过程相对较慢,尤其是在连接数巨大(上万)时。而ss直接从内核空间获取套接字信息,速度极快。 - 信息更丰富:
ss能显示比netstat更多的TCP状态信息(如send-Q,recv-Q的精确值)和更详细的协议选项。 - 更现代的过滤语法:
ss提供了强大且直观的过滤功能,可以轻松筛选出你关心的连接。 - netstat已过时:在许多现代Linux发行版中,
netstat已被标记为“legacy”,并建议用户迁移到ss和ip命令。
简而言之,ss 是更快、更强、更受推荐的工具。
ss命令基础语法与常用选项
ss 命令的基本格式如下:
ss [选项] [过滤表达式]
让我们从最常用的选项开始。
1. 显示所有连接(类似 netstat -a)
ss -a
这将列出所有类型的套接字,包括监听的和已建立的。
2. 按协议类型查看
- 查看TCP连接:
ss -t - 查看UDP连接:
ss -u - 查看UNIX域套接字:
ss -x
通常我们会组合使用 -a 选项来查看所有状态:
ss -t -a # 查看所有TCP套接字
ss -u -a # 查看所有UDP套接字
一个更常见的简写是 -tua:
ss -tua # 查看所有TCP和UDP套接字
3. 显示监听端口(类似 netstat -l)
ss -l
同样,可以组合使用:
ss -tln # 查看所有TCP监听端口,并以数字形式显示(-n)
ss -uln # 查看所有UDP监听端口,并以数字形式显示
这里 -n 选项阻止了端口到服务名的解析(如 22 -> ssh),在排查问题时可以更快地看到真实端口号。
4. 显示进程信息(类似 netstat -p)
这是一个非常实用的功能,可以查看是哪个进程占用了端口。
ss -tlnp
注意:查看进程信息通常需要 sudo 权限。 输出中会包含 PID/Program name 列,例如:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1234,fd=3))
这清楚地告诉我们,22端口由PID为1234的sshd进程监听。
5. 显示详细的套接字信息(-e)
-e 选项可以显示套接字的额外详细信息,如用户ID(uid)、进程关联的inode等。
ss -t -e
进阶:强大的过滤功能
这是 ss 命令的精华所在。你可以使用过滤表达式精准定位你关心的连接。
1. 状态过滤
只显示处于特定TCP状态的连接,例如所有已建立的连接:
ss -t state established
常见的TCP状态有:
established:已建立的连接listening:监听状态time-wait:等待关闭状态(常出现在大量短连接后)closed:已关闭syn-sent:SYN已发送syn-recv:SYN已接收fin-wait-1,fin-wait-2,close-wait,closing,last-ack,closed
实战场景:快速找出系统中所有处于TIME-WAIT状态的连接,这有助于诊断端口耗尽问题。
ss -t state time-wait
2. 地址和端口过滤
使用 dst(目标)或 src(源)关键字进行过滤。
- 查看连接到特定远程IP的连接:
ss -t dst 192.168.1.100 - 查看从特定本地端口发起的连接:
ss -t src :80 - 查看连接到特定远程IP和端口的连接:
ss -t dst 10.0.0.5:443 - 组合过滤:查看所有已建立的、连接到
1.2.3.4端口80的TCP连接。ss -t state established dst 1.2.3.4:80
3. 使用比较运算符进行高级过滤
ss 支持 >, <, >=, <=, ==, != 等运算符。
- 查看本地端口号大于1024的所有TCP连接:
ss -t sport \> :1024注意:冒号
:前有空格,大于号>需要转义。 - 查看接收队列(Recv-Q)有积压的连接(可能意味着应用处理不过来):
ss -t recv-q \> 0
实战运维场景示例
场景一:快速定位端口占用
“我的应用启动失败,说8080端口被占用了!”
sudo ss -tlnp | grep :8080
如果输出结果,你会立刻看到是哪个进程(PID和程序名)占用了该端口。
场景二:监控服务器对外连接
“我想知道我的服务器当前正在向哪些外部地址建立连接。”
ss -t state established dst \*:\*
或者,更聚焦一点,排除本地回环和私有网络:
ss -t state established dst \*:\* | grep -vE ‘(127.0.0.1:|192.168.|10\.)’
场景三:诊断连接数异常
“系统感觉变慢了,怀疑是连接数太多。”
- 统计各种TCP状态的数量:
ss -t -a | grep -v ‘State’ | awk ‘{print $1}’ | sort | uniq -c | sort -rn这会输出类似:
150 ESTAB 45 TIME-WAIT 10 LISTEN如果
TIME-WAIT数量异常高,可能需要调整内核TCP参数(如net.ipv4.tcp_tw_reuse)。 - 查看哪个远程IP建立的连接最多:
ss -t state established | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
场景四:检查监听服务
“我想确认我的Web服务器(Nginx/Apache)和数据库(MySQL/Redis)的监听端口是否正确开启。”
sudo ss -tlnp | grep -E ‘(nginx|httpd|mysqld|redis-server)’
总结与常用命令速查表
ss 命令功能强大,但记住几个最常用的组合就能解决80%的问题:
| 命令 | 作用描述 |
|---|---|
ss -tlnp | 最常用:查看所有TCP监听端口及对应进程 |
ss -tunp | 查看所有TCP和UDP连接及对应进程 |
ss -t state established | 查看所有已建立的TCP连接 |
ss -t state time-wait | 查看所有TIME-WAIT状态的连接(用于诊断) |
ss -t dst [IP]:[PORT] | 查看连接到指定目标的TCP连接 |
ss -s | 查看统计摘要:显示套接字总数、各协议分类统计,非常直观 |
从今天开始,尝试在你的日常工作中使用 ss 替代 netstat 吧。起初你可能需要查一下手册,但很快你就会爱上它的速度和强大,并成为你网络诊断工具箱中最锋利的武器之一。
文档信息
- 本文作者:JiliangLee
- 本文链接:https://leejiliang.cn/2026/01/06/%E6%97%A5%E5%B8%B8%E8%BF%90%E7%BB%B4%E5%91%BD%E4%BB%A4ss%E6%95%99%E5%AD%A6/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)