Kees Cook Asked: 2010-11-06 22:56:26 +0800 CST2010-11-06 22:56:26 +0800 CST 2010-11-06 22:56:26 +0800 CST 如何捕获单个进程的网络流量? 772 我想检查由单个进程处理的网络流量,但简单的网络捕获不起作用,因为我正在处理如此繁忙的系统(同时发生许多其他流量)。有没有办法隔离tcpdump或wireshark捕获单个特定进程的网络流量?(使用netstat不足。) networking wireshark 15 个回答 Voted Clausi 2010-11-11T03:04:37+08:002010-11-11T03:04:37+08:00 启动和监控新进程: strace -f -e trace=network -s 10000 PROCESS ARGUMENTS 使用已知 PID 监控现有进程: strace -p $PID -f -e trace=network -s 10000 -f用于“遵循新流程” -e定义一个过滤器 -s将字符串的限制设置为超过 32 -p获取要附加到的进程 ID felahdab 2014-07-20T03:39:43+08:002014-07-20T03:39:43+08:00 我知道这个线程有点旧,但我认为这可能会对你们中的一些人有所帮助: 如果你的内核允许,捕获单个进程的网络流量很容易通过在隔离的网络命名空间中运行所述进程并在所述命名空间中使用wireshark(或其他标准网络工具)来完成。 设置可能看起来有点复杂,但是一旦您理解并熟悉它,它将大大简化您的工作。 为此: 创建一个测试网络命名空间: ip netns add test 创建一对虚拟网络接口(veth-a 和 veth-b): ip link add veth-a type veth peer name veth-b 更改 veth-a 接口的活动命名空间: ip link set veth-a netns test 配置虚拟接口的 IP 地址: ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0 ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0 在 test 命名空间中配置路由: ip netns exec test route add default gw 192.168.163.254 dev veth-a 激活 ip_forward 并建立 NAT 规则来转发来自您创建的命名空间的流量(您必须调整网络接口和 SNAT ip 地址): echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address> (如果您愿意,也可以使用 MASQUERADE 规则) 最后,您可以在新的命名空间中运行您要分析的进程,也可以使用wireshark: ip netns exec test thebinarytotest ip netns exec test wireshark 您必须监视 veth-a 接口。 Best Answer OpenNingia 2010-11-07T01:53:52+08:002010-11-07T01:53:52+08:00 确实有一种方法,使用Wireshark过滤器。但是您不能直接按进程名称或 PID 过滤(因为它们不是网络数量)。 您应该首先弄清楚您的进程使用的协议和端口(上一条评论中的netstat命令效果很好)。 然后使用 Wireshark 将入站(或出站)端口与您刚刚检索到的端口一起过滤。这应该隔离进程的传入和传出流量。 Oli 2010-11-07T01:15:02+08:002010-11-07T01:15:02+08:00 netstat -taucp | grep <pid or process name> 这将显示应用程序正在建立的连接,包括正在使用的端口。 Clausi 2010-11-11T04:33:51+08:002010-11-11T04:33:51+08:00 只是一个想法:是否可以将您的应用程序绑定到不同的 IP 地址?如果是这样,您可以使用通常的嫌疑人(tcpdump等) 适用于无法绑定到另一个 IP 地址的应用程序的工具: http://freshmeat.net/projects/fixsrcip fixsrcip是一种将传出 TCP 和 UDP 客户端套接字 ( IPv4 ) 绑定到多宿主主机上的特定源 IP 地址的工具 http://freshmeat.net/projects/force_bind force_bind允许您强制绑定特定的 IP 和/或端口。它适用于 IPv4 和IPv6。 szymon 2014-04-07T06:49:01+08:002014-04-07T06:49:01+08:00 我遇到了一个类似的问题,我能够根据 ioerror 的这个答案,使用这里描述的 NFLOG 来解决它: # 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 然后,您可以从不执行任何其他操作的用户帐户创建运行有问题的进程 - 瞧,您刚刚从单个进程中隔离并捕获了流量。 只是想回帖以防它对任何人有帮助。 Jonas Danielsson 2016-07-16T03:24:33+08:002016-07-16T03:24:33+08:00 我编写了一个 C 应用程序,该应用程序执行 felahdab 上述出色答案中所描述的功能! 见这里:nsntrace github repo pjf 2014-04-02T04:51:03+08:002014-04-02T04:51:03+08:00 您可以尝试 tracedump - http://mutrics.iitis.pl/tracedump 它完全符合您的要求,您可以给它一个进程 ID 或一个要运行的程序。 The Unix Janitor 2010-11-11T01:54:36+08:002010-11-11T01:54:36+08:00 尝试在strace下运行您感兴趣的进程: strace ping www.askubuntu.com 它将为您提供一些有关您的流程正在做什么的非常详细的信息。由于一个进程可以在任何地方打开它想要的任何端口,使用预定义的过滤器你可能会错过一些东西。 另一种方法是在您的网络上使用精简的虚拟机或测试机,并将您的进程单独放置在其上。然后你可以使用Wireshark从那台机器上捕获所有内容。您将非常确定您捕获的流量是相关的。 ioerror 2010-12-13T01:50:56+08:002010-12-13T01:50:56+08:00 这是一个肮脏的黑客,但我建议为给定的 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 对于该日志目标,可能还值得研究诸如“--log-tcp-sequence”、“--log-tcp-options”、“--log-ip-options”、“--log-uid”之类的东西. 虽然我怀疑这只会帮助您发布包含大量其他数据的 pcap。 如果您想标记数据包,然后某些标记的数据包将通过 netlink 套接字发送到您选择的进程,则 NFLOG 目标可能很有用。我想知道这对于使用wireshark破解某些东西以及您作为特定用户运行的特定应用程序是否有用?
启动和监控新进程:
使用已知 PID 监控现有进程:
-f
用于“遵循新流程”-e
定义一个过滤器-s
将字符串的限制设置为超过 32-p
获取要附加到的进程 ID我知道这个线程有点旧,但我认为这可能会对你们中的一些人有所帮助:
如果你的内核允许,捕获单个进程的网络流量很容易通过在隔离的网络命名空间中运行所述进程并在所述命名空间中使用wireshark(或其他标准网络工具)来完成。
设置可能看起来有点复杂,但是一旦您理解并熟悉它,它将大大简化您的工作。
为此:
创建一个测试网络命名空间:
创建一对虚拟网络接口(veth-a 和 veth-b):
更改 veth-a 接口的活动命名空间:
配置虚拟接口的 IP 地址:
在 test 命名空间中配置路由:
激活 ip_forward 并建立 NAT 规则来转发来自您创建的命名空间的流量(您必须调整网络接口和 SNAT ip 地址):
(如果您愿意,也可以使用 MASQUERADE 规则)
最后,您可以在新的命名空间中运行您要分析的进程,也可以使用wireshark:
您必须监视 veth-a 接口。
确实有一种方法,使用Wireshark过滤器。但是您不能直接按进程名称或 PID 过滤(因为它们不是网络数量)。
您应该首先弄清楚您的进程使用的协议和端口(上一条评论中的netstat命令效果很好)。
然后使用 Wireshark 将入站(或出站)端口与您刚刚检索到的端口一起过滤。这应该隔离进程的传入和传出流量。
这将显示应用程序正在建立的连接,包括正在使用的端口。
只是一个想法:是否可以将您的应用程序绑定到不同的 IP 地址?如果是这样,您可以使用通常的嫌疑人(tcpdump等)
适用于无法绑定到另一个 IP 地址的应用程序的工具:
http://freshmeat.net/projects/fixsrcip
http://freshmeat.net/projects/force_bind
我遇到了一个类似的问题,我能够根据 ioerror 的这个答案,使用这里描述的 NFLOG 来解决它:
然后,您可以从不执行任何其他操作的用户帐户创建运行有问题的进程 - 瞧,您刚刚从单个进程中隔离并捕获了流量。
只是想回帖以防它对任何人有帮助。
我编写了一个 C 应用程序,该应用程序执行 felahdab 上述出色答案中所描述的功能!
见这里:nsntrace github repo
您可以尝试 tracedump - http://mutrics.iitis.pl/tracedump
它完全符合您的要求,您可以给它一个进程 ID 或一个要运行的程序。
尝试在strace下运行您感兴趣的进程:
它将为您提供一些有关您的流程正在做什么的非常详细的信息。由于一个进程可以在任何地方打开它想要的任何端口,使用预定义的过滤器你可能会错过一些东西。
另一种方法是在您的网络上使用精简的虚拟机或测试机,并将您的进程单独放置在其上。然后你可以使用Wireshark从那台机器上捕获所有内容。您将非常确定您捕获的流量是相关的。
这是一个肮脏的黑客,但我建议为给定的 UID 使用 iptables 进行转移或日志目标。例如:
对于该日志目标,可能还值得研究诸如“--log-tcp-sequence”、“--log-tcp-options”、“--log-ip-options”、“--log-uid”之类的东西. 虽然我怀疑这只会帮助您发布包含大量其他数据的 pcap。
如果您想标记数据包,然后某些标记的数据包将通过 netlink 套接字发送到您选择的进程,则 NFLOG 目标可能很有用。我想知道这对于使用wireshark破解某些东西以及您作为特定用户运行的特定应用程序是否有用?