如何监控Linux服务器以定位发起特定IP连接的进程
如何监控Linux服务器以定位发起特定IP连接的进程
碰到这种一闪而过的短连接确实头疼,netstat反应太慢根本抓不到,我给你几个实用的方案,按上手难度从低到高来:
用
ss+watch实时轮询ss比传统的netstat快得多,实时性更好,配合watch高频刷新大概率能抓到瞬间的连接。执行命令:watch -n 0.1 'ss -tp dst 目标IP'解释下参数:
-t只显示TCP连接,-p显示关联的进程信息,-n 0.1表示每0.1秒刷新一次。如果是UDP连接,把-t换成-u就行。用auditd系统审计追踪
auditd是Linux自带的系统审计工具,能精准记录系统调用事件,包括发起网络连接的动作。- 先确保auditd已安装并运行(一般发行版默认有,没装的话用包管理器安装即可)
- 添加审计规则,追踪目标IP的连接请求:
如果是32位系统,把auditctl -a exit,always -F arch=b64 -S connect -F dst=目标IPb64换成b32 - 查看审计日志,直接过滤连接相关的记录:
或者直接查看日志文件ausearch -i -c connect/var/log/audit/audit.log,里面会明确记录发起连接的进程PID、命令名等信息。用完记得删除规则避免日志膨胀:auditctl -d exit,always -F arch=b64 -S connect -F dst=目标IP
用bpftrace实时捕获(进阶方案)
bpftrace基于eBPF,能在连接发起的瞬间直接捕获进程信息,完全不会错过任何短连接。写个简单的追踪脚本(比如track-connect.bt):tracepoint:syscalls:sys_enter_connect { if (args->addr->sa_family == AF_INET) { $ip = ntop(((struct sockaddr_in *)args->addr)->sin_addr.s_addr); if ($ip == "目标IP") { printf("PID: %d, 进程名: %s, 目标IP: %s\n", pid, comm, $ip); } } }然后用root权限运行:
bpftrace track-connect.bt只要有进程发起对目标IP的连接,立刻就能看到对应的PID和进程名,非常精准。
这些方法都需要root权限才能运行,根据你的实际情况选就行——如果只是临时排查,用ss+watch最省事;如果需要长期追踪或者更精准的记录,auditd或bpftrace更合适。
备注:内容来源于stack exchange,提问作者Dick Kennedy




