在Linux上嗅探TCP流量数据的最简单方法是什么?


79

我想要一种简单的方法来显示通过Linux机器上的任何接口传输的所有TCP数据(而不是TCP标头或其他信息)。

例如,我想要一个神奇的命令,如果我这样做:

magic_commmand_I_want port=1234

然后,如果有一台服务器在我的计算机上的端口1234上侦听,则有人执行了以下操作:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

然后,神奇的命令就会打印出来:

hello

我已经尝试过“ tcpdump”,“ ethereal”,“ tethereal”,“ tshark”和其他方法,但是如何使它们达到目标并不明显:

  • 不显示IP地址或其他元数据
  • 仅显示正在发送的“数据”,而不显示单个数据包及其标头
  • 按原样打印数据,而不是十六进制打印,也不能使用数据包偏移标记
  • 嗅探所有网络流量(是否在eth0eth1lo等上)

是的,您可能可以将一组通过管道传输的unix命令组合在一起以执行此操作,但是下次很难记住这一点:)

如果您有一个执行此操作的简单命令行示例,那就是我想要的。


2
tcpdump是您想要的魔术命令。Wireshark是tcpdump使用的库之上的一个很好的GUI
Vinko Vrsalovic

3
我知道这是一个古老的问题,但是我很好奇为什么不将nc用作“服务器端”呢?“ nc -l 1234”创建一个服务器,该服务器侦听端口1234并打印出发送给它的所有内容并关闭连接。如果要保持连接活动并且不断开连接,可以添加“ -k”选项。
StFS 2014年

2
@StFS,因为他想嗅探正在运行的端口,而nc会抱怨。
infoclogged

Answers:


106

更新:

正如Michal在评论中指出的那样:从tcpflow版本1.3开始,-e选项用于指定扫描程序名称。因此,打印错误“无效的扫描仪名称'8983'”。正确的命令是

sudo tcpflow -i any -C -J port 1234

(也-J已更改为-g最新版本)


感谢yves将我指向“ tcpflow ”。这是命令行:

tcpflow -i any -C -e port 1234  # as root, or with sudo

这可以做我想要的一切

  • 按字节顺序显示数据
  • 不显示任何其他元数据
  • 侦听所有接口(因此它捕获来自机器内部和外部的数据)

-C”告诉它转储到控制台而不是文件。“ -e”启用颜色,因此客户端->服务器和服务器->客户端在视觉上是不同的。

我通过简单地安装了tcpflow

sudo apt-get install tcpflow

2
哇。tcpflow很棒,谢谢!节省了我与Wireshk在一起的痛苦之音。Wireshark,tcpdump等拥有太多信息,实际上并未执行原始问题所要求的。tcpflow非常适合此功能。
罗斯

10
从tcpflow版本1.3开始,该-e选项用于指定扫描程序名称。因此,将打印错误“无效的扫描仪名称'8983'”。正确的命令是sudo tcpflow -i any -C -J port 1234
MichalKováč2014年

6
请注意,-J已将其更改为-g最新版本。
tvon

2
有人需要向该工具的作者解释“向后兼容性”一词的含义!
Sridhar Sarnobat

它为我打印了两次“物”。这是为什么 ?lpaste.net/3984129577801744384
user1198559 '18年

29

socat是您所需要的工具。它可以充当代理:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

那么您的应用程序必须连接端口4444,而不是直接连接到1234

-v选项用于socat打印出标准错误(stderr)时收到的所有内容。

更新:

如果您的计算机上没有socat,则仍可以使用netcat进行模拟:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

注意事项:此选项是单向的。第二个netcat实例将打印从服务器到标准输出的所有响应。您仍然可以这样做:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo

假设我对客户端和服务器没有控制权(或者我不想停止它),所以我无法更改所涉及的端口或拦截流量。那呢


13

tcpflow是您想要的。从手册页中摘录:

说明
tcpflow是一个程序,可捕获作为TCP连接(流)一部分传输的数据,并以便于协议分析或调试的方式存储数据。诸如tcpdump(4)之类的程序显示了网络上看到的数据包摘要,但通常不存储实际传输的数据。相反,tcpflow会重建实际的数据流,并将每个流存储在单独的文件中,以供以后分析。tcpflow知道TCP序列号,并且将正确地重建数据流,而不管重传或乱序传递。

tcpflow将所有捕获的数据存储在名称为以下格式的文件中

192.168.101.102.02345-010.011.012.013.45103

其中上述文件的内容是从主机192.168.101.102端口2345传输到主机10.11.12.13端口45103的数据。

建立从您的应用程序应用程序到服务器的连接。连接建立并运行后,tcpflow仍然可以捕获来自其中的数据。例如:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

每个数据将存储在名为127.000.000.001.48842-127.000.000.001.05555的文件中。

您仍然可以使用-Cs选项在标准输出上将其重定向。阅读手册页以使用表达式来调整您想要tcpflow捕获的拼音。


2

ngrep为此非常好。它需要一个BPF字符串和一个可选字符串在数据包中进行搜索,然后以非常有用的格式将数据包内容转储到屏幕上。也可以选择将其转储到pcap_dump文件,稍后您可以在Wireshark中对其进行更仔细的检查。


0

看一下Chaosreader。尽管它的功能超出了您的要求,并且稍有不同,但您可能可以修改其代码以执行您想要的操作。


-1

例如,也许您可​​以为tcpdump写一个包装器,该包装器将删除所有冗余信息

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.