El paquete Scapy enviado no puede ser recibido

Estoy intentando enviar paquetes UDP con scapy con el siguiente comando:

>> send(IP(dst="127.0.0.1",src="111.111.111.111")/UDP(dport=5005)/"Hello") . Sent 1 packets. 

Y desde tcpdump puedo ver:

 22:02:58.384730 IP 111.111.111.111.domain > localhost.5005: [|domain] 

Estoy tratando de recibir este paquete con el siguiente código:

 import socket UDP_IP = "127.0.0.1" UDP_PORT = 5005 sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP sock.bind((UDP_IP, UDP_PORT)) while True: data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes print "received message:", data 

Pero no puede recibir el mensaje.

He probado la red enviando paquetes udp normalmente con el siguiente código y el paquete se puede recibir:

 import socket import time UDP_IP = "127.0.0.1" UDP_PORT = 5005 print "UDP target IP:", UDP_IP print "UDP target port:", UDP_PORT sock = socket.socket(socket.AF_INET, # Internet socket.SOCK_DGRAM) # UDP num = 0 while True: sock.sendto(str(num), (UDP_IP, UDP_PORT)) print "Message sent: " + str(num) num += 1 time.sleep(1) 

Cualquier ayuda será apreciada.

—————- Actualizaciones ———————–

Un paquete enviado por Scapy que no puede ser recibido:

 13:22:52.984862 IP (tos 0x0, ttl 64, id 1, offset 0, flags [DF], proto UDP (17), length 33) 127.0.0.1.5555 > 127.0.0.1.12345: [udp sum ok] UDP, length 5 0x0000: 4500 0021 0001 4000 4011 3cc9 7f00 0001 E..!..@.@.<..... 0x0010: 7f00 0001 15b3 3039 000d 9813 4865 6c6c ......09....Hell 0x0020: 6f o 

Mientras que un paquete enviado por el script normal de Python puede ser recibido:

 13:20:02.374481 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 33) 127.0.0.1.53143 > 127.0.0.1.12345: [bad udp cksum 0xfe20 -> 0xde2e!] UDP, length 5 0x0000: 4500 0021 0000 4000 4011 3cca 7f00 0001 E..!..@.@.<..... 0x0010: 7f00 0001 cf97 3039 000d fe20 4865 6c6c ......09....Hell 0x0020: 6f 

Parece que está utilizando Scapy para enviar el tráfico UDP a su interfaz localhost. En la función send() , especifique la interfaz de salida apropiada para enviar el tráfico.

Ejemplo:

 send((IP(dst="127.0.0.1",src="111.111.111.111")/UDP(dport=5005)/"Hello"),iface="lo0") 

En mi computadora, lo0 es mi interfaz de bucle de retorno local. Para ver o configurar la interfaz predeterminada para scapy, echa un vistazo a la mitad inferior de esta publicación: http://thepacketgeek.com/scapy-p-02-installing-python-and-scapy/

Puede usar nfqueue e iptables: define una regla para dirigir sus paquetes a la cola y luego los intercepta con su script.

Aquí hay un ejemplo básico:

 import nfqueue, socket from scapy.all import * import os #add iptables rule os.system('iptables -A OUTPUT -j NFQUEUE --queue-num 0') #since you are sending packets from your machine you can get them in the OUPUT hook or even in the POSTROUTING hook. #Set the callback for received packets. The callback should expect the payload: def cb(payload): data = payload.get_data() p = IP(data) #your manipulation q = nfqueue.queue() q.open() q.unbind(socket.AF_INET) q.bind(socket.AF_INET) q.set_callback(cb) q.create_queue(0) #Same queue number of the rule try: q.try_run() except KeyboardInterrupt, e: os.system('iptables -t -F') #remove iptables rule print "interruption" q.unbind(socket.AF_INET) q.close()