如何手动发送 ARP 请求

如何手动发送 ARP 请求

我最近用 Tcpdump 嗅探了一个数据包“ARP,请求谁有 192.168.2.3 告诉 192.168.2.2,长度 28”。

我想重现此消息,并从我的笔记本电脑向我决定的任何 IP 发送 ARP 请求。我该怎么做?

我也对强制刷新整个 ARP 表感兴趣。我知道删除表会刷新它,但只有笔记本电脑,这个操作真的很慢,重建完整的 ARP 表可能需要 1/2/5 分钟。有没有办法通过发送广播 ARP 请求来强制重建表?

我使用的 Mac 操作系统是最新的 Yosemite 10.10.4

谢谢。

答案1

nmap是一个通用的网络扫描工具,只能用于进行 arp 扫描:

nmap -PR 10.0.1.0/24 -sn

禁用-sn端口扫描,因此它只执行 arp 请求,并且-PR进行 arp 扫描。

答案2

有一款开源工具arping可让您发送自定义 ARP 请求。您可以从您最喜欢的 OS X 开源包管理器(例如 Homebrew 或 MacPorts)获取它。

ARP 请求通常是广播的(因为你不知道要将它们发送到哪个 MAC 地址,否则你就不需要发送一个了)。然而,它们不是通配符;也就是说,您无法发送单个请求,要求网络上的所有主机向您发送 ARP 响应。该协议不提供指定通配符来代替目标 IP 地址的方法。

答案3

ARP 数据包由操作系统按需发送 - 本质上,当操作系统需要与同一子网上的另一个 IP 地址通信并且它还不知道该主机的 MAC 地址时,它会发送 ARP 请求。这意味着重建表并不是一个定义明确的过程,因为在计算机第一次尝试与它们通信之前,您实际上并不知道那里有哪些其他主机。

刷新表中当前 IP 地址的条目并不太难。只需列出当前条目,使用sudo arp -da删除所有当前条目,然后使用类似以下ping方法强制操作系统对每个已删除的条目进行重新 ARP:

ip_addresses=$(arp -an | grep -Ev '\(incomplete\)|ff:ff:ff:ff:ff:ff'| sed -n 's/? (\([0-9.]*\)) at .*$/\1/p')
sudo arp -da
for ip in $ip_addresses; do ping -c1 -t1 $ip & disown; done &>/dev/null

请注意,最后一个命令会在后台触发所有命令ping,因此它们几乎同时运行,并且表格应该很快重建。

如果您只想删除并重新 ARP 单个条目,请执行以下操作:

sudo arp -d 10.0.0.1
ping -c1 -t1 10.0.0.1

相关内容