Выборка трафика в Python / Scapy - PullRequest
0 голосов
/ 30 ноября 2018

В настоящее время я ищу реализацию базового сэмплера трафика с использованием python, и мне интересно, как эффективно реализовать интервал сэмплера между каждым захватом.Я не использую sFlow, так как хочу пробовать трафик на моей сетевой карте.

Я посмотрел на scapy, но, похоже, он не предоставляет функцию выборки.Следовательно, в функции обработки, прикрепленной к сниффу (например, снифф (prn = XXX)), должен ли я реализовать таймер, чтобы проверить, должен ли пакет обрабатываться специально?

В противном случае у меня есть идея со следующим кодом(базовый пример):

#Packet sniffer in python
#For Linux

import socket

#create an INET, raw socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

# receive a packet
while True:
  sleep(1) # Timer ?
  print s.recvfrom(65565)

Я также посмотрел на создание сокета, но не нашел подходящего ответа.

Мой вопрос, что является наиболее эффективным, производительностьспособ сбора и выборки трафика на сетевом интерфейсе?

1 Ответ

0 голосов
/ 30 ноября 2018

Ну, во-первых, если у вас будет задержка / таймер, вам нужно import time или если вы используете sleep(n), чтобы сделать from time import sleep.Во-вторых, я лично считаю, что таймеры - не лучший вариант для перехвата пакетов.Особенно, если вы фильтруете / ищете определенные типы пакетов.Кроме того, чтобы получить какие-либо соответствующие детали необработанного пакета, вам необходимо его деконструировать.Модуль struct в python, вероятно, лучше всего подходит для этого, и вам нужно знать, как извлечь данные из определенных полученных пакетов.При получении пакетных данных с использованием s.recvfrom(65535) они сохраняются в кортеже, и вам необходимо сосредоточиться на первом элементе этого, используя что-то вроде:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
    try:
        packet = s.recvfrom(65565)
        packet = packet[0]
        #begin to analyse and deconstruct packet data
    except:
        pass

Каждый пакет данных построен таким образом, чтоВы можете извлечь полезную информацию из каждого из них.Простой поиск того, как они упакованы, может помочь вам узнать, как деконструировать их и показать информацию.Посмотрите на модуль struct, и это должно вас оттолкнуть!Если вам действительно нужна задержка по какой-то причине, я бы использовал максимум sleep(0.5).

Для эффективности вы можете захотеть реализовать многопоточность.Если ваш код работает нормально, это не обязательно будет необходимо, но если вы захотите, вы можете запустить поток для деконструкции полученного пакета, пока ваш NIC все еще принимает пакеты.ЧТО-ТО выглядело бы так:

import socket
import thread

def deconstructPacket(packet):
    #code to deconstruct packet

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
while True:
    try:
        packet = s.recvfrom(65565)
        packet = packet[0]
        thread.start_new_thread(deconstructPacket, packet)
    except:
        pass #or handle any errors

Надеюсь, это помогло !!!

...