You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何监控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自带的系统审计工具,能精准记录系统调用事件,包括发起网络连接的动作。

    1. 先确保auditd已安装并运行(一般发行版默认有,没装的话用包管理器安装即可)
    2. 添加审计规则,追踪目标IP的连接请求:
      auditctl -a exit,always -F arch=b64 -S connect -F dst=目标IP
      
      如果是32位系统,把b64换成b32
    3. 查看审计日志,直接过滤连接相关的记录:
      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

火山引擎 最新活动