2013-11-25 62 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()