查找启动 TCP 连接的本地进程

查找启动 TCP 连接的本地进程

使用 tcpdump 我看到许多 SYN 数据包...并且源 IP 是本地主机。

我希望找到哪些进程正在尝试连接。

请注意,连接未达到 ESTABLISHED 状态,它们似乎是随机端口扫描。

答案1

我最近在 Linux 上也遇到过同样的情况(罪魁祸首是adb)。我的方法是使用审计系统来记录connect()系统调用。

sudo auditctl -a exit,always  -F arch=b64  -S connect -k who-connects

告诉审计系统记录所有connect()系统调用(这里是 64 位变体,如果您使用的是同时具有 32 位和 64 位应用程序的多体系结构系统,则可以为 32 位变体添加另一个系统调用)

稍后运行:

sudo ausearch -i -k who-connects

看看是什么建立了联系。

不使用套接字 API 仍然可以建立 TCP 连接。例如,通过在用户空间中实现 TCP 堆栈并使用较低级别的 API 来发送数据包,但这并不常见(尤其是在环回接口上)。

答案2

假设您安装了 SystemTap

probe begin {
    printf("ok\n");
}
probe syscall.connect {
    # connect however may fail or flail around in a EINPROGRESS state;
    # this log only indicates that a connect was attempted
    if (uaddr_af == "AF_INET" || uaddr_af == "AF_INET6")
        printf("%s[%d]: %s\n", execname(), pid(), argstr);
}
probe syscall.connect.return {
    printf(" -> %s[%d]: %s\n", execname(), pid(), retstr);
}

另存为将在使用as运行时whomakeconnect.stp显示调用connectstaproot

# stap-prep
... fix anything reported, it requires debug kernels ...
# stap whomakeconnect.stp

答案3

您可以使用 netstat 命令。它显示数据包的状态。但你必须捕获输出,因为它只在发送时出现。它不像 tcp 监听套接字。这就是为什么你可以使用 watch 命令来捕捉它。我认为连接是通过 ipv4 进行的。

watch -n 0.1 'netstat -4pn | grep -F "SYN_SENT"'

内斯塔旗帜

p 标志:进程 ID/名称

n 标志:数字输出(无 DNS 解析)

4 标志:显示 ipv4 套接字

watch 命令使 netstat 命令以 0.1 秒的周期重复运行。

相关内容