【问题标题】:Sampling traffic in python/scapy在 python/scapy 中采样流量
【发布时间】:2018-11-30 15:32:40
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以在scapy的sniff函数上使用prn参数,然后在time.time()大于存储值20秒时执行一个动作

标签: python scapy sampling network-monitoring


【解决方案1】:

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

希望对你有帮助!!!

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 2016-06-19
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多