簡體   English   中英

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的路由路徑如下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.7scapy (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 xclass 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM