发送到另一台主机后无法接收到 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.7scapy (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)) 时,对象类型 xclass 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

此外,在我可达的网络中没有收到数据包的原因是我的网络:)