Можно ли получить ответ ping с другим процессом / потоком, используя scapy - PullRequest
0 голосов
/ 15 января 2020

Я хочу собрать и отправить несколько пакетов ICMP с одним процессом и получить ответы от другого, чтобы работать с эхо-ответом ICMP (например, отправка трассировки на недоступные хосты). Для этой проблемы я использую scapy. Я уже тестировал его без многопроцессорности и встроенных методов scapy, таких как srp1() / sr() или с использованием сокета s.send(packet), которые все замедлялись для моих целей. Вариант s.send(packet) был самым быстрым способом просто отправить пакеты, но я хочу поработать с ответами и не нашел способа их получить.

packet = Ether()/IP(dst='192.168.0.0/24')/ICMP()
    packets = [p for p in packet]
    s = conf.L2socket(iface='enp0s3')
    for p in packets:
        s.send(p)

До сих пор я пытался использовать один процесс для отправки и один для получения.

def sendICMP():
    print('sending...')
    packet = Ether()/IP(dst='192.168.0.0/24')/ICMP()
    packete = [p for p in packet]
    s = conf.L2socket(iface='enp0s3')
    for p in packete:
        s.send(p)

def recvICMP():
    print('receiving...')
    s = conf.L2socket(iface='enp0s3')
    a = sniff(iface='enp0s3', filter="icmp and src 192.168.0.1", count=256) 
    print(a[0].getlayer(ICMP).type)


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=sendICMP)
    p2 = multiprocessing.Process(target=recvICMP)

    p1.start()
    p2.start()

    p1.join()
    p2.join()

Это не работает. Это проблема отправки и прослушивания на одном сокете с двумя процессами. Поток будет лучше работать здесь? Мне также пришло в голову, что я могу использовать очередь, в которую я могу поместить ответы от ICMP-запросов, но я не знаю, как это сделать. В основном я ищу очень эффективную возможность отправлять и получать много пакетов ICMP. Порядок пакетов ответов не очень важен.

1 Ответ

0 голосов
/ 15 января 2020

На самом деле изменение аргументов сниффа на a = sniff(iface='enp0s3', filter="icmp", count=0) делает свою работу. Поскольку переменная a является scapy.plist.PacketList, вы можете выполнить итерацию по ней, чтобы получить информацию о каждом отдельном пакете. Доступ к ping, например, информация выполняется следующим образом:

a[i].getlayer(ICMP).type => i = номер пакета.

...