[英]scapy sniffed udp packets can not be received after sending to another host
我正在嘗試將scapy
嗅探到的udp
數據包發送到另一台主機。 主機地址可通過我的默認網關訪問。
在主機中,我通過tcpdump
監聽目標端口10000
,但沒有收到數據包。
我的代碼是這樣的:
from scapy.all import *
class Des:
def __init__(self, port):
self.port = port
def send_packets(port):
des = Des(port)
def get_pack(packet):
pkt = packet.copy()
pkt['IP'].dst= "192.168.20.111" # address of the destination host
pkt['IP'].src = "192.168.12.111" # address of my system
pkt['UDP'].dport = des.port
pkt['Ethernet'].dst = dst_mac
pkt['Ethernet'].src = src_mac
send(pkt)
return get_pack
sniff(filter = 'udp and port 50000', prn = send_packets(10000))
如果我將數據包發送到網絡中的另一台主機192.168.12.112
,問題仍然存在。 在這種情況下,如果我用下面的行替換send
行,這些數據包將在目的地收到!
send(IP(dst='192.168.12.112')/UDP(dport=10000))
將其替換為以下行時,會導致主機192.168.20.111
中沒有接收數據包。
send(IP(dst='192.168.20.111')/UDP(dport=10000))
我搜索了問題,但沒有找到結果。 兩邊的防火牆被禁用,scapy的路由路徑如下output。
>>> conf.route
Network Netmask Gateway Iface Output IP
0.0.0.0 0.0.0.0 192.168.12.1 vr0 192.168.12.111
192.168.12.0 255.255.255.0 0.0.0.0 vr0 192.168.12.111
此外,我的 output 界面上的tcpdump
顯示,當使用
send(IP(dst='ANY_DST)/UDP(dport=ANY_PORT))
數據包出去了,但是當我發送嗅探的數據包時,它們沒有!
我在哪里 go 錯了? 問題可能出在更改的數據包上嗎? 它們是包含有效負載的RTP
數據包。
我對 python 和 scapy 很陌生。 任何幫助都可以成為朝着正確方向前進的光。 謝謝你的時間。
我的操作系統是FreeBSD9.2
,我正在使用python 2.7
和scapy (2.2.0)
。
如果我用以下行替換發送行,這些數據包將在目的地收到!
發送(IP(dst='192.168.12.112')/UDP(dport=10000))
調試了代碼,查看了scapy的源碼后,找到了出現上述問題的原因。 當我調用send(pkt)
時,從L3dnetSocket
之后的 class L3dnetSocket 被調用。
def send(self, x):
iff,a,gw = x.route()
# Rest of the code is ignored here
這里 object x
是class Packet
及其route
function 總是返回None
對於gateway
。 因此數據包將在第 2 層發送。
def route(self):
return (None,None,None)
While when I call send(IP(dst='192.168.12.112')/UDP(dport=10000))
, type of object x
is class IP
that it's route
function returns the correct gateway
.
def route(self):
dst = self.dst
if isinstance(dst,Gen):
dst = iter(dst).next()
return conf.route.route(dst)
最后,我將我的代碼更改如下,它可以正常工作:)
def send_packet(port):
des = Des(port)
def get_pack(packet):
udp = UDP()
udp.sport = packet[UDP].sport
udp.dport = des.port
udp.len = packet[UDP].len
ip = IP()
ip.version = packet[IP].version
ip.tos = packet[IP].tos
ip.len = packet[IP].len
ip.id = packet[IP].id
ip.flags = packet[IP].flags
ip.frag = packet[IP].frag
ip.ttl = packet[IP].ttl
ip.proto = packet[IP].proto
ip.dst = '192.168.12.112'
payload = packet[Raw].load
pkt = ip/udp/payload
pkt = pkt.__class__(bytes(pkt))
send(pkt)
return get_pack
此外,在我的可達網絡中未收到數據包的原因是來自我的網絡:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.