通过使用 scapy 发送 ARP 请求并捕获响应来扫描本地网络的正确方法是什么?
what is the proper way to scan local network by sending ARP request with scapy and capture the response?
我想制作一个网络扫描器,将 ARP 请求发送到 ff:ff:ff:ff:ff:ff 的广播 mac 地址。
我编写的代码得到了局域网中所有设备的响应,但是当我再次 运行 时,与第一次扫描相比,它总是显示更少的设备。
def check_arping(ip):
arp_request = scapy.ARP(pdst = ip)
broadcast = scapy.Ether(dst = "ff:ff:ff:ff:ff:ff")
arp_request_broadcast = broadcast / arp_request
answered_list = scapy.srp(arp_request_broadcast, timeout = 1, verbose = False)[0]
clients_list = []
for eachelement in answered_list:
client_dict = {
"IP": eachelement[1].psrc,
"MAC": eachelement[1].hwsrc
}
clients_list.append(client_dict)
return clients_list
您的代码似乎是正确的。
ARP 结果变化很大。事实上,出于安全原因,某些设备(例如大多数 Apple 设备)不会回复广播请求或注册无偿 ARP(并且仅在需要时回复这些请求)。并非所有设备都可用于扫描,导致扫描结果不同。
你可以做什么:
- 超时执行多次扫描,并对结果求和
- 执行被动 ARP 扫描(需要更长的时间):嗅探网络以查找其他客户端之间的 ARP 数据包,并在看到的每个数据包上注册客户端
- 保留您当前的代码:-)
我想制作一个网络扫描器,将 ARP 请求发送到 ff:ff:ff:ff:ff:ff 的广播 mac 地址。 我编写的代码得到了局域网中所有设备的响应,但是当我再次 运行 时,与第一次扫描相比,它总是显示更少的设备。
def check_arping(ip):
arp_request = scapy.ARP(pdst = ip)
broadcast = scapy.Ether(dst = "ff:ff:ff:ff:ff:ff")
arp_request_broadcast = broadcast / arp_request
answered_list = scapy.srp(arp_request_broadcast, timeout = 1, verbose = False)[0]
clients_list = []
for eachelement in answered_list:
client_dict = {
"IP": eachelement[1].psrc,
"MAC": eachelement[1].hwsrc
}
clients_list.append(client_dict)
return clients_list
您的代码似乎是正确的。
ARP 结果变化很大。事实上,出于安全原因,某些设备(例如大多数 Apple 设备)不会回复广播请求或注册无偿 ARP(并且仅在需要时回复这些请求)。并非所有设备都可用于扫描,导致扫描结果不同。
你可以做什么:
- 超时执行多次扫描,并对结果求和
- 执行被动 ARP 扫描(需要更长的时间):嗅探网络以查找其他客户端之间的 ARP 数据包,并在看到的每个数据包上注册客户端
- 保留您当前的代码:-)