排查ssh会话数据抽水需绕过/proc/pid/net/dev(仅网卡全局统计),转而通过ss定位sshd子进程inode,用ss -i查bytes_sent/bytes_acked差值、recv-q堆积及运行时长等指标综合判断异常下行流量。

直接解析 /proc/PID/net/dev 无法审计特定远程 SSH 会话的数据抽水行为——因为该文件不按进程粒度统计网络流量,而是内核网络设备(如 eth0、lo)的全局收发统计,所有经过该网卡的流量(包括 HTTP、DNS、SSH、后台更新等)全部混在一起,与某个 sshd 进程完全无关。
真正能关联“某个 SSH 会话”和“其产生的网络数据量”的路径,是 /proc/<sshd_child_pid>/fd/</sshd_child_pid> + netstat / ss + 流量采样比对,配合时间窗口与行为基线判断。以下是可落地的操作逻辑:
? 确认目标:先锁定可疑的 SSH 子进程(非主进程)
sshd 主进程(PID)只负责监听和派生子进程;每个成功登录的会话由一个独立的 sshd 子进程处理(带 -D 或 @ 标识),它才持有该会话的 socket 和真实网络连接。
# 查看所有活跃 SSH 连接及其对应子进程 PID ss -tnp | grep ':22' | grep ESTAB # 或更清晰地匹配 sshd 子进程(排除父进程) ps -eo pid,ppid,comm,args --forest | grep sshd | grep -v "sshd:" | grep -E "(sshd@|sshd.*@)"
输出示例:
12345 1234 sshd sshd: alice@pts/1 23456 1234 sshd sshd: bob@notty
→ 12345 和 23456 才是你要审计的会话级进程 PID。
? 获取该会话的实时网络连接信息(含字节数)
Linux 内核不直接暴露单个进程的 实时字节收发量,但可通过以下组合逼近:
✅ 方法一:用 ss 查连接 + 持续采样 skbuff(推荐)
# 获取该 PID 对应的 socket inode(关键!)
ls -l /proc/12345/fd/ | grep socket | awk -F'[' '{print $2}' | cut -d']' -f1
# 假设输出为 12345678 → 查询该 inode 的 TCP 连接详情(含已发送/接收字节数)
ss -i -t -n "inode:12345678"
输出中包含:
skmem:(r0,rb262144,t0,tb262144,f0,w0,o0,bl0,d0)
但更关键的是:
bytes_sent:123456789 bytes_acked:123456780
⚠️ 注意:bytes_sent 是内核已发出的字节数(含重传),bytes_acked 是对方确认收到的——二者差值过大(>1MB)且持续增长,可能表示大量下行数据推送(抽水)。
✅ 方法二:用 cat /proc/12345/net/dev?❌ 错误用法!
这个文件内容是:
Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed eth0: 123456789 ... 987654321 ...
→ 它统计的是整块网卡,和 PID 12345 完全无关。强行读它等于看总电表猜哪户在偷电。
? 判断“非正常数据抽水”的实用指标(非绝对,需结合上下文)
对同一个 sshd 子进程,在 30 秒内重复执行 ss -i -t -n "inode:...",观察:
-
bytes_acked在 30 秒内增长 >50MB,而用户未执行scp/rsync/tar -c|ssh等显式传输命令 -
bytes_sent增长远小于bytes_acked(说明服务端在疯狂下发,客户端几乎不发) - 连接处于
ESTAB状态,但ss -t -n显示Recv-Q长期 > 100KB(接收缓冲区堆积,可能是脚本阻塞或恶意拉取) -
ps -o pid,etime,cmd -p 12345显示该进程已运行数小时,但w或last -i中无对应交互记录
→ 此时高度疑似:攻击者维持长连接,后台静默下载敏感文件(如 /var/log/auth.log、~/.bash_history、数据库导出文件)。
? 快速响应建议(发现即处置)
# 1. 立即切断连接(不杀进程,避免丢日志)
echo 1 > /proc/12345/oom_score_adj # 降低优先级(可选)
kill -STOP 12345 # 暂停进程(保留内存镜像供分析)
# 2. 提取其打开的文件和命令行
cat /proc/12345/cmdline | tr '\0' '\n'
ls -l /proc/12345/fd/ | grep -E "(socket|pipe)"
# 3. 抓包验证(若允许)
tcpdump -i any -w ssh_suspicious.pcap port 22 and host $(ss -tnp "inode:12345678" | awk '{print $5}' | cut -d',' -f1)
⚠️ 注意:
/proc/PID/net/dev不提供进程级网络数据,别再用它审计 SSH 会话。真正有效的路径是:ss -t -n定位 inode →ss -i查字节 →lsof -p//proc/PID/fd/查行为 → 时间差+基线比对做判断。
不复杂但容易忽略。











