![在 Linux 上嗅探 TCP 流量数据的最简单方法是什么?](https://linux22.com/image/1212224/%E5%9C%A8%20Linux%20%E4%B8%8A%E5%97%85%E6%8E%A2%20TCP%20%E6%B5%81%E9%87%8F%E6%95%B0%E6%8D%AE%E7%9A%84%E6%9C%80%E7%AE%80%E5%8D%95%E6%96%B9%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我想要一种简单的方法来显示通过我的 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 中更仔细地检查该文件。