是否有一个简单的命令行工具,用于在Linux上嗅探单个命令?


11

我很想知道在Linux中是否有一个命令行工具可用于包嗅探单个命令。就像sniff dumpfile command这样,您可以在终端中运行要嗅探数据包的命令,并在其他位置获取数据包的转储。

我只想转储/保存/仅查看我输入的单个命令的网络流量,而不是单个网络接口上的所有TCP流量。因此,如果我登录到计算机并在后台运行IRC,并且确实运行了IRC sniff somefile wget http://www.google.com,那么我想查看wget命令下载http://www.google.com所做的所有网络流量。我不希望“ somefile”使IRC网络流量令人困惑。

有许多linux / unix命令可以接受不同的命令并执行不同的操作。从sudo(以超级用户身份运行),nice更改级别,trickle(限制命令的带宽)


1
您到底想做什么?您是否要检查是否运行了某个命令?您想嗅探网络流量吗?因为使用短语“ packet sniffing a command”对我根本没有意义……
wzzrd

wzzrd,请参阅扩展问题
Rory

Answers:


10

我什么都不知道,但是从理论上讲,获得类似的东西应该不难。Strace可用于拦截网络系统调用。

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

这将为您提供有关内核与进程之间发送的数据的信息。strace的输出不完全是您想要的。但是,strace使用ptrace syscall来拦截系统调用。可能可以编写一个程序以更有效地输出数据。

另外,您也可以拦截有用的套接字,绑定和监听系统调用。也许可以编写一个小程序,在每次调用新套接字时使用ptrace并使用libpcap动态更改捕获过滤器。


如果它输出Wireshark可以读取的内容,那就太好了。
布拉德·吉尔伯特

请记住,上述strace对Solaris(可能还有其他商业Unices)而言是准确的。在Linux上,strace是系统调用跟踪程序,其操作和输出类似于Solaris上的truss或HP-UX上的tusc。
James F

1
我在Linux上描述了strace。
David Pashley 2009年


4

尝试Wireshark-命令将是 tshark

  • tshark允许您选择从接口捕获的流量的过滤器
  • 使用其他实用程序(如debian lsof)来确定您感兴趣的应用程序完成的通信类型。

或者,您真的只想要LSOF吗?


我认为没有一种工具可以动态地对与流程关联的所有通信进行过滤。但是,您可以尝试使用诸如之类的工具跟踪流程通信,lsof一旦有了一个好的过滤器,就可以将该流程的通信与系统上运行的所有其他流量隔离开,您就可以获得正确的捕获。

例如,wget通常目标IP地址与其他与流程相关的流量不同。即使采取类似skype目标端口范围的方法,通常对于实例也是固定的。


这有点像不确定性原理。通常可以知道什么是通过一组的通信路径去(具有嗅探器上流动识别组过滤),或者其中不同的通信链路正在作出(与lsof的)。

我真的很想知道是否可以同时为应用程序。我认为应该可行。但是,还没有看到任何工具可以做到这一点。


lsof很棒,但是我宁愿看看它在做什么/发送/接收。
罗里

4

学习使用过滤器表达式。

尽管这不会完成您所要求的花哨的跟踪工作。

它将允许您从捕获中删除几乎所有“ IRC之类的令人困惑的东西”。

此外,了解过滤器语法以供将来快速参考也非常有用。


2

专门针对Web浏览器/网页,诸如Firefox的Firebug插件之类的东西可能会为您提供一些您正在寻找的信息:http : //getfirebug.com/net.html

对于更一般的应用程序,您可能需要使用netstat来识别应用程序使用的端口,然后使用带有过滤器的Wireshark / tshark / dtrace来仅捕获该流量。不是您要找的一线答案...


1

一个想法,尝试VMWare

-setup一个VM
-configure该VM使用特定的接口,
该接口上-sniff从主机(它就像在中间人攻击)

如果您隔离了该虚拟机上正在运行的网络应用程序,则可能会得到答案

我想,一个更理想的解决方案是按照它如何指定如何选择要进行对话的接口来执行VMWare的操作。我认为它的魔力来自它使用的内核模块,在这种情况下,可能是vmnet内核模块。

据我所知,应用程序不知道它们要使用哪种接口,我相信这是设计使然;他们不必担心这些事情。

此外,
我不知道,也许某个程序已经存在。但是,如果编写了一个,则可以将其称为nettrace(例如),用法可能像

nettrace程序界面

然后嗅探它使用的接口并将路由(可能是自动执行)添加到您的真实接口


是的,那将是可能的。但是,如果有一个简单而快速的工具来做到这一点,那就太好了。
罗里

也许是时候使用这个简单的工具了吗?我想知道这是否那么困难,也许vmnet mod可能是一个很好的起点(尽管我不知道是否会出现许可问题)。也许(黑客)只使用vmnet mod。我知道我经常对这样的问题感兴趣。
修订

1

假设您是当时尝试连接到Google的唯一人选,那么我认为这样的方法应该可以解决问题:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

如果您不是试图连接到Google的唯一连接,那么如果您可以识别要连接的IP /端口,还可以指定src端口/ src ip。

除非您可以在使用的任何客户端上指定src端口,否则识别它可能是一个问题。我不确定是否可以使用wget。

我强烈怀疑您可以同时指定src和dst端口, netcat因此,如果您确实对Google感兴趣,则可以通过netcat(手动)进行GET。

当然,手册页会为您提供详细信息


1

tcpdump手册页和许多网站提供了过滤器的深入示例,甚至还有一些tcpdump过滤器表达式的在线存储库。假设您对网络流量(源,目标,端口,协议等)有所了解,那么它应该能够执行您梦想中的几乎所有事情,而不仅仅是生成程序的原因。

如果您在服务器或无头盒上工作,则可以始终让tcpdump写入转储文件,然后在工作站上的Wireshark中打开它,并获得高级过滤和图形界面。


嗯,哪个切换到tcpdump命令会将其限制为生成流量的单个应用程序?
米兰巴布斯科夫2009年

1

通过对tshark命令进行适当的修改,此脚本也许可以完成您想要的操作:

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

稍后阅读转储文件:

tshark -r dump

您正在捕获端口8080,但在端口80上生成了流量;这不会完全满足您的预期。
James F

詹姆斯:我的代理服务器连接到8080,这就是我运行脚本的方式。就本帖子而言,我应该将其更改为80。
现在不是2009年

0

Dtrace应该允许这样做,尽管我不知道它是否已经在Linux中实现了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.