繁体   English   中英

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

[英]Sampling traffic in python/scapy

我目前正在寻求使用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)

我也查看过套接字的创建,但是没有找到合适的答案。

我的问题是,在网络接口上捕获和采样流量的最有效,性能最佳的方法是什么?

好吧,首先,如果您要使用延迟/计时器,则需要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

希望对您有所帮助!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM