![记录 Linux 进程的网络使用情况?](https://linux22.com/image/783512/%E8%AE%B0%E5%BD%95%20Linux%20%E8%BF%9B%E7%A8%8B%E7%9A%84%E7%BD%91%E7%BB%9C%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%EF%BC%9F.png)
我正在寻找一种方法来记录单个 Linux 进程的网络流量(在 Ubuntu 上,但也会考虑其他版本)。我正在寻找类似的东西,tcpdump
但针对的是进程,而不是整个系统或网络接口。有这样的事吗?
这里的背景是,我希望验证我们的软件(使用少数几个库构建)没有“打电话回家”——无论是对我们作为软件开发人员,还是对任何其他开发人员(可能是库开发人员)。我的目的是能够通过此工具运行我的流程,并让它在我们尽可能多地运行我们的应用程序时记录所有网络请求。然后,我们可以查看网络日志,以确保其中没有任何意外情况。
我研究过iftop
、nethogs
和iptraf
,当然还有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,它们使用一个nginx
并mysql
在主机本身上运行。从nginx
容器获取流量非常容易(使用端口映射)。将流量从 UI 容器转移到 API 容器非常容易(使用标准 docker 网络,其中另一个容器的端口出现在 上localhost
)。
从 API 到 被mysql
证明是比较棘手的。Docker 确实不想让容器localhost
与其主机通信。但它将很容易与面向网络的接口通信(通过172.17.0.x
分配给 Docker 容器的 IP 地址)。mysql
在网络接口上进行监听而不是localhost
完成“电路”。
一旦一切正常,通过观察 Docker 界面就可以轻松查看所有 Docker 流量tcpdump -ni docker0
。
看来,这个问题没有快速简单的解决方案,只有几个潜在的解决方案。