在python / scapy中对流量进行采样

时间:2018-11-30 15:32:40

标签: python scapy sampling network-monitoring

我目前正在寻求使用python实现基本的流量采样器,并且我想知道如何有效地实现每次捕获之间的采样器间隔。 我不使用sFlow,因为我想对NIC上的流量进行采样。

我看过鱼骨,但似乎没有提供采样功能。 因此,在附加到sniff的处理函数中(例如sniff(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 :(得分:0)

首先,如果要使用延迟/计时器,则需要import time,或者仅使用sleep(n)来完成from time import sleep。其次,我个人认为计时器并不是嗅探数据包的最佳选择。特别是如果您要过滤/查找某些类型的数据包。另外,要获取原始数据包的任何相关详细信息,您还需要对其进行解构。 python中的struct模块可能是最好的选择,您需要了解如何从某些接收到的数据包中提取数据。当使用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

我希望这对您有帮助!