如何在 Linux 上使用 arping 命令

Linux arping
命令类似于 ping
,但仅适用于本地网络。它的优点是它在较低的网络级别运行,有时在 ping
无法响应时得到响应。下面是如何使用它。
ARP协议
IP 地址是联网设备的数字标签。它用作地址,以便适当的网络流量到达正确的设备。但是局域网上的大多数设备都有动态 IP 地址。也就是说,它们的 IP 地址很可能会在下次启动时发生变化。
为了能够将网络流量正确地路由到适当的设备,必须采用一种将 IP 地址映射到媒体访问控制 (MAC) 地址的方案。 MAC 地址是在设备制造时建立的唯一标识。 IP 地址是一个逻辑地址。 MAC 地址是一个物理地址。
地址解析协议是将 IP 地址映射到 MAC 地址的中间人。负责在网络中编组和引导网络数据包的设备(通常是路由器)构建并维护一个将 IP 地址与 MAC 地址联系起来的 ARP 表。
如果路由器需要将数据路由到它不知道的设备,它会发出 ARP 请求以获取新设备的 MAC 地址。
当一台新设备连接到您的网络时,它会被分配一个 IP 地址,但这不足以实际将流量路由到它。路由器需要获取 MAC 地址,这是拼图中缺失的一块。但是因为 IP 地址本身不足以将数据包路由到设备,Catch-22 不能使用 IP 地址查询硬件来获取 MAC 地址。
开放系统互连模型将构成工作网络的技术分组为一系列层。没有较低层,较高层就无法运行。 OSI 模型有七层。
- 第 7 层是最顶层,即应用层。它向计算机用户提供信息并接收他们返回的信息。
- 第 6 层是表示层。这可确保数据在进出网络格式时处于正确的格式或状态。加密和解密发生在这一层。
- 第 5 层是会话层。会话是两个或多个设备之间的网络连接。该层涉及诸如连接的启动、握手、超时和不再需要的连接中断等问题。
- 第 4 层是传输层。这是以协调方式在网络中移动数据的层。该层关注诸如传输速率和数据量之类的事情。传输控制协议——TCP/IP 中的 TCP——在这一层运行。
- 第 3 层是网络层。这是路由和数据包转发发生的地方。这是互联网协议(TCP/IP 中的 IP)运行的层。
- 第 2 层是数据链路层。它用于在可直接寻址的设备之间发送数据包,使用广播到每个设备或单播到特定的 MAC 地址。
- 第 1 层是物理层。这与物理基础设施有关,包括布线、路由器和网络交换机。 Wi-Fi 中使用的无线电波也属于此类。
当路由器收到一个不在其表中的 IP 地址的数据包时,它会向整个网络发送一个广播数据包。它有效地询问“谁拥有这个 IP 地址?”这是第二层消息,因此它不依赖 IP 路由。
具有匹配地址的设备通过发回其 MAC 地址进行响应。该设备的 IP 地址和 MAC 地址可以添加到映射表中。现在可以将常规 IP 流量路由到设备,因为它的 IP 地址和 MAC 地址之间的关系已经建立并记录下来。
arping 命令
所有聪明的 ARP 东西都在后台自动运行,构建和维护 ARP 表。 arping
命令将 ARP 查询的一些功能带到终端窗口。它在 OSI 第二层运行,当 ping
不响应时,它可以请求设备的响应。
在 Fedora 36 上,arping
已经安装,但我们需要在 Manjaro 21 和 Ubuntu 22.04 上安装它。
在 Ubuntu 上,命令是:
sudo apt install arping

在 Manjaro 上你需要输入:
sudo pacman -Sy arping

使用 arping
的最简单方法是使用 IP 地址。这必须是连接到本地网络的可直接寻址设备的地址。因为 arping
在第二层运行,所以不可能进行路由。您需要将 sudo
与 arping
一起使用。
sudo arping 192.168.1.17

按 Ctrl+C 停止。返回的信息是响应设备的MAC地址、arping
请求的索引号、arping
请求完成的往返时间。
将输出与下面的 ping
命令的输出进行比较。 ping
命令返回有关网络数据包往返时间的更多信息。 arping
命令提供的计时统计信息较少,但它确实包含设备的 MAC 地址。
ping 192.168.1.17

您还可以将设备的网络名称与 arping
一起使用。
sudo arping fedora-36.local

您可以使用 -c
(计数)选项告诉 arping
在一定数量的请求后停止。此命令告诉 arping
尝试两次然后停止。
sudo arping -c 2 192.168.1.18

如果您的计算机中有多个网络接口,您可以使用 -I
(接口)选项来告诉 arping
使用哪个接口。
您可以使用 ip link
命令列出您的网络接口。
ip link

这台电脑有三个接口。 lo
虚拟接口用作同一台计算机上软件之间内部连接的环回。它在这里对我们没有用。我们可以使用以太网连接 enp3s0
或无线接口 wlan0
。
此命令告诉 arping
使用我们选择的接口,而不是自行选择。
sudo arping -c 2 -I enp3s0 manjaro-21.local

在脚本中使用 arping
通过将 arping
包装在脚本的循环中,我们可以让它在一定范围的 IP 地址上工作。复制此脚本中的文本并将其保存到名为“scan-range.sh”的文件中。
您需要编辑脚本并将所有出现的 192.168.1 替换为您网络的 IP 地址。
#!/bin/bash
for ((device=$1; device<=$2; device++))
do
arping -c 1 192.168.1.$device | grep -E "1 response|1 packets received" > /dev/null
if [ $? == 0 ]; then
echo "192.168.1.$device responded."
else
echo "192.168.1.$device didn't respond."
fi
done
该脚本接受两个命令行参数。这些用作您要在其上使用 arping
的 IP 地址范围的最后八位字节。因此,如果您将 20 和 30 传递给脚本,循环将从 192.168.1.20 开始,并在使用 IP 地址 192.168.1.30 后终止。
参数在脚本中作为 $1
和 $2
访问。它们用在 C 风格的 for
循环中。在 for
循环的每次旋转中,$device
都被设置为该范围内的下一个 IP 地址。
该脚本使用我们已经看到的相同 arping -c
格式,但这次我们只要求将单个 ARP 请求发送到范围内的每个设备。
arping
命令的输出通过 grep
进行管道传输。
grep
语法可以在您的脚本中得到简化。 grep
正在寻找两个字符串之一,“1 response”或“1 packets received”。这是因为测试计算机上有不同版本的 arping
并且它们使用不同的术语。如果 grep
找到这些短语中的任何一个,它的退出值将为零。
当您知道您的 arping
版本使用了哪些短语时,您可以通过删除另一个短语来简化 grep
语法。
if
语句测试 $?
——一个保存最后一个结束进程的退出代码的变量——看它是否为零。如果是,它会使用 echo
将成功消息打印到终端窗口。如果测试失败,则 grep
没有找到任何一个字符串,这意味着 ARP 请求失败。
使用 chmod
命令和 +x
选项使您的脚本可执行。
chmod +x scan-range.sh

我们将运行它并扫描从 15 到 20 的 IP 范围。其中一些地址没有连接设备,因此我们应该看到一些失败。请记住使用 sudo
。我们还将尝试 ping
位于 192.168.1.15 的设备。
sudo ./scan-range.sh 15 20
ping 192.168.1.15

就像在任何网络上一样,我们会得到成功和失败的混合体。但请注意,虽然 192.168.1.15 的设备响应了第二层 ARP 请求,但它没有响应第三层 ping
请求。
如果您已对设备执行 ping 操作并注意到故障,您可能倾向于检查它是否已在线插入,以及是否可以 ping
设备 192.168。 1.15.
但是使用 arping
,您可以验证它是否已连接、在线且可通过网络访问。这将指导您的故障排除以开始研究路由和 ARP 表问题。
更深入的洞察力
网络洋葱有很多层。如果 ping
不能让您到达任何地方,请下拉一层,看看 arping
可以告诉您什么。