直接解析/proc/net/tcp可获取最原始tcp连接数据,用于监控非标ssh端口(如2222、50022)上的隐蔽established连接;需将端口转为大写十六进制(如2222→08ae),用awk匹配第2列末4位及第4列为"01"的行。

直接解析 /proc/net/tcp 是绕过工具开销、获取最原始连接数据的可靠方式,尤其适合监控非标 SSH 端口(如 2222、3389、50022 等)上的隐蔽 ESTABLISHED 连接——这类连接常被防火墙放行但未被常规服务日志记录,容易被忽略。
确认目标端口的十六进制表示
/proc/net/tcp 中本地端口字段(第2列)是十六进制,需先转换。例如:
- 端口 2222 → 十六进制为 08AE(小端序:字节翻转后存为 AE08,但内核按网络字节序存储,实际显示为
00000000:000008AE形式,取后4位即可) - 端口 50022 → 十进制转16进制得 C366,在文件中对应
:C366 - 用命令快速查:
printf "%04X\n" 2222或echo "obase=16; 2222" | bc
过滤 ESTABLISHED 状态并匹配目标端口
/proc/net/tcp 每行第4列为状态码(十六进制),01 表示 ESTABLISHED;第2列为本地地址+端口(格式为 0100007F:0016,冒号后4位是端口)。可用以下单行命令实时抓取:
watch -n 1 'awk '\''$4 == "01" && $2 ~ /:[0-9A-F]{4}$/ && substr($2, length($2)-3) == "08AE" {print $2, $3, $4}'\'' /proc/net/tcp'
- 其中
"08AE"替换为你目标端口的十六进制大写值(如 C366) -
$2是本地地址:端口字段,substr($2, length($2)-3)取末4位,精准匹配端口,避免误命中 108AE、208AE 等 -
$3是对端地址:端口(十六进制),可用于反向解析真实 IP:printf "%d.%d.%d.%d\n" 0x7F 0x00 0x00 0x01→127.0.0.1
识别隐蔽连接的关键特征
非标 SSH 的 ESTABLISHED 连接若属异常,往往呈现以下模式:
-
无对应监听进程:用
ss -tlnp | grep :2222查不到监听项,但/proc/net/tcp中却有 ESTABLISHED 条目 → 可能是进程 fork 后关闭了监听套接字,或通过 LD_PRELOAD 劫持了 socket 行为 -
对端 IP 非常规:如大量来自低信誉 ASN、已知 C2 域名解析出的 IP,或同一 IP 高频建立多个 ESTABLISHED(可统计:
awk '$4=="01" && substr($2,length($2)-3)=="08AE"{split($3,a,":"); print a[1]}' /proc/net/tcp | xargs -n1 printf "%02x\n" | tac | xargs -n4 printf "%d." | sed 's/\.$//' | sort | uniq -c | sort -nr) -
持续空闲但不关闭:结合
/proc/net/tcp第10列(timer 字段,需加-o选项才可见),但原生文件不提供 timer;此时建议辅以ss -tino state established '( dport = :2222 or sport = :2222 )'查看 keepalive 超时状态
自动化告警建议
将上述逻辑封装为轻量脚本,避免依赖 Python 或复杂环境:
- 每30秒扫描一次,发现 >3 个非标端口 ESTABLISHED 连接即发邮件或写入
/var/log/security/alert.log - 配合
lsof -iTCP:2222 -sTCP:ESTABLISHED -n -P(需 root)交叉验证进程归属,若输出为空,则高度可疑 - 注意:/proc/net/tcp 不包含用户态进程信息,必须搭配
lsof或ss -tunp(需权限)才能确认是否为 sshd、dropbear 或其他进程所建











