记录 Linux 进程的网络使用情况?

记录 Linux 进程的网络使用情况?

我正在寻找一种方法来记录单个 Linux 进程的网络流量(在 Ubuntu 上,但也会考虑其他版本)。我正在寻找类似的东西,tcpdump但针对的是进程,而不是整个系统或网络接口。有这样的事吗?

这里的背景是,我希望验证我们的软件(使用少数几个库构建)没有“打电话回家”——无论是对我们作为软件开发人员,还是对任何其他开发人员(可能是库开发人员)。我的目的是能够通过此工具运行我的流程,并让它在我们尽可能多地运行我们的应用程序时记录所有网络请求。然后,我们可以查看网络日志,以确保其中没有任何意外情况。

我研究过iftopnethogsiptraf,当然还有tcpdump。它们都可以很好地完成它们的工作,但它们不针对单个进程运行。我知道如果我先在容器中运行我的进程,会有一些选择,但如果我可以避免需要容器来执行此操作,那就更简单了。

答案1

如果您以唯一用户身份运行该应用程序,则可以使用 netfilter。

iptables -A OUTPUT -m owner --uid-owner 500 -j ULOG --ulog-nlgroup 1

--ulog-cprange如果您不想要整个包,请使用。

您需要配置ulogd接收日志。我不会给出 ulogd 配置的完整描述,但请注意,它应该使用--ulog-nlgroup与 iptables 命令相同的 netlink 多播组 ( )(上例中的 1)。您可能想要使用ulogd_output_PCAP输出插件。

答案2

我最初表示我不想使用容器,但发现iptables/ulogd 解决方案让它工作起来相当麻烦。因为将来可能不只是我一个人这样做,所以我最终选择使用容器来做这件事。

在我的例子中,我想测试一个 UI 和一个 API,它们使用一个nginxmysql在主机本身上运行。从nginx容器获取流量非常容易(使用端口映射)。将流量从 UI 容器转移到 API 容器非常容易(使用标准 docker 网络,其中另一个容器的端口出现在 上localhost)。

从 API 到 被mysql证明是比较棘手的。Docker 确实不想让容器localhost与其主机通信。但它将很容易与面向网络的接口通信(通过172.17.0.x分配给 Docker 容器的 IP 地址)。mysql在网络接口上进行监听而不是localhost完成“电路”。

一旦一切正常,通过观察 Docker 界面就可以轻松查看所有 Docker 流量tcpdump -ni docker0

看来,这个问题没有快速简单的解决方案,只有几个潜在的解决方案。

相关内容