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

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

确实有一种方法,使用Wiresharkfilter。 但是您无法直接按进程名称或PID进行筛选(因为它们不是网络数量)。

您应该首先弄清楚您的进程使用的协议和端口(上一条评论中的netstat命令运行良好)。

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

要启动和监控新流程:

 strace -f -e trace=network -s 10000 PROCESS ARGUMENTS 

要使用已知PID监视现有进程:

 strace -p $PID -f -e trace=network -s 10000 
  • -f用于“关注新流程”
  • -e定义filter
  • -s将字符串的限制设置为大于32
  • -p将要附加的进程ID

我知道这个post有点旧,但我想这可能对你们有些帮助:

如果您的内核允许,通过在隔离的网络命名空间中运行所述进程并在所述命名空间中使用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 
  • 在测试命名空间中配置路由:

     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  -j SNAT --to-source  

    (如果您愿意,也可以使用MASQUERADE规则)

  • 最后,您可以在新命名空间中运行要分析的进程,也可以运行wireshark:

     ip netns exec test thebinarytotest ip netns exec test wireshark 

    你必须监控veth-a接口。

 netstat -taucp | grep  

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

我遇到了类似的问题,我可以根据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 

然后,您可以从不执行任何其他操作的用户帐户创建有问题的流程 – 瞧,您刚刚隔离并捕获来自单个流程的流量。

只是想回复以防万一它可以帮助任何人。

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

用于不能绑定到另一个IP地址的应用程序的工具:

http://freshmeat.net/projects/fixsrcip

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

http://freshmeat.net/projects/force_bind

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

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

 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和您作为特定用户运行的特定应用程序进行攻击是否有用?

你可以试试tracedump – http://mutrics.iitis.pl/tracedump

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

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

 strace ping www.askubuntu.com 

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

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

基于ioerror的答案,我怀疑你可以使用iptables --uid-owner在流量上设置标记,然后你可以让wireshark只捕获带有该标记的流量。 您可以使用DSCP(差异服务标记),流ID或qos标记。

或者您确实可以使用它将这些数据包发送到不同的接口,然后仅在该接口上捕获。

我写了一个C应用程序,它完成了felahdab在上面的答案中描述的内容!

见这里: nsntrace github repo

wireshark bug#1184就是这个function。 它尚未实施。
在ask.wireshark.org上从用户cmanynard复制

也许iptables和ulog可以工作? 并不是说我有一个确切的配方,但我认为 iptables可以匹配进程,一旦匹配你就可以使用ulog。

我认为您可以创建一个shell脚本来循环执行netstat并将其记录到文本文件中。 像(非常粗略的步骤):

 echo "press q to quit" while [ ] do `netstat -taucp | grep  1>>logfile.txt` done 

我不是程序员,所以我无法改进这一点。 但是这里有人可以从我离开的地方开始,为你创建一个工作脚本。