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

Dus*_*ell 87 networking linux

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

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

magic_commmand_I_want port=1234
Run Code Online (Sandbox Code Playgroud)

那么如果有一台服务器在我的机器上侦听端口 1234,并且有人这样做了:

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

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

hello
Run Code Online (Sandbox Code Playgroud)

我已经尝试过“tcpdump”、“ethereal”、“tethereal”、“tshark”等,但是如何让它们做到这一点并不明显:

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

是的,您可能可以将一组管道式 unix 命令串在一起来执行此操作,但是下次记住这一点并不容易:)

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

Dus*_*ell 119

更新:

正如 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
Run Code Online (Sandbox Code Playgroud)

这做我想要的一切

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

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

我通过简单的方式安装了 tcpflow

sudo apt-get install tcpflow
Run Code Online (Sandbox Code Playgroud)

  • 从 tcpflow 1.3 版开始,`-e` 选项用于指定扫描仪名称。因此会打印错误“无效的扫描仪名称‘8983’”。正确的命令是`sudo tcpflow -i any -C -J port 1234` (11认同)
  • 请注意,在最新版本中`-J` 已更改为`-g`。 (6认同)
  • 哇。tcpflow 很棒,谢谢!使用wireshark为我节省了大量的痛苦。Wireshark、tcpdump 等信息太多,实际上并没有按照原始问题的要求进行操作。tcpflow 是完美的。 (4认同)
  • 有人需要向该工具的作者解释“向后兼容性”一词的含义! (3认同)

yve*_*mes 30

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

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

如果您的机器上没有 socat,您仍然可以使用 netcat 以这种方式模拟它:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234
Run Code Online (Sandbox Code Playgroud)

警告:此选项是单向的。第二个 netcat 实例会将来自您的服务器的任何响应打印到标准输出。你仍然可以这样做:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
Run Code Online (Sandbox Code Playgroud)


Kev*_*oyd 19

试试Wireshark。它是一款出色的协议分析器,适用于 Linux 和 Windows。

  • 我的经验是界面在 linux 上真的很糟糕。 (4认同)

yve*_*mes 14

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
Run Code Online (Sandbox Code Playgroud)

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

您仍然可以使用选项 -Cs 在标准输出上重定向它。阅读手册页以使用表达式来调整您希望 tcpflow 捕获的 paquet。