Как правильно сканировать локальную сеть, отправив запрос ARP со scapy и перехватить ответ? - PullRequest
0 голосов
/ 02 июня 2019

Я хотел создать сетевой сканер, который отправлял бы ARP-запрос на широковещательный mac-адрес ff: ff: ff: ff: ff: ff.Мой письменный код получает ответ от всех устройств, которые присутствуют в моей локальной сети, но когда я запускаю его снова, он всегда показывает мне меньше устройств по сравнению с первым сканированием.

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

1 Ответ

1 голос
/ 02 июня 2019

Ваш код кажется правильным.

Результаты ARP очень разные. На самом деле, некоторые устройства (например, большинство устройств Apple) не отвечают на широковещательные запросы или регистрируют безвозмездные ARP по соображениям безопасности (и отвечают только на те, которые им нужны). Не все устройства могут быть доступны для сканирования не всегда, поэтому результаты сканирования могут быть разными.

Что вы могли бы сделать:

  • выполнить несколько проверок с тайм-аутом и суммировать результаты
  • выполнить пассивное сканирование ARP (это занимает больше времени): прослушивание сети для пакетов ARP между другими клиентами и регистрация клиентов для каждого увиденного пакета
  • сохраните свой текущий код: -)
...