我目前正在寻求使用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)
我也查看过套接字的创建,但是没有找到合适的答案。
我的问题是,在网络接口上捕获流量并对其进行采样的最有效的方式是什么?
答案 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
我希望这对您有帮助!