我想检查单个进程处理的网络流量,但简单的网络捕获不起作用,因为我正在处理如此繁忙的系统(同时发生许多其他流量)。有没有办法隔离tcpdump
或wireshark
捕获单个特定进程的网络流量?(使用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
答案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
然后,您可以从不执行任何其他操作的用户帐户创建并运行有问题的进程 - 瞧,您刚刚隔离并捕获了来自单个进程的流量。
只是想回复一下,希望它能对任何人有帮助。