sniff instalar espaƱol python networking pcap scapy network-traffic

instalar - scapy python 3



Scapy y tcpreplay: omite el archivo temporal para el rendimiento (1)

Scapy tiene una función sendpfast que envía paquetes usando tcpreplay. Sin embargo, esta función primero crea un archivo pcap temporal y luego llama a tcpreplay sobre eso. Esto agrega demasiada demora. ¿Hay alguna forma de eludirlo y enviar datos directamente a tcpreplay? Sé que tcpreplay puede leer datos de STDIN.

Contexto: Quiero generar un gran tráfico (con diferentes srcIP) cada segundo y enviarlo a través de la red. Una opción es guardar todo el tráfico con marcas de tiempo en un archivo pcap gigante y ejecutar tcpreplay. Otra opción es enviar datos cada segundo.


No estoy seguro de si será o no suficiente evitar el archivo temporal, pero aún así, aquí hay una forma:

#! /usr/bin/env python from scapy.all import * def pkt2pcap(p): sec = int(p.time) usec = int(round((p.time-sec)*1000000)) s = str(p) caplen = len(s) return struct.pack("IIII", sec, usec, caplen, caplen) + s # adapted from Scapy''s sendpfast def mysendpfast(x, pps=None, mbps=None, realtime=None, loop=0, file_cache=False, iface=None): """Send packets at layer 2 using tcpreplay for performance pps: packets per second mpbs: MBits per second realtime: use packet''s timestamp, bending time with realtime value loop: number of times to process the packet list file_cache: cache packets in RAM instead of reading from disk at each iteration iface: output interface """ if iface is None: iface = conf.iface argv = [conf.prog.tcpreplay, "--intf1=%s" % iface ] if pps is not None: argv.append("--pps=%i" % pps) elif mbps is not None: argv.append("--mbps=%i" % mbps) elif realtime is not None: argv.append("--multiplier=%i" % realtime) else: argv.append("--topspeed") if loop: argv.append("--loop=%i" % loop) if file_cache: argv.append("--enable-file-cache") argv.append("-") try: f = subprocess.Popen(argv, stdin=subprocess.PIPE) # PCAP header p = x.next() f.stdin.write(struct.pack("IHHIIII", 0xa1b2c3d4L, 2, 4, 0, 0, MTU, conf.l2types[p.__class__])) # Let''s send f.stdin.write(pkt2pcap(p)) for p in x: f.stdin.write(pkt2pcap(p)) f.stdin.close() f.communicate() except KeyboardInterrupt: log_interactive.info("Interrupted by user") except Exception,e: log_interactive.error("while trying to exec [%s]: %s" % (argv[0],e))