2013-11-25 3 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 

в то время как пакет, отправленный обычным питоном скрипт, который может быть получен:

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 к вашему локальному хосту интерфейс. В функции send() укажите соответствующий исходящий интерфейс для отправки трафика.

Пример:

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

На моем компьютере, то lo0 мой локальный интерфейс обратной петли. Для того, чтобы увидеть или настроить интерфейс по умолчанию для scapy, проверить нижнюю половину этого поста: http://thepacketgeek.com/scapy-p-02-installing-python-and-scapy/

+1

Спасибо Mat! Я нашел 'ifconfig' и нашел' eth0', 'eth1' и' lo'. Я пробовал каждый из них, но он все еще не работает ... – ethanjyx

+0

Поскольку вы можете нюхать пакет Scapy с помощью tcpdump, я не думаю, что это проблема Scapy. Я нашел подобный поток с этой проблемой: http://stackoverflow.com/questions/17688061/talking-to-c-socket-with-scapy –

+0

У меня такая же проблема. Я создал не-scapy-программу и могу получать пакеты. Сравнение пакетов, которые работают, и те, которые не работают в wirehark, показывают, что единственное различие заключается в том, что scapy-пакеты используют широковещательный адрес уровня 2. Если я укажу MAC-адреса в пакете scapy, перезаписывает 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() 
Смежные вопросы