发送到另一台主机后无法接收到 scapy 嗅探的 udp 数据包
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 的路由路径如下输出。
>>> 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
此外,我的输出界面上的tcpdump
显示,当使用
send(IP(dst='ANY_DST)/UDP(dport=ANY_PORT))
数据包正在发出,但是当我发送嗅探到的数据包时,它们没有发出!
我哪里错了?
问题可能出在更改的数据包上吗?它们是 RTP
个包含负载的数据包。
我对 python 和 scapy 很陌生。任何帮助都可以成为朝着正确方向前进的光。感谢您的宝贵时间。
我的 OS 是 FreeBSD9.2
,我正在使用 python 2.7
和 scapy (2.2.0)
。
if I replace the send line with the following line, these packets will
be received in the destination!
send(IP(dst='192.168.12.112')/UDP(dport=10000))
调试代码,查看scapy源码后,找到了上述问题的原因。当我调用 send(pkt)
时,从 class L3dnetSocket
调用以下函数。
def send(self, x):
iff,a,gw = x.route()
# Rest of the code is ignored here
这里的对象 x
属于 class Packet
并且它的 route
函数总是 returns None
用于 gateway
!所以数据包将在第 2 层发送。
def route(self):
return (None,None,None)
而当我调用 send(IP(dst='192.168.12.112')/UDP(dport=10000))
时,对象类型 x
是 class IP
它是 route
函数 returns 正确的 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
此外,在我可达的网络中没有收到数据包的原因是我的网络:)
我正在尝试将 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 的路由路径如下输出。
>>> 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
此外,我的输出界面上的tcpdump
显示,当使用
send(IP(dst='ANY_DST)/UDP(dport=ANY_PORT))
数据包正在发出,但是当我发送嗅探到的数据包时,它们没有发出!
我哪里错了?
问题可能出在更改的数据包上吗?它们是 RTP
个包含负载的数据包。
我对 python 和 scapy 很陌生。任何帮助都可以成为朝着正确方向前进的光。感谢您的宝贵时间。
我的 OS 是 FreeBSD9.2
,我正在使用 python 2.7
和 scapy (2.2.0)
。
if I replace the send line with the following line, these packets will be received in the destination!
send(IP(dst='192.168.12.112')/UDP(dport=10000))
调试代码,查看scapy源码后,找到了上述问题的原因。当我调用 send(pkt)
时,从 class L3dnetSocket
调用以下函数。
def send(self, x):
iff,a,gw = x.route()
# Rest of the code is ignored here
这里的对象 x
属于 class Packet
并且它的 route
函数总是 returns None
用于 gateway
!所以数据包将在第 2 层发送。
def route(self):
return (None,None,None)
而当我调用 send(IP(dst='192.168.12.112')/UDP(dport=10000))
时,对象类型 x
是 class IP
它是 route
函数 returns 正确的 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
此外,在我可达的网络中没有收到数据包的原因是我的网络:)