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

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

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

答案1

要启动并监控新进程:

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

答案2

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

如果您的内核允许,那么通过在隔离的网络命名空间中运行该进程并在该命名空间中使用 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 <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 接口。

答案3

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

您应该首先弄清楚您的进程使用的协议和端口(网络状态前面评论中的命令运行良好)。

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

答案4

我遇到过类似的问题,我能够根据以下内容进行整理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

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

只是想回复一下,希望它能对任何人有帮助。

相关内容