Python scapy嗅探到的udp数据包在发送到其他主机后无法接收

Python scapy嗅探到的udp数据包在发送到其他主机后无法接收,python,sockets,networking,scapy,packet,Python,Sockets,Networking,Scapy,Packet,我正在尝试将scapy嗅探到的udp数据包发送到另一台主机。可以通过默认网关访问主机地址 在主机中,我通过tcpdump监听目标端口10000,但是没有收到数据包。 我的代码是: 从scapy.all导入* Des类: def _u初始(自身,端口): self.port=端口 def发送_数据包(端口): des=des(端口) def get_包(数据包): pkt=packet.copy() pkt['IP'].dst=“192.168.20.111”#目标主机的地址 pkt['IP'].

我正在尝试将
scapy
嗅探到的
udp
数据包发送到另一台主机。可以通过默认网关访问主机地址

在主机中,我通过
tcpdump
监听目标端口
10000
但是没有收到数据包。

我的代码是:

从scapy.all导入*
Des类:
def _u初始(自身,端口):
self.port=端口
def发送_数据包(端口):
des=des(端口)
def get_包(数据包):
pkt=packet.copy()
pkt['IP'].dst=“192.168.20.111”#目标主机的地址
pkt['IP'].src=“192.168.12.111”#我的系统地址
pkt['UDP'].dport=des.port
pkt['Ethernet'].dst=dst_mac
pkt['Ethernet'].src=src_mac
发送(pkt)
返回获取包
嗅探(过滤器='udp和端口50000',prn=发送_数据包(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
网络网络掩码网关Iface输出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 vr0 192.168.12.111
此外,我的输出界面上的
tcpdump
显示

send(IP(dst='ANY_-dst)/UDP(dport=ANY_-PORT))
包要出去了,但当我发送嗅探到的包时,它们不会出去

我哪里出错了? 问题可能与更改的数据包有关?它们是包含有效负载的
RTP
数据包

我对python和scapy非常陌生。任何帮助都可能是朝着正确方向前进的一盏灯。谢谢你抽出时间

我的操作系统是
FreeBSD9.2
,我使用的是
python2.7
scapy(2.2.0)

如果我用以下行替换发送行,这些数据包将 在目的地被接收

发送(IP(dst='192.168.12.112')/UDP(dport=10000))

在调试代码并检查scapy的源代码后,我找到了上述问题的原因。当我调用
send(pkt)
时,从类
L3dnetSocket
调用以下函数

def发送(self,x):
iff,a,gw=x.路线()
#其余的代码在这里被忽略
这里的对象
x
属于
类数据包
,其
路由
函数总是为
网关
返回
!因此,数据包将在第2层发送

def路由(自):
返回(无,无,无)
当我调用
send(IP(dst='192.168.12.112')/UDP(dport=10000))
时,对象
x
的类型是
class IP
,它是
路由
函数返回正确的
网关

def路由(自):
dst=self.dst
如果存在(dst,Gen):
dst=iter(dst).next()
返回conf.route.route(dst)
最后,我更改了代码,如下所示,代码运行正常:)

def发送_数据包(端口):
des=des(端口)
def get_包(数据包):
udp=udp()
udp.sport=数据包[udp].sport
udp.dport=des.port
udp.len=数据包[udp].len
ip=ip()
ip.version=数据包[ip]。版本
ip.tos=数据包[ip].tos
ip.len=数据包[ip].len
ip.id=数据包[ip].id
ip.flags=数据包[ip]。标志
ip.frag=数据包[ip].frag
ip.ttl=数据包[ip].ttl
ip.proto=数据包[ip].proto
ip.dst='192.168.12.112'
有效负载=数据包[Raw]。加载
pkt=ip/udp/payload
pkt=pkt.\uuuu类(字节(pkt))
发送(pkt)
返回获取包

此外,在我的可访问网络中未接收到数据包的原因是来自我的网络:)

“通过我的默认网关可访问主机地址”:您已通过
ping验证了这一点?对它来说,
tracert
有什么奇怪的吗?对我来说没有什么奇怪的。在scapy中,我使用了
traceroute('192.168.20.111')
,输出显示:第一步是我的
defaultgateway
,第二步是
192.168.20.111