在 Ubuntu 上使用 Tcpdump 捕获数据包并使用 Wireshark 分析它们
在本指南中,我将向您展示如何在 Linux 上分析网络数据包。我将使用工具 Tcpdump 和 Wireshark。本教程使用 Ubuntu 作为操作系统,但它也适用于其他 Linux 发行版。
为什么需要 Tcpdump?
一个明显的问题可能会浮现在脑海中,当您几乎可以使用 Wireshark 完成所有事情时,为什么还要关心 Tcpdump。那么这里就是这个问题的答案:与 Wireshark 相比,有时使用 Tcpdump 进行数据包捕获更方便。例如,如果您捕获数据包的目标机器是一台没有安装 Wireshark 的远程机器,或者它只是一台远程无头机器,在这两种情况下,Tcpdump 都非常方便。要查看可与 Tcpdump 一起使用的各种选项,请搜索手册页。
什么是 Tcpdump?
Tcpdump 是 Wireshark 的命令行替代品。它与 Wireshark 的用途相同,即捕获和分析流量。 Tcpdump 是一个单独的应用程序,不应被视为 Wireshark 命令行界面。由于它是基于命令行界面的,所以处理起来不像Wireshark那么简单。新用户在开始使用它时可能会发现它令人望而生畏,并且会发现许多难以记住的命令和语法。
本教程大纲
现在让我们谈谈本指南的主要目的。在本指南中,我们将了解如何将 Tcpdump 与 Wireshark 进行交互。在这里,我们指出我们将在本指南中做的工作:
- 使用 SSH 连接远程机器(主机 2)。
- 使用 Tcpdump 捕获流量并保存捕获。
- 将捕获文件发送到安装了 Wireshark 的现场机器(主机 1)。
- 使用 Wireshark 分析捕获的 Tcpdump 会话。
飞行前检查
对于本教程,我们使用两台 Ubuntu 20.04 机器。您需要自行配置它们。我们的IP配置如下:
主机1(现场机):192.168.186.150
主机 2(远程机器):192.168.186.201
本指南中提到的步骤应该适用于满足以下要求的任何 Linux 系统:
- 安装了 Wireshark 并配置了 SSH 的现场主机(主机 1)。
- 从现场主机(主机 1)到远程主机(主机 2)的 SSH 访问。
- 在远程主机(主机 2)上配置了 Tcpdump 和 SSH。
- 主机 2 上用于运行 Tcpdump 的“sudo”用户帐户以及主机 1 上的用户帐户(取决于 Wireshark 的配置方式)。
让我们开始…
为了进一步进行,使用 SSH 访问协议从现场机器(主机 1)连接到远程机器(主机 2)。我们已经在两台机器之间建立了 SSH 连接。因此,我们将从主机 1 终端使用以下命令连接到主机 2:
$ ssh ‘user_name’@’IP_of_Host2’
这里将'user_name'替换为我们要连接的主机2的用户名,'IP_of_Host2'是主机2的IP地址。参考下图:

$ tcpdump --list-interfaces
示例输出:
1.enp0s3 [Up, Running]
2.lo [Up, Running, Loopback]
3.any(在所有接口上捕获的伪设备)[Up, Running]
4.eno1 [Up ]
5.bluetooth-monitor(蓝牙Linux监视器)[none]
6.nflog(Linux netfilter日志(NFLOG)接口)[none]
7.nfqueue(Linux netfilter队列(NFQUEUE)接口) [无]
8.bluetooth0(蓝牙适配器编号 0)[无]

$ sudo tcpdump -s 65535 -i enp0s3 -w my_remote_capture.pcap

- -s:旧版本的 Tcpdump 将数据包截断为 68 或 96 字节。 “-s”选项用于捕获全长数据包。
- -i:选择要监听的接口。
- -w:将捕获的原始数据包保存到文件中,而不是在终端上显示它们。
捕获的流量存储在名为 my_remote_capture.pcap 的文件中。我们现在将此文件传输到主机 1 以使用 Wireshark 进行分析。为了传输文件,我们使用 scp 命令。同样,我们已经将 scp 配置为在两台机器之间工作。命令语法如下所示:
$ scp my_remote_capture.pcap 'username'@'IP_of_remote_machine':
这里的username是Host 1上的用户名,IP_of_remote_machine也是Host 1的IP。



分析捕获文件
让我们对上述文件应用显示过滤器。由于我们使用 SSH 连接到主机 2,因此应该有一些 SSH 协议的痕迹。在与显示过滤器对应的文本字段中输入“ssh”:

包起来…
恭喜,我们终于演示了如何在机器上进行远程捕获。我们已经看到了如何将 Tcpdump 与 Wireshark 结合起来。