ss 的作用
ss 是 iproute2 套件里的套接字统计工具,从内核的 socket 表读取信息,取代 netstat 成为主流连接查看工具。-t 看 TCP、-u 看 UDP、-n 不做名称解析、-a 含监听与已建立、-p 附带进程与文件描述符,一次就能得到「谁连了哪里、属于哪个进程」。在取证现场,它是把网络行为与主机进程对应起来的关键一条命令,属于易失性数据,重启或连接关闭后就看不到。
基本信息
| 适用平台 | Linux(iproute2,内核 2.6 以上普遍可用) |
|---|---|
| 常用组合 | ss -tunap、ss -lntp、ss -tnp state established、ss -s |
| 过滤语法 | state 后接状态,括号内可用 sport/dport/src/dst 条件 |
| 进程信息 | 显示进程需要 root 或具备相应权限,否则只看到自身进程 |
| 替代关系 | netstat 已废弃,参数含义相近但 ss 性能更好 |
| 输出内容 | 本地地址、对端地址、状态、队列、进程与 fd |
典型使用场景
- 现场固定外联证据:哪个进程正在连哪个外部 IP 与端口
- 排查监听后门:找出非业务端口上的 LISTEN 进程
- 确认反弹 shell:ESTAB 状态下进程为 shell 类程序
- 统计连接数与状态分布,判断是否处于扫描或拒绝服务压力下
- 核对服务是否按预期绑定在指定地址(0.0.0.0 与 127.0.0.1 差异)
- 与日志互补:短连接日志里有、ss 里已消失,说明是瞬时行为
现场采集
现场采集
# 全量快照:TCP/UDP、不解析名称、带进程,落盘一份带时间戳的记录
ss -tunap | tee /evidence/ss_$(date -u +%Y%m%dT%H%M%SZ).txt
# 只看处于已建立状态、且与 22 端口相关的连接
ss -tnp state established '( sport = :22 )'
# 列出所有监听端口及其进程(排查异常监听)
ss -lntp
# 只显示非本地回环的已建立外联,便于筛可疑目标
ss -tnp state established | grep -v '127.0.0.1' | grep -v '::1'
# 汇总各状态数量与套接字总览
ss -s; ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn输出逐列读法
| 列 | 含义 | 判读要点 |
|---|---|---|
| State | 套接字状态 | LISTEN 为本地监听;ESTAB 已建立;TIME-WAIT 是刚结束的连接 |
| Recv-Q/Send-Q | 接收与发送队列字节数 | 长期非零说明对端处理不过来或连接异常 |
| Local Address:Port | 本地地址与端口 | 0.0.0.0 表示监听全部网卡,风险高于仅监听 127.0.0.1 |
| Peer Address:Port | 对端地址与端口 | 外联证据的核心字段,逐一记录并做情报核对 |
| users:(("name",pid=,fd=)) | 占用该套接字的进程名、PID 与文件描述符 | 进程名可被伪造,需用 /proc/<pid>/exe 与 cmdline 复核 |
非 root 运行 ss 只能看到自身进程的 socket 归属,现场采集务必用 root,否则 -p 列会出现大量空白,容易被误判为「没有进程」。
ss 只反映采样那一瞬间。对短连接与快速外联(心跳、单次下载),需要多点采样或改用抓包与 NetFlow 等持续性来源补齐。