Arping 命令
1. 概述
arping 是一种用于探测网络中主机的工具。与在网络层运行的*ping *命令不同, arping在数据链路层运行并使用地址解析协议 ( ARP )。使用它涉及向目标主机发送 ARP 请求并等待 ARP 回复。
在本教程中,我们将研究如何使用arping。虽然在不同的 Linux 发行版中有不同的实现,但我们将研究的一个来自iputils包。
2. 示例设置
我们将使用两个主机来检查arping - 本地主机和目标主机。本地主机的 IP 地址是192.39.59.16 ,目的主机的 IP 地址是192.39.59.17。本地主机只有一个网络接口eth0。
我们必须是 root 用户才能使用arping。
3. arping的基本用法
让我们首先使用不带任何选项的arping探测目标主机:
$ arping 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.754ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.668ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.676ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.672ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.663ms
^CSent 5 probes (1 broadcast(s))
Received 5 response(s)
ping 目标主机的结果似乎是成功的。输出的第一行显示我们将使用源 IP 地址192.39.59.16向目标 IP 地址192.39.59.17发送 ARP 请求。eth0是网络接口的名称。arping将使用此网络设备发送 ARP 请求。
我们让arping发送五个 ARP 请求,然后用Control+C取消它。如果我们不指定任何选项,arping将永远发送 ARP 请求。
正如我们从输出中看到的,我们收到了对所有 ARP 请求的 ARP 回复。[00:50:56:B2:AB:CD]是目标主机的 MAC 地址。每行末尾的持续时间(以毫秒为单位)是每个 ARP 请求和回复之间经过的时间。
**通常,arping 会先发送一个广播消息。如果收到 ARP 回复,则切换到单播。**我们在Sent 5 probes (1 broadcast(s))行中观察到了这种行为。但是,来自目标主机的所有 ARP 回复都是单播的,如包含来自语句的单播回复的输出行所示。
或者,我们可以传递目标主机名而不是目标 IP 地址。
4. 发送特定数量的 ARP 请求
正如我们已经看到的,如果我们只向arping提供目的地,它将永远向目的地发送 ARP 请求。但是,我们可以使用-c*选项传递所需数量的 ARP 请求:*
$ arping –c 2 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.765ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.676ms
Sent 2 probes (1 broadcast(s))
Received 2 response(s)
在这里,在第二个请求之后,arping自动终止。所以我们不必使用Control+C来终止它。
5. 第一次回复后停止 ARP 请求
使用-f选项,我们可以告诉arping*在收到来自目标的第一个回复后立即停止发送 ARP 请求:*
$ arping –f 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.663ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
6. 一段时间后停止 ARP 请求
通过使用–w*选项, arping也可以在特定时间段后停止发送 ARP 请求:*
$ date; arping –w 5 192.39.59.17; date
Tue May 24 16:44:17 +03 2022
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.674ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.682ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.653ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.661ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.652ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.657ms
Sent 6 probes (1 broadcast(s))
Received 6 response(s)
Tue May 24 16:44:23 +03 2022
在这里,我们将*-w 5传递给arping*。这告诉arping发送 ARP 请求 5 秒。
我们在arping之前和之后运行了两个date 命令来测量 arping 的执行时间。正如我们从输出中看到的,arping在大约 5 秒的时间内发送了 6 个 ARP 请求。
如果我们同时使用–c和–w选项会怎样?在这种情况下,arping 会继续 ping,直到-w选项指定的持续时间到期或发送-c*选项*指定的请求数:
$ date; arping –w 5 –c 15 192.39.59.17; date
Tue May 24 17:26:55 +03 2022
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.660ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.616ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.616ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.636ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.638ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.632ms
Sent 6 probes (1 broadcast(s))
Received 6 response(s)
Tue May 24 17:27:01 +03 2022
在这里,我们将*–w 5 –c 15选项传递给arping*。arping大约 5 秒后停止 ping,因为 5 秒的持续时间比发送 15 个 ARP 请求的持续时间短。 现在,让我们使用更长的持续时间运行arping :
$ date; arping –w 15 –c 5 192.39.59.17; date
Tue May 24 17:27:30 +03 2022
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.719ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.625ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.665ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.656ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.626ms
Sent 5 probes (1 broadcast(s))
Received 5 response(s)
Tue May 24 17:27:35 +03 2022
15秒的时间比发送5个ARP请求的时间长。所以arping在发送了 5 个 ARP 请求后就停止了 ping。
7. 指定网络接口
*如果本地主机有多个网络接口,我们必须使用–I*选项显式指定接口。**否则,arping会报错:
$ arping –f 192.39.59.17
arping: Suitable device could not be determined. Please, use option –I.
在这里,我们在具有多个网络接口的主机上运行*arping 。*因此,我们必须明确指定要用于 ARP 请求的接口:
$ arping –f –I ens192 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.18 ens192
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.626ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
我们使用*–I ens192*选项指定了接口。这一次,我们成功发送了 ARP 请求。
8. 只发送 MAC 级广播
通常,arping首先将 ARP 请求作为 MAC 广播发送。但是,当它收到对广播 ARP 请求的回复时,它会切换到单播。它开始仅向目标主机发送以下 ARP 请求。
使用-b*选项,可以更改此行为并仅发送广播:*
$ arping -b –c 2 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.773ms
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.825ms
Sent 2 probes (2 broadcast(s))
Received 2 response(s)
从输出行可以看出,Sent 2 probes (2 broadcast(s)),arping广播了两个 ARP 请求。
9. 在主动 ARP 模式下运行
我们可以使用-U选项在未经请求的 ARP 模式下运行arping 。**
主动提供的 ARP 也称为无偿 ARP。未经请求的 ARP 在相邻主机请求之前更新相邻主机的 ARP 表。
这可能很有用,例如,当本地主机的 MAC 或 IP 地址因故障转移而发生更新时。未经请求的 ARP 将此更改传播到其他主机。在这种情况下,不需要 ARP 回复。
让我们使用带有*-U选项的arping*来更新目标主机的 ARP 表:
$ arping –U -c 1 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.17 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)
作为上述命令执行的结果,如果目标主机的 ARP 表中没有本地主机的条目,则添加该条目。如果 ARP 表中已经有一个条目,它会被更新。
输出的最后一行Received 0 response(s)表明我们没有得到预期的 ARP 回复。除此之外,arping将源 IP 地址设置为目标 IP 地址,正如我们在输出的第一行中看到的,ARPING 192.39.59.17 from 192.39.59.17 eth0。 **默认情况下,不允许使用未经请求的 ARP 更新在 ARP 表中创建新条目。因此,我们必须使用sysctl 命令将目标主机中的arp_accept内核参数设置为1。默认情况下它等于0:**
$ sysctl net.ipv4.conf.all.arp_accept # Unsolicited ARP isn’t allowed
net.ipv4.conf.all.arp_accept = 0
$ sysctl -w net.ipv4.conf.all.arp_accept=1 # Now, unsolicited ARP is allowed
net.ipv4.conf.all.arp_accept = 1
10. 只发送 ARP 回复
使用带有-A选项的arping*还会更新目标主机的 ARP 表。但是,它不使用未经请求的 ARP,而是使用 ARP 回复,就像发出 ARP 请求一样:*
$ arping –A -c 1 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.17 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)
由于arping发送一个 ARP 回复,在这种情况下,我们没有得到任何响应。我们在输出的最后一行Received 0 response(s)中观察到了这种行为。arping将源 IP 地址设置为目标 IP 地址,就像使用-U选项一样。
11. 指定源 IP 地址
** arping自动分配 ARP 数据包中的源 IP 地址。但是,也可以使用*-s*选项手动设置它。**
首先,让我们尝试在不使用*-s选项的情况下 ping 目标192.39.59.17*:
$ arping –c 1 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.16 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.697ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
正如我们在输出的第一行中看到的,来自192.39.59.16的术语表示arping使用192.39.59.16作为源 IP 地址。这是本地主机的 IP 地址。
现在,让我们尝试使用*–s选项ping 目标192.39.59.17*:
$ arping –c 1 –s 192.39.59.20 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.20 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.697ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
在这里,我们使用*–s 192.39.59.20将源 IP 地址设置为192.39.59.20*。输出第一行中来自192.39.59.20的术语表明arping实际上使用了指定的源地址。
为了能够使用-s选项设置源 IP 地址,我们必须能够绑定非本地机器的地址。通常,这是禁用的。但是,我们可以通过将net.ipv4.ip_nonlocal_bind内核参数设置为1*来启用它:*
$ sysctl net.ipv4.ip_nonlocal_bind
net.ipv4.ip_nonlocal_bind = 0
$ arping –c 1 –s 192.39.59.20 192.39.59.17
bind: Cannot assign requested address
$ sysctl –w net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_nonlocal_bind = 1
$ arping –f –s 192.39.59.20 192.39.59.17
ARPING 192.39.59.17 from 192.39.59.20 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.697ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
如我们所见,我们不能使用指定的 IP 地址作为源 IP 地址,因为内核参数等于0。但是,当我们将内核参数设置为1时,我们可以使用与源 IP 地址相同的 IP 地址。
12. 在重复地址检测模式下运行
我们将-D选项传递给arping以在重复地址检测 (DAD) 模式下运行它。如果网络中的另一台主机正在使用目标 IP 地址,则arping会检测到这一点并返回1。如果没有重复的 IP 地址,则返回0。**
让我们在 DAD 模式下测试已经使用的 IP 地址192.39.59.17:
$ arping –D –c 1 192.39.59.17
ARPING 192.39.59.17 from 0.0.0.0 eth0
Unicast reply from 192.39.59.17 [00:50:56:B2:AB:CD] 0.970ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
$ echo $?
1
由于IP地址192.39.59.17是远程主机的IP地址,所以arping返回1作为退出状态。
现在,让我们使用*-D*选项ping 一个未使用的 IP 地址:
$ arping -D –c 1 192.39.59.20
ARPING 192.39.59.20 from 0.0.0.0 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)
$ echo $?
0
现在,由于没有 IP 地址为192.39.50.20的主机,arping的退出状态为0。
在 DAD 模式下使用arping会自动将源 IP 地址设置为0.0.0.0。