使用 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
显示调用connect
stap
root
# 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 秒的周期重复运行。