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

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

我想要一种简单的方法来显示通过我的 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 地址或其他元数据
  • 仅显示正在发送的“数据”,而不是单个数据包及其报头
  • 按原样打印数据,而不是以十六进制形式,也不使用数据包偏移标记
  • 全部网络流量(无论是eth0或者eth1或者, ETC...)

是的,你可能需要将一组管道 unix 命令串在一起来执行此操作,但下次不太容易记住:)

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

答案1

更新:

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

sudo tcpflow -i any -C -J port 1234

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


感谢 yves 向我指出“tcp流“。这是命令行:

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

这满足了我的一切要求

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

-C” 指示它转储到控制台而不是文件。“ -e” 启用颜色,以便客户端->服务器和服务器->客户端在视觉上有所不同。

我通过以下方式安装了 tcpflow

sudo apt-get install tcpflow

答案2

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

答案3

尝试Wireshark. 它是一款针对 Linux 和 Windows 的优秀协议分析器。

答案4

ngrep非常适合此用途。它采用 BPF 字符串和可选字符串在数据包内进行搜索,然后以非常有用的格式将数据包内容转储到屏幕上。它还可以选择转储到 pcap_dump 文件中,以便您稍后在 Wireshark 中更仔细地检查该文件。

相关内容