使用 tcpdump 在 Linux 中分析以太网帧

CompTIABeginner
立即练习

介绍

在本实验中,你将学习使用强大的 tcpdump 命令行工具在 Linux 系统上进行网络流量分析的基础知识。主要目标是在数据链路层捕获和检查以太网帧,从而获得关于数据如何在本地网络上传输的结构化实践经验。你将掌握识别和解释低级网络通信的实用技能。

你将从准备环境开始,包括安装 tcpdump 和识别你的活动网络接口。接下来,你将启动实时数据包捕获,以实时监控网络活动。为了理解不同的通信模式,你将使用 ping 命令生成单播流量,并通过 ARP 生成广播流量。通过检查捕获的输出,你将学会分析以太网帧头,并区分单播和广播 MAC 地址。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 98%。获得了学习者 100% 的好评率。

安装 tcpdump 并识别您的网络接口

在此步骤中,你将准备网络分析环境。这包括两个关键操作:安装 tcpdump(一个强大的命令行数据包嗅探器)以及识别你的主网络接口的名称。数据包嗅探器允许你“看到”在网络上传输的数据,而 tcpdump 需要知道要监控哪个特定的网络连接。

首先,让我们确保 tcpdump 已安装。虽然它是一个标准工具,但确认其存在是一个良好的实践。我们将使用 apt 包管理器。命令 sudo apt update 会将你的包列表与软件仓库同步,而 sudo apt install tcpdump -y 会安装该工具,其中 -y 会自动确认安装。

在你的终端中执行以下命令:

sudo apt update
sudo apt install tcpdump -y

安装完成后,你可以通过检查 tcpdump 的版本来验证它。

tcpdump --version

你应该会看到类似以下的输出,确认该工具已准备就绪。版本号可能会有所不同。

tcpdump version 4.99.x
libpcap version 1.10.x
OpenSSL 3.0.x [Date]

接下来,你需要找到你要监控的网络接口的名称。一台计算机可以有多个接口(例如,用于有线以太网、Wi-Fi 或虚拟网络)。我们将使用 ip addr 命令来列出所有可用的网络接口及其配置。

运行此命令:

ip addr

输出将列出多个接口。你需要寻找你的主活动接口。它通常命名为 eth0enp0s3。查找一个具有 inet 地址(你的 IP 地址)并且状态为 UP 的条目。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:01:be:b3 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.8/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159786sec preferred_lft 1892159786sec
    inet6 fe80::216:3eff:fe01:beb3/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:8a:88:cd:da brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

从上面的示例输出中,接口名称是 eth0。记下你的特定接口名称,因为你将在下一步中使用它。

开始广泛捕获并观察流量

在此步骤中,你将开始捕获实时网络流量。数据链路层(第 2 层)的数据基本单位是 以太网帧。每个帧都像一个数字信封,不仅包含正在发送的数据,还包含关键的寻址信息,如源和目标 MAC 地址。我们将使用带 -e 选项的 tcpdump 来专门查看这些第 2 层详细信息。此初始捕获将不进行过滤,以便你了解网络上的所有活动。

现在,让我们开始捕获过程。你需要你在上一步中识别的接口名称(例如 eth0)。捕获网络数据包需要管理员权限,这就是我们使用 sudo 的原因。我们还将添加 -n 标志以防止 tcpdump 将 IP 地址解析为主机名,并添加 -q 以使输出更简洁。

在你的终端中,运行 tcpdump 命令。请记住将 eth0 替换为你实际的接口名称。

## 将 eth0 替换为你从步骤 1 中获得的实际接口名称
sudo tcpdump -i eth0 -e -n -q

让我们分解一下这个命令:

  • sudo: 以超级用户权限执行命令,这是以这种方式访问网络接口所必需的。
  • tcpdump: 数据包捕获工具本身。
  • -i eth0: -i 标志指定要监听的网络 interface(接口)。
  • -e: 此选项对我们的实验至关重要。它告诉 tcpdump 为每个数据包打印链路层(以太网)头部,其中包含源和目标 MAC 地址。
  • -n: 防止主机名解析,显示原始 IP 地址。
  • -q: “安静”模式,减少协议特定的输出量。

运行命令后,tcpdump 将开始监听。你将看到一条初始消息,然后你的终端将开始显示它捕获的任何数据包。根据你的网络情况,你可能会看到很多与我们想要做的无关的流量。这可能包括 ARP 请求、后台服务等。

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:24:00.123456 ARP, Request who-has 172.16.50.1 tell 172.16.50.254, length 28
10:24:01.567890 IP6 fe80::... > ff02::...: ICMP6, router advertisement, length 80

让它运行几秒钟以观察活动,然后按 Ctrl+C 停止捕获。这展示了在繁忙环境中查找特定信息的挑战。

使用 ICMP 过滤器优化捕获

正如你在上一步中看到的,未过滤的捕获可能会产生大量噪音。为了专注于我们想要分析的特定流量,我们可以使用 捕获过滤器。由于我们将使用 ping 命令,该命令使用 ICMP 协议,因此我们将指示 tcpdump 捕获 ICMP 数据包。我们还将添加 -n 标志以阻止 tcpdump 将 IP 地址解析为主机名,并添加 -q 以使输出更简洁。这将使输出更易于分析。

现在,再次启动 tcpdump,但这次添加 icmp 过滤器和新标志。

## 将 eth0 替换为你从步骤 1 中获得的实际接口名称
sudo tcpdump -i eth0 -e -n -q 'icmp'

命令中的 'icmp' 部分是过滤器。它指示 tcpdump 忽略除使用 ICMP 协议的数据包之外的所有数据包。

运行此命令后,tcpdump 将再次开始监听,但终端现在应该保持安静,因为它正在专门等待 ICMP 流量。

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

重要提示: 让此终端保持运行!tcpdump 需要保持活动状态才能捕获我们将在下一步中生成的流量。你需要打开一个 新的终端标签页或窗口 来执行后续命令。你可以通过点击终端面板中的 + 图标来完成此操作。

使用 'ping' 生成单播流量并分析帧头

在此步骤中,你将生成并观察 单播(unicast)流量。单播是一种一对一的通信方式,其中一个帧从单个源发送到网络上的单个目标。为此,你将使用常用的 ping 工具,该工具向目标主机发送 ICMP(Internet 控制消息协议)数据包以检查连接性。这些数据包在传输时会被封装在以太网帧中。

在第一个终端中仍然运行 tcpdump(带有 icmp 过滤器)的情况下,你需要生成一些网络活动。

通过点击终端面板中的 + 图标打开一个 新终端。在此新终端中,使用 ping 命令向 google.com 发送几个数据包。我们将使用 -c 4 选项自动发送四个数据包然后停止。

ping -c 4 google.com

你将在第二个终端中看到类似以下的输出,显示来自 Google 服务器的回复:

PING google.com (142.250.191.174) 56(84) bytes of data.
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=1 ttl=115 time=1.58 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=2 ttl=115 time=1.55 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=3 ttl=115 time=1.62 ms
64 bytes from fra16s51-in-f14.1e100.net (142.250.191.174): icmp_seq=4 ttl=115 time=1.51 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.510/1.565/1.621/0.040 ms

现在,切换回运行 tcpdump第一个终端。你将看到几行新的输出,这些输出是在你进行 ping 操作时捕获的。

让我们分析一个传出的“echo request”(回显请求)数据包。它看起来会像这样(MAC 和 IP 地址在你的系统上会有所不同):

10:25:01.123456 00:16:3e:01:be:b3 > de:ad:be:ef:00:01, ethertype IPv4 (0x0800), length 98: 172.16.50.8 > 142.250.191.174: ICMP echo request, id 123, seq 1, length 64

这一行的含义如下:

  • 10:25:01.123456: 帧被捕获的时间戳。
  • 00:16:3e:01:be:b3: 源 MAC 地址(你的 VM 的 MAC)。
  • >: 一个分隔符,表示流量方向(从源到目标)。
  • de:ad:be:ef:00:01: 目标 MAC 地址。请注意,这很可能是你的本地网络的网关(路由器),而不是 Google 的服务器。你的 VM 将帧发送到网关,然后网关将其转发到互联网。
  • ethertype IPv4: 此字段表示以太网帧的数据负载是一个 IPv4 数据包。
  • 172.16.50.8 > 142.250.191.174: 这是第 3 层(IP)信息,显示源和目标 IP 地址。
  • ICMP echo request: 这将数据包标识为 ping 请求的一部分。

你还将看到相应的“echo reply”(回显回复)帧返回。请注意源和目标 MAC 地址是如何互换的。

最后,返回 tcpdump 终端并按 Ctrl+C 停止捕获。

通过 ARP 生成广播流量并识别广播 MAC 地址

在此步骤中,你将对比单播流量和 广播 流量。单播是一对一的消息,而广播是一对所有消息,发送到本地网络段上的每个设备。一个主要的例子是 地址解析协议 (ARP),它用于发现与特定 IP 地址关联的 MAC 地址。为此,设备会发送一个广播帧,询问:“谁拥有这个 IP 地址?”

首先,让我们启动一个新的 tcpdump 捕获。这次,我们将添加一个过滤器,只显示 ARP 数据包。我们还将使用 -n 标志来阻止 tcpdump 将 IP 地址解析为主机名,并使用 -q 使输出更简洁。

在终端中,运行以下命令,记住将 eth0 替换为你从步骤 1 中获得的接口名称。

## 替换 eth0 为你实际的接口名称
sudo tcpdump -i eth0 -e -n -q 'arp'

tcpdump 正在监听,但仅限于 ARP 流量。

接下来,我们需要触发一个 ARP 请求。一个可靠的方法是清除系统的 ARP 缓存,然后尝试连接到本地网络上的另一个设备,例如你的网关路由器。清除缓存会强制你的系统使用 ARP 重新发现网关的 MAC 地址。

打开一个 新终端。首先,使用 ip route 命令查找你的网关 IP 地址。

ip route | grep default

输出将显示你的默认路由,其中“via”后面的 IP 地址就是你的网关。

default via 172.16.50.1 dev eth0

注意: 你的网关 IP 地址很可能不同。在以下步骤中使用 命令提供的 IP 地址至关重要。一个常见的错误是使用不同的 IP,例如 172.17.0.1,这通常是本地 Docker 网络的网关,并且不会为本次实验产生正确的结果。

在此示例中,网关是 172.16.50.1。现在,使用 ip neigh flush 命令清除你的 ARP 缓存。这将删除已知的 MAC 地址映射,迫使你的系统再次使用 ARP 来查找它们。

sudo ip -s -s neigh flush dev eth0

你可能会看到确认条目已被删除的输出。最后,将网关 ping 一次以触发 ARP 查询。

## 将 172.16.50.1 替换为你实际的网关 IP
ping -c 1 172.16.50.1

现在,切换回运行 tcpdump第一个终端。你将看到生成的 ARP 流量。查找“Request”(请求)行:

10:30:01.123456 00:16:3e:01:be:b3 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: ARP, Request who-has 172.16.50.1 tell 172.16.50.8, length 28

让我们分析这个广播帧:

  • 00:16:3e:01:be:b3: 源 MAC 地址(你的 VM)。
  • ff:ff:ff:ff:ff:ff: 这是特殊的 广播 MAC 地址。当交换机看到一个带有此目标地址的帧时,它会将其转发到 所有 端口,发送给每个连接的设备。
  • ethertype ARP: 这表示帧的负载是 ARP 数据包。
  • ARP, Request who-has 172.16.50.1 tell 172.16.50.8: 这是 ARP 消息本身,一个广播到整个网络的查询,询问 172.16.50.1 的 MAC 地址。

你还将看到“Reply”(回复)数据包,这是一个单播帧,直接从网关发送回你的 VM 的 MAC 地址。

现在,你可以通过在其终端中按 Ctrl+C 来停止 tcpdump 捕获。

总结

在此实验中,你学习了在 Linux 环境中使用 tcpdump 分析以太网帧的基本过程。你首先准备了你的系统,包括使用 apt 包管理器安装 tcpdump 工具,并使用 ip addr 命令识别你的主要网络接口。然后,你学会了如何启动数据包捕获,首先通过运行一个无过滤器的捕获来观察所有网络流量,并体会到过滤的必要性。在停止初始捕获后,你学会了使用 sudo tcpdump -i eth0 -e -n -q 'icmp' 应用 icmp 过滤器,以专门关注你想要分析的流量。

该实验随后引导你生成和分析了两种主要的网络流量类型。你使用 ping 命令创建了单播流量,并检查了过滤后的 tcpdump 输出,以识别以太网帧头中的特定源和目标 MAC 地址。之后,你通过启动一个单独的、经过 arp 过滤的捕获来生成广播流量,并学会了识别独特的广播 MAC 地址 ff:ff:ff:ff:ff:ff,该地址表示一个旨在发送给本地网络段上所有设备的帧。