为什么要按进程统计连接
ss -antp 的 users 字段会带上归属进程,形如 users:(("nginx",pid=1234,fd=6))。把它提取出来按 PID 计数、排名,连接数明显突出的那个进程往往就是扫描器、爆破脚本或代理转发。相比一条条看连接,按进程聚合能一眼看出谁是连接热点,再顺着 PID 去看可执行文件和父进程。
基本信息
| 适用平台 | Linux(iproute2 提供的 ss) |
|---|---|
| 权限要求 | sudo/root,否则看不到其他用户的 pid |
| 解析要点 | 从 users:(("name",pid=N,fd=M)) 中提取 pid= 值 |
| 计数口径 | grep -o 对同一 socket 的多个引用分别计数 |
| 对比基准 | 与该服务正常连接数基线比对 |
| 后续动作 | ps 看 cmdline、ppid、启动时间与 exe 真实路径 |
典型使用场景
- 外连数量异常、出口带宽飙升时快速定位责任进程
- 怀疑主机被当作跳板做端口扫描,找发起大量连接的进程
- SSH 爆破期间确认 sshd 连接来源是否集中、是否属于同一账号
- 容量巡检时识别连接数长期偏高、可能存在泄漏的进程
- 与 netstat、ss 原始输出交叉,避免只看聚合数字造成误判
按 PID 聚合连接
按 PID 聚合连接
sudo ss -antp | grep -oE 'pid=[0-9]+' | sort | uniq -c | sort -rn | head -n 20 # 按 PID 计数排名
ss -antp state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head # 对端 IP 聚合
ps -p 1234 -o pid,ppid,user,lstart,etimes,cmd # 看热点进程的身份与启动时间
ls -l /proc/1234/exe; tr '\0' ' ' < /proc/1234/cmdline; echo # 核实真实可执行文件
ss -antp '( dport = :22 )' | head # 只看目标端口为 22 的连接ss 输出逐列读法
| 列/字段 | 含义 | 正常与异常 |
|---|---|---|
| State | TCP 连接状态 | 大量 SYN-SENT 与大量 ESTAB 指向完全不同的原因 |
| Recv-Q/Send-Q | 接收与发送队列积压 | 持续非 0 说明对端处理不过来或链路拥塞 |
| Local Address:Port | 本地地址与端口 | 出现非业务监听端口需要解释来源 |
| Peer Address:Port | 对端地址与端口 | 集中在少数境外 IP 或固定扫描端口可疑 |
| users:(...) | 归属进程与 pid | 聚合排名最高者优先核查 |
同一 socket 可能被多个进程引用(fork 后共享 fd),grep -o 会逐条计数,这恰好符合「谁在忙」的直觉,但不等于按 socket 去重的严谨统计。
高连接数不等于攻击:Nginx、Java 应用、数据库连接池在正常业务下连接数本身就很高。先建立业务基线,再决定是否处置。