ss 过滤表达式怎么用
ss 的过滤表达式由内核在 netlink 层面完成筛选,比把全部结果管道给 grep 更准确也更快。表达式按「字段 运算符 值」组成,端口可以写数字也可以写服务名,多个条件用 and、or、not 组合并可加括号控制优先级。整段表达式必须用引号包住交给 ss 自己解析,否则括号和空格会被 shell 先拆开。连接数上万的机器上,表达式几乎是唯一可行的手工排查方式。
基本信息
| 适用平台 | Linux iproute2 的 ss(所有主流发行版) |
|---|---|
| 方向约定 | sport 是本机端口、dport 是对端端口,src 是本机地址、dst 是对端地址 |
| 必须加引号 | 整段表达式加单引号,避免 shell 解析括号 |
| 与状态混用 | state 过滤器与表达式可同时使用,写在表达式前更清晰 |
| 性能特征 | 过滤在内核完成,结果集小时开销远低于全量输出后 grep |
典型使用场景
- 确认某个端口被谁连着:按 dport 或 sport 精确筛出相关套接字
- 定位谁在占用高端口范围:用区间比较筛出一段临时端口
- 排查某个状态异常的连接:把状态过滤与端口条件组合使用
- 排除法缩小范围:用 not 排掉已知正常的端口
- 批量统计前先收窄:先按条件取出目标集合,再做计数与排序
常用表达式
常用表达式
ss -tan 'sport = :80'
ss -tan '( sport = :80 or sport = :443 )'
ss -tan 'src 10.0.0.9 and dport = :3306'
ss -tan 'dport >= :1024 and dport <= :2000'
ss -tan state established '( dport = :22 or sport = :22 )'
ss -tan 'not ( dport = :22 )'
ss -tanp 'dst 203.0.113.10 and dport = :443' # 带进程与对端地址
ss -tan 'sport = :80' | wc -l # 先收窄再统计连接数关键字与运算符
| 关键字 | 含义 | 正常用法示例 |
|---|---|---|
| sport / dport | 本地端口 / 对端端口 | dport = :443 表示本机连出去的对端端口 |
| src / dst | 本地地址 / 对端地址 | dst 203.0.113.10 筛对端地址 |
| state | TCP 状态过滤 | state time-wait 只看回收态 |
| 比较运算符 | 等于、不等于、区间比较 | dport >= :1024 匹配高端口 |
| 逻辑组合 | and、or、not 与括号 | not 用于排除法 |
表达式过滤在内核侧完成,比管道接 grep 更准确也更快;连接量大的机器(数万条)应优先用表达式,而不是把全量结果丢给文本工具。
端口既可用数字也可用服务名,但服务名依赖本机 services 数据库,跨机器脚本里统一写数字更可靠。