我想检查由单个进程处理的网络流量,但是由于我正在处理如此繁忙的系统(许多其他流量同时发生),因此无法进行简单的网络捕获。有没有一种方法可以将单个特定进程的网络通信隔离tcpdump
或wireshark
捕获?(使用netstat
不足。)
我想检查由单个进程处理的网络流量,但是由于我正在处理如此繁忙的系统(许多其他流量同时发生),因此无法进行简单的网络捕获。有没有一种方法可以将单个特定进程的网络通信隔离tcpdump
或wireshark
捕获?(使用netstat
不足。)
Answers:
确实,有一种使用Wireshark过滤器的方法。但是您不能直接按进程名称或PID进行过滤(因为它们不是网络数量)。
您应该首先弄清进程使用的协议和端口(上一条注释中的netstat命令运行良好)。
然后使用Wireshark使用刚检索的端口过滤入站(或出站)端口。那应该隔离您的过程的传入和传出流量。
netstat
; 我将只能抓住长期存在的联系。:(
要启动和监视新过程:
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我知道这个线程有点旧,但是我认为这可能对某些人有帮助:
如果您的内核允许,通过在一个隔离的网络名称空间中运行该进程并在该名称空间中也使用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界面。
socat
。
netstat -taucp | grep <pid or process name>
这将显示应用程序正在建立的连接,包括正在使用的端口。
只是一个想法:是否可以将您的应用程序绑定到其他IP地址?如果是这样,则可以使用通常的可疑对象(tcpdump等)
用于无法绑定到另一个IP地址的应用程序的工具:
http://freshmeat.net/projects/fixsrcip
fixsrcip
是用于将传出的TCP和UDP客户端套接字(IPv4)绑定到多宿主主机上的特定源IP地址的工具
http://freshmeat.net/projects/force_bind
force_bind
允许您强制绑定到特定的IP和/或端口。它可与IPv4和IPv6一起使用。
我得出了一个类似的问题,我能在此基础上整理出这个答案通过的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
然后,您可以使用一个不执行任何其他操作的用户帐户来创建正在运行的流程-瞧,您只是从单个流程中隔离并捕获了流量。
只是想发回邮件,以防万一。
我编写了一个C应用程序,它执行了felahdab上面的出色解答中所述的内容!
看到这里:nsntrace github repo
这是一个肮脏的hack,但我建议使用给定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破解某些东西以及您以特定用户身份运行的特定应用程序是否有用?
您可以尝试使用tracedump- http: //mutrics.iitis.pl/tracedump
它可以完全满足您的要求,您可以给它一个进程ID或要运行的程序。
尝试在strace下运行您感兴趣的过程:
strace ping www.askubuntu.com
它将为您提供有关流程执行情况的非常详细的信息。由于进程可以将其想要打开的任何端口打开到任何地方,因此使用预定义的筛选器可能会丢失某些内容。
另一种方法是在网络上使用精简虚拟机或测试机,并在此基础上独立放置您的进程。然后,您可以使用Wireshark从该计算机上捕获所有信息。您将非常确定,您捕获的流量将是相关的。
基于ioerror的答案,我怀疑您可以用来iptables --uid-owner
在流量上设置标记,然后可以要求Wireshark仅捕获带有该标记的流量。您可能可以使用DSCP(差异服务标记),流id或qos标记。
或者确实可以使用此命令将那些数据包发送到另一个接口,然后仅在该接口上捕获。
Wireshark错误#1184是此功能。尚未实施。
从用户cmanynard复制到ask.wireshark.org
也许iptables和ulog可以工作?并不是说我有一个确切的配方,但是我认为 iptables可以匹配进程,一旦匹配就可以使用ulog。
iptables -m owner --pid-owner $PID
在Linux 2.6.14中已被删除:ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
我认为您可以创建一个Shell脚本来循环执行netstat并将其记录到文本文件中。有点像(非常粗糙的步骤):
echo "press q to quit"
while [ <q is not pressed>]
do
`netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done
我不是程序员,所以我无法完善这一点。但是这里有人可以从我离开的地方开始,为您创建一个有效的脚本。
netstat
在繁忙的机器上使用和简单的网络捕获过滤器。