2013-11-25 167 views
4

我试图发送UDP包用下面的命令Scapy的:Scapy的数据包不能被接受

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

而且从tcpdump我可以看到:

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

我想用以下代码接收此数据包:

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 

但无法接收消息。

我已通过用下面的代码正常地发送UDP数据包所测试的网络,并且可以接收的分组:

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) 

任何帮助将不胜感激。

----------------更新-----------------------

数据包通过Scapy的发送,不能接受:

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 [email protected]@.<..... 
    0x0010: 7f00 0001 15b3 3039 000d 9813 4865 6c6c ......09....Hell 
    0x0020: 6f  

           o 

尽管通过正常的python脚本发送的数据包可以接收:

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 [email protected]@.<..... 
    0x0010: 7f00 0001 cf97 3039 000d fe20 4865 6c6c ......09....Hell 
    0x0020: 6f 
+0

是同一接口上,这些输出?源和目标MAC地址在两个数据包中不同。在某些情况下,由于目标MAC地址错误,数据包不能到达目的地。 – SuB

回答

2

看起来你正在使用Scapy的到UDP流量发送到localhost接口。在send()函数中,指定适当的出站接口来发送流量。

例子:

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

在我的电脑中,lo0的是我的本地loopback接口。要查看或设置scapy的默认界面,请查看本文的下半部分:http://thepacketgeek.com/scapy-p-02-installing-python-and-scapy/

+1

谢谢!我发现'ifconfig'并找到'eth0','eth1'和'lo'。我尝试了其中的每一个,但它仍然无法正常工作... – ethanjyx

+0

由于您可以用tcpdump嗅探Scapy数据包,因此我不认为这是Scapy问题。我发现这个问题有类似的线程:http://stackoverflow.com/questions/17688061/talking-to-c-socket-with-scapy –

+0

我有同样的问题。我创建了一个非scapy程序,可以接收数据包。比较工作的数据包和那些不在wireshark中的数据包表明唯一的区别是scapy数据包正在使用第2层广播地址。如果我在数据包scapy中指定一个MAC地址,将覆盖用广播地址指定的MAC地址。 –

0

您可以使用nfqueue和iptables: 您定义了一个规则将数据包引导至队列,然后使用脚本拦截它们。

这是一个基本的例子:

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()