如何手動發送ARP請求

如何手動發送ARP請求

我最近用Tcpdump嗅探了一個封包「ARP,請求誰-有192.168.2.3告訴192.168.2.2,長度28」。

我想重現此訊息,並將 ARP 請求從我的筆記型電腦發送到我決定的任何 IP。我怎樣才能做到這一點 ?

我也有興趣強制刷新整個 ARP 表。我知道刪除該表會更新它,但只有筆記型電腦此操作非常慢,並且可能需要長達 1/2/5 分鐘才能重建完整的 ARP 表。有沒有辦法透過發送廣播 ARP 請求來強制重建表?

我使用的是最新作業系統 Yosemite 10.10.4 的 Mac

謝謝。

答案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

請注意,最後一個命令會在背景觸發所有pings,因此它們幾乎都會同時運行,並且表應該很快就會重建。

如果您只想刪除並重新 ARP 單一條目,請執行以下操作:

sudo arp -d 10.0.0.1
ping -c1 -t1 10.0.0.1

相關內容