如何捕获单个进程的网络流量?

Kee*_*ook 113 networking wireshark

我想检查由单个进程处理的网络流量,但简单的网络捕获不起作用,因为我正在处理如此繁忙的系统(同时发生许多其他流量)。有没有办法将一个tcpdumpwireshark捕获到单个特定进程的网络流量隔离?(使用netstat是不够的。)

Cla*_*usi 168

要启动和监视新进程:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS
Run Code Online (Sandbox Code Playgroud)

要监视具有已知 PID 的现有进程:

strace -p $PID -f -e trace=network -s 10000
Run Code Online (Sandbox Code Playgroud)
  • -f 用于“遵循新流程”
  • -e 定义过滤器
  • -s 将字符串的限制设置为超过 32
  • -p 获取要附加到的进程 ID

  • 这很有用,因为它可以在没有 root 访问权限或特殊权限的情况下使用(无论如何,在某些 Linux 发行版上 - 在 Ubuntu 上,您可能需要特殊权限)。 (4认同)
  • 这也很有用,因为它可以针对已经启动的进程运行,并且几乎可以在任何 Linux 机器上使用。 (2认同)

小智 63

我知道这个线程有点旧,但我认为这可能对你们中的一些人有所帮助:

如果您的内核允许,通过在隔离的网络命名空间中运行所述进程并在所述命名空间中使用wireshark(或其他标准网络工具),可以非常轻松地捕获单个进程的网络流量。

设置可能看起来有点复杂,但是一旦您理解并熟悉它,它就会让您的工作变得轻松很多。

为此:

  • 好主意,但要注意“限制”。由于这是一个单独的命名空间,您无法使用回送地址或 UNIX 域套接字与默认命名空间中的本地进程通信。后者影响通过 D-Bus 的通信。 (5认同)
  • 所有这些似乎都需要 root 访问权限。 (3认同)

Ope*_*gia 21

确实有一种方法,使用Wireshark过滤器。但是您不能直接按进程名称或 PID 进行过滤(因为它们不是网络数量)。

您应该首先弄清楚您的进程使用的协议和端口(前面评论中的netstat命令效果很好)。

然后使用 Wireshark 用您刚刚检索的端口过滤入站(或出站)端口。这应该隔离您流程的传入和传出流量。

  • 对于简单的连接,这是可能的,但我需要跟踪 DNS、HTTP 等,这些都是匆匆过去的,因此没有一种简单的方法可以在繁忙的机器上使用 `netstat` 和简单的网络捕获过滤器。 (7认同)

Oli*_*Oli 19

netstat -taucp | grep <pid or process name>
Run Code Online (Sandbox Code Playgroud)

这将显示应用程序正在建立的连接,包括正在使用的端口。

  • 这将显示该时刻存在的连接,但它不会提供流量本身的日志。 (10认同)
  • 嗯,我确定。这将*不会*捕获进程的所有网络流量。 (3认同)

Cla*_*usi 14

只是一个想法:是否可以将您的应用程序绑定到不同的 IP 地址?如果是这样,您可以使用通常的嫌疑人(tcpdump等)

无法绑定到另一个 IP 地址的应用程序的工具:

http://freshmeat.net/projects/fixsrcip

fixsrcip是一种用于将传出 TCP 和 UDP 客户端套接字 ( IPv4 ) 绑定到多宿主主机上的特定源 IP 地址的工具

http://freshmeat.net/projects/force_bind

force_bind允许您强制绑定特定的 IP 和/或端口。它适用于 IPv4 和IPv6


小智 11

I have come to a similar issue and I was able to sort it out based on this answer by ioerror, using NFLOG as described here:

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap
Run Code Online (Sandbox Code Playgroud)

Then you can create run the process in question from a user account that doesn't do anything else - and voila, you have just isolated and captured traffic from a single process.

Just wanted to post back in case it helps anyone.


小智 9

我编写了一个 C 应用程序,它执行 felahdab 上面的精彩答案中描述的内容!

在这里看到:nsntrace github repo


小智 6

您可以尝试 tracedump - http://mutrics.iitis.pl/tracedump

它完全符合您的要求,您可以为其提供进程 ID 或要运行的程序。

  • 不错的项目,但是……不幸的是,“Tracedump 目前仅在 32 位 Linux 主机上运行”对我而言是致命的。 (3认同)

The*_*tor 5

尝试在strace下运行您感兴趣的进程:

strace ping www.askubuntu.com
Run Code Online (Sandbox Code Playgroud)

它将为您提供有关您的流程正在执行的操作的一些非常详细的信息。由于进程可以在任何地方打开它想要的任何端口,因此使用预定义的过滤器您可能会错过一些东西。

另一种方法是在您的网络上使用精简的虚拟机或测试机,并将您的进程单独放置在其上。然后你可以使用Wireshark从那台机器上捕获所有内容。您将非常确定您捕获的流量是相关的。


小智 5

这是一个肮脏的黑客,但我建议使用给定 UID 的 iptables 转移或记录目标。例如:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 
Run Code Online (Sandbox Code Playgroud)

对于该日志目标,可能还值得研究诸如“--log-tcp-sequence”、“--log-tcp-options”、“--log-ip-options”、“--log-uid”之类的内容. 尽管我怀疑这只会帮助您发布包含大量其他数据的 pcap。

如果您想标记数据包,然后某些标记的数据包将通过 netlink 套接字发送到您选择的进程,则 NFLOG 目标可能很有用。我想知道这对于使用 wireshark 和您作为特定用户运行的特定应用程序进行黑客攻击是否有用?