核心是发现“有连接却无归属进程”的异常:先用ss -tulnp筛PID为-的监听,再查ESTABLISHED连接中users(( ))或PID为空的幽灵连接,接着通过/proc/PID/exe验证路径是否在/tmp等可疑目录,最后用inode关联和/proc/net/tcp/raw交叉验证内核级隐藏。

排查隐藏监听端口和异常网络连接,核心不是找“陌生端口”,而是揪出“有连接却没归属进程”的异常状态。Linux 自带命令足够用,关键在组合逻辑和验证思路。
一、先筛出可疑监听,重点盯“PID为空”的行
运行 ss -tulnp(需 root 权限),看 LISTEN 状态的输出:
- 若某行 Local Address 是 0.0.0.0:1080 或 *:4444,但 PID/Program 列显示为 - 或空白,大概率是后门监听
- 立即补查 netstat -tulnp 2>/dev/null:如果 netstat 能显示 PID 而 ss 不能,说明 ss 可能被篡改;如果两者都无 PID,基本可确认异常
- 过滤高危端口更快定位:ss -tuln | grep -E ':1080|:31337|:5555|:6666|:4444'
二、查已建立连接但无进程名的“幽灵连接”
监听只是入口,真正活跃的是 ESTABLISHED 连接。运行:
- ss -tnp | grep ESTAB,关注那些 users:(( )) 或 PID 列为 - 的行
- 对可疑远程 IP,追查它连的是哪个本地端口:ss -tnp | grep "185.245.123.45"
- 确认该连接是否真实收发数据:ss -tun state established '( dport = :1080 or sport = :1080 )'
三、顺 PID 找真实路径,识别临时目录伪装
拿到 PID 后,别只信进程名,要看它从哪启动:
- ps -p PID -o pid,ppid,user,comm,cmd:看 comm 是否异常(如 [kthreadd] 后跟空格+乱码)
- ls -l /proc/PID/exe:输出路径若指向 /tmp/.X11-unix/ksys、/dev/shm/update.bin 或 /var/tmp/.cache/ld.so,高度可疑
- 快速扫所有临时目录运行的进程:ls -la /proc/*/exe 2>/dev/null | grep -E '/tmp|/dev/shm|/var/tmp'
四、交叉验证,排除 rootkit 或内核级隐藏
当 ss 和 netstat 都看不到 PID,但端口确实在监听,就要深入内核层:
- 查 /proc/net/tcp 中该端口对应的 inode(端口号转小写十六进制,如 31337 → 7a69):awk '$2 ~ /:7a69/ {print $10}' /proc/net/tcp
- 遍历所有进程 fd,找匹配该 inode 的:for i in /proc/[0-9]*; do ls -l $i/fd/ 2>/dev/null | grep -q 'socket:\[12345\]' && echo $i; done
- 若完全找不到对应进程,需检查 lsmod 是否有可疑模块,并查看 /proc/net/raw* 是否存在原始套接字监听

















