Cómo detectar paquetes usando libpcap y Python
1. Los datos de memoria almacenados en la versión Python de pcap son demasiado pequeños, lo que significa que el caché no es suficiente y es fácil que se pierdan paquetes en condiciones de alta concurrencia. la versión C también tiene el mismo problema, pero el caché de la versión Python es realmente demasiado bajo y deprimente.
2. El análisis del protocolo dpkt no es necesario. Si está familiarizado con protocolos como RFC 791 y RFC 793, puede utilizar struct.unpack.
Si está acostumbrado a usar tcpdump para capturar paquetes de datos, puede usarlo en lugar de paquetes pcap, pero necesitamos usar tcpdump para capturar datos en formato pcap para guardarlos. Pensará en la herramienta Wireshark. Los comandos específicos son los siguientes:
tcpdump dst 10.13.202.116 y tcp dst port 80 -s 0 -i eth1 -w .../pcap/tcpdump.pcap -C. 1k -W 5
Primero debemos comprender el formato de archivo pcap. Para obtener información específica, puede consultar otros documentos. Solo hablaré sobre sus componentes estructurales importantes, de la siguiente manera: <. /p>
sturct pcap_file_header
{
DWORD magic;
WORD version_major;
WORD version_minor;
DWORD esta zona;
DWORD sigfigs;
DWORD snaplen;
DWORD tipo de enlace;
}
struct pcap_pkthdr
{
struct timeval ts;
DWORD caplen;
DWORD len;
}
struct timeval
{
DWORD GMTtime;
DWORD microTime;
}
Una cosa a tener en cuenta aquí es que dado que todo en el mundo de Python es un objeto, Python a menudo se siente más problemático al procesar paquetes de datos. Python proporciona múltiples libpcapbind, .Ethernet(pdata)
Si p.data.__class__.__name__=='IP':
ip='%d.%d.% d. %d.%d'%tuple(map(ord,list(p.data.dst)))
si p.data.data.__class__.__name__=='TCP': p>
if data.dport==80:
imprimir p.data.data.data
Mostrar los parámetros nrecv,ndrop,nifdrop=pc.stats() devueltos Algunas tuplas donde el primer parámetro es el paquete recibido y el segundo parámetro es el paquete descartado por el núcleo.
En cuanto a cómo monitorear los datos del archivo pcap generado por tcpdump, puede usar el paquete de software pyinotify, como se muestra a continuación:
class Packer(pyinotify.ProcessEvent):
def __init__(self, producto):
self.product = producto
self.process = Ninguno
def process_IN_CREATE(self, evento) :
logger.debug("crear archivo: %s en cola" % self.process_IF_START_THREAD(evento))
def proceso_IN_MODIFY(self, evento):
self.process_IF_START_THREAD (evento)
logger.debug("modificar archivo: %s en cola" % self.process_IF_START_THREAD(evento))
def process_IN_DELETE(self, evento):
nombre de archivo = os.path.join(event.path, event.name)
logger.debug("eliminar archivo: %s en cola" % self.process_IF_START_THREAD(event))