Linux arping命令类似于ping,但仅适用于本地网络。它的优势在于它在较低的网络级别上运行,有时当ping无法响应时,它会得到响应。下面是如何使用它。
arp协议
IP地址是网络设备的数字标签。它被用作地址,以便适当的网络流量到达正确的设备。但局域网上的大多数设备都有动态IP地址。也就是说,他们的IP地址很可能在下次启动时更改。
为了能够正确地将网络流量路由到适当的设备,必须采用将IP地址映射到媒体访问控制(MAC)地址的方案。MAC地址是在设备制造时建立的唯一标识。IP地址是一个逻辑地址。MAC地址是一个物理地址。
地址解析协议是将IP地址映射到MAC地址的中间人。路由器通常是负责在网络中封送和定向网络数据包的设备,它建立并维护一个ARP表,将IP地址与MAC地址联系起来。
如果路由器需要将数据路由到它不知道的设备,它会发出ARP请求以获取新设备的MAC地址。
当一个新设备连接到您的网络时,它会被分配一个IP地址,但这不足以实际将流量路由到它。路由器需要获得MAC地址,这是拼图中缺失的部分。但是,由于IP地址本身没有足够的信息来将数据包路由到设备,所以第22个问题是它不能使用IP地址来查询硬件以获得MAC地址。
开放系统互连模型将组成工作网络的技术分组为一系列层。没有下层,高层无法运行。OSI模型有七层。
- 第7层是最顶层,即应用层。它向计算机用户提供信息并从他们那里接收信息。
- 第6层是表示层。这样可以确保数据在网络格式中来回移动时的格式或状态正确。加密和解密在这一层进行。
- 第5层是会话层。会话是两个或多个设备之间的网络连接。这一层涉及诸如启动连接、握手、超时和断开不再需要的连接等事项。
- 第4层是传输层。这是以协调方式在网络中移动数据的层。这一层涉及传输速率和数据量等内容。TCP/IP中的TCP在这一层运行的传输控制协议。
- 第三层是网络层。这是路由和数据包转发发生的地方。它是TCP/IP中的IP在其上运行的Internet协议层。
- 第二层是数据链路层。它用于在可直接寻址的设备之间发送数据包,使用对每个设备的广播或对特定MAC地址的单播。
- 第1层是物理层。这与物理基础设施有关,包括布线、路由器和网络交换机。Wi-Fi中使用的无线电波也属于这一类。
当路由器接收到一个不在其表中的IP地址的数据包时,它会向整个网络发送一个广播数据包。它有效地询问“谁拥有此IP地址?”这是第二层消息,因此它不依赖IP路由。
具有匹配地址的设备通过发送回其MAC地址进行响应。该设备的IP地址和MAC地址可以添加到映射表中。常规IP流量现在可以路由到设备,因为其IP地址和MAC地址之间的关系已经建立并记录。
相关:互联网的基础:TCP/IP步入40
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在第二层运行,所以不可能进行路由。你需要在arping中使用sudo。
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(count)选项告诉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”的文件中
您需要编辑脚本并用网络的IP地址替换所有出现的192.168.1。
#!/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.130后终止。
这些参数在脚本中以$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 scan-range.sh
我们将运行它并扫描IP范围从15到20。其中一些地址没有连接设备,因此我们应该会看到一些故障。请记住使用sudo。我们还将尝试在192.168.1.15上ping设备。
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能告诉你什么。
相关:如何使用Nmtui管理Linux Wi-Fi网络