问题描述
我想检查一个进程处理的网络流量,但简单的网络捕获将不起作用,因为我正在处理这样一个繁忙的系统(大量其他流量同时发生)。有没有办法将tcpdump
或wireshark
捕获与单个特定流程的网络流量隔离? (使用netstat
不足。)
最佳解决思路
确实有一种方法,使用Wireshark过滤器。但是不能直接按进程名称或PID进行筛选(因为它们不是网络数量)。
您应该首先找出流程使用的协议和端口(上一条注释中的netstat命令运行良好)。
然后使用Wireshark过滤入站(或出站)端口与您刚才检索的端口。这应该隔离流程的传入和传出流量。
次佳解决思路
要启动并监控新流程:
strace -f -e trace=network -s 10000 PROCESS ARGUMENTS
使用已知的PID监控现有流程:
strace -p $PID -f -e trace=network -s 10000
第三种解决思路
我知道这个线程有点老,但我认为这可能会帮助你们中的一些人:
如果你的内核允许这样做,捕获一个进程的网络流量很容易,通过在一个独立的网络命名空间中运行所述进程并在所述命名空间中使用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接口。
第四种思路
netstat -taucp | grep <pid or process name>
这将显示应用程序正在进行的连接,包括正在使用的端口。
第五种思路
只是一个想法:是否有可能将您的应用程序绑定到不同的IP地址?如果是这样,你可以使用通常的嫌疑犯(tcpdump等)
适用于无法绑定到其他IP地址的应用程序的工具:
http://freshmeat.net/projects/fixsrcip
fixsrcip
is a tool for binding outgoing TCP and UDP client sockets (IPv4) to specific source IP addresses on multi-homed hosts
http://freshmeat.net/projects/force_bind
force_bind
allows you to force binding on a specific IP and/or port. It works with both IPv4 and IPv6.
第六种思路
我遇到过类似的问题,我可以根据this answer by ioerror对它进行分类,使用如描述的NFLOG 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
然后,您可以创建运行有问题的流程,从一个别无其他的用户帐户 – 而且瞧,您刚刚从一个流程中分离和捕获流量。
只是想回复,以防它可以帮助任何人。
第七种思路
这是一个肮脏的黑客攻击,但我建议使用iptables的divert或日志目标为给定的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
它会给你一些关于你的过程在做什么的非常详细的信息。作为一个进程可以打开任何地方的任何端口,使用预定义的过滤器,你可能会错过一些东西。
另一种方法是在您的网络上使用stripped-down虚拟机或测试机器,并在其上单独放置您的进程。然后,您可以使用Wireshark从该机器捕获所有数据。你会很确定你捕获的流量是相关的。
第十种思路
建立在the answer by ioerror上我怀疑你可以使用iptables --uid-owner
在流量上设置一个标记,然后你可以要求wireshark只捕获那个标记的流量。您可能可以使用DSCP(差异服务标记),流ID或qos标记。
或者实际上您可以使用它将这些数据包从另一个接口发送出去,然后仅在该接口上进行捕获。