通过 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 捕获。