如何在 Linux 上使用 arping 命令
已发表: 2022-07-28 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)在这一层运行。
- 第三层是网络层。 这是路由和数据包转发发生的地方。 它是 Internet 协议(TCP/IP 中的 IP)运行的层。
- 第 2 层是数据链路层。 它用于在可直接寻址的设备之间发送数据包,使用广播到每个设备或单播到特定 MAC 地址。
- 第 1 层是物理层。 这与物理基础设施有关,包括电缆、路由器和网络交换机。 Wi-Fi 中使用的无线电波也属于这一类。
当路由器收到一个不在其表中的 IP 地址的数据包时,它会向整个网络发送一个广播数据包。 它有效地询问“谁有这个 IP 地址?” 这是第二层消息,因此它不依赖于 IP 路由。
具有匹配地址的设备通过发回其 MAC 地址进行响应。 该设备的 IP 地址和 MAC 地址可以添加到映射表中。 现在可以将常规 IP 流量路由到设备,因为其 IP 地址和 MAC 地址之间的关系已建立并记录。
相关:互联网的基础:TCP/IP 年满 40 岁
arping 命令
所有聪明的 ARP 东西都会在后台自动运行,构建和维护 ARP 表。 arping
命令将 ARP 查询的一些功能带到终端窗口。 它在 OSI 第 2 层运行,当ping
不通时,它可以请求设备的响应。
在 Fedora 36 上,已经安装了arping
,但我们需要在 Manjaro 21 和 Ubuntu 22.04 上安装它。
在 Ubuntu 上,命令是:
sudo apt install arping
在 Manjaro 上,您需要输入:
sudo pacman -Sy arping
使用arping
的最简单方法是使用 IP 地址。 这必须是连接到本地网络的可直接寻址设备的地址。 因为arping
在第 2 层运行,所以不可能进行路由。 您需要将sudo
与arping
一起使用。
须藤arping 192.168.1.17
按 Ctrl+C 停止。 返回的信息是响应设备的MAC地址、 arping
请求的索引号以及arping
请求完成的往返时间。
将输出与下面ping
命令的输出进行比较。 ping
命令返回有关网络数据包往返时间的更多信息。 arping
命令为您提供较少的计时统计信息,但它确实包含设备的 MAC 地址。
平 192.168.1.17
您还可以将设备的网络名称与arping
一起使用。
sudo arping fedora-36.local
您可以使用-c
(count) 选项来告诉arping
在设定数量的请求后停止。 该命令告诉arping
尝试两次然后停止。
须藤arping -c 2 192.168.1.18
如果您的计算机中有多个网络接口,您可以使用-I
(接口)选项来告诉arping
使用哪个接口。
您可以使用ip link
命令列出您的网络接口。
ip链接
这台电脑有三个接口。 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 个响应”或“1 个收到的数据包”。 这是因为测试计算机上有不同版本的arping
,它们使用不同的术语。 如果grep
找到这些短语中的任何一个,它的退出值将为零。
当您知道您的arping
版本使用了哪些短语时,您可以通过删除其他短语来简化grep
语法。
if
语句测试$?
- 一个保存最后一个进程的退出代码的变量 - 查看它是否为零。 如果是,它使用echo
将成功消息打印到终端窗口。 如果测试失败,则grep
没有找到任何一个字符串,这意味着 ARP 请求失败。
使用chmod
命令和+x
选项使您的脚本可执行。
chmod +x 扫描范围.sh
我们将运行它并扫描从 15 到 20 的 IP 范围。其中一些地址没有连接设备,因此我们应该会看到一些故障。 记得使用sudo
。 我们还将尝试在 192.168.1.15 上ping
设备。
须藤 ./scan-range.sh 15 20
平 192.168.1.15
就像您在任何网络上一样,我们得到了成功和失败的混合。 但请注意,虽然 192.168.1.15 的设备响应了二层 ARP 请求,但它并没有响应三层ping
请求。
如果您 ping 过设备并注意到故障,您可能倾向于检查它是否已插入、在线以及是否可以ping
出设备 192.168.1.15。
但是通过arping
,您可以验证它是否已连接、在线和网络可访问。 这将指导您进行故障排除以开始调查路由和 ARP 表问题。
更深入的洞察
网络洋葱有很多层。 如果ping
无法让您到达任何地方,请下拉一层,看看arping
能告诉您什么。
相关:如何使用 Nmtui 管理 Linux Wi-Fi 网络