python/scapy中的采样流量

2024-06-16 11:47:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在考虑使用python实现一个基本的流量采样器,我想知道如何有效地实现每次捕获之间的采样器间隔。 我不使用sFlow,因为我想在我的NIC上采样流量。你知道吗

我看过scapy,但它似乎没有提供采样功能。 因此,在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)

我也查看了套接字的创建,但没有找到任何合适的答案。你知道吗

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


Tags: 功能间隔socket附带scapy流量xxx计时器
1条回答
网友
1楼 · 发布于 2024-06-16 11:47:32

首先,如果你要有一个延迟/计时器,你需要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

我希望这有帮助!!!你知道吗

相关问题 更多 >