You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scapy转发UDP数据包至局域网主机失败:发送无响应排查

排查Scapy转发UDP数据包但Wireshark无法捕获的问题

我帮你分析下代码里的几个关键问题,这些应该就是导致Wireshark抓不到包的核心原因:

1. 数据包层级索引错误

你用packet[0][1].dst修改目标IP的方式不够可靠,Scapy里应该直接通过协议层对象来访问字段,比如packet[IP].dst。数字索引很容易因为数据包结构变化(比如带VLAN标签的包)导致修改到错误的层级,等于根本没改到IP头部的目标地址。

2. send()函数的路由干扰

send()是基于三层(网络层)发送数据包,它会依赖系统路由表来决定走哪个接口、发给哪个网关。如果你的系统路由表没有明确指向192.168.0.5的条目,数据包可能被发往默认网关,而不是直接发给目标PC。换成sendp()(二层发送)会更适合局域网内的转发,它直接在数据链路层发送,绕过系统路由的干扰。

3. 未重置失效的校验和

当你修改IP或UDP头部内容后,原来的校验和就失效了。虽然Scapy默认会自动重新计算校验和,但手动删除旧的校验和字段能避免潜在的异常,确保新的校验和正确生成。

修改后的代码

这里是修复后的完整代码,你可以直接测试:

#!/usr/bin/env python3
from scapy.all import sniff, sendp, IP, UDP

def spoof_and_send(packet):
    # 先确认数据包包含IP和UDP层,避免处理无效包
    if IP in packet and UDP in packet:
        # 修改目标IP为192.168.0.5
        packet[IP].dst = '192.168.0.5'
        # 删除旧的校验和,让Scapy自动重新计算
        del packet[IP].chksum
        del packet[UDP].chksum
        # 用sendp发送,可选指定网卡接口(比如'eth0'或'wlan0')
        sendp(packet, verbose=0)
        print(f"Forwarded UDP packet to 192.168.0.5")

# 抓包时建议指定网卡接口,避免Scapy监听错误的接口
packets = sniff(filter='udp and portrange 6000-7999', prn=spoof_and_send, iface='你的网卡名称')

额外排查步骤

除了代码修复,你还可以做这些检查来确认问题:

  • 在目标PC(192.168.0.5)上运行Wireshark,设置过滤器ip.dst == 192.168.0.5 and udp来精准捕获流量
  • 确认两台PC在同一个局域网,能互相ping通,且双方防火墙没有拦截UDP 6000-7999端口的流量
  • 在运行脚本的PC上用tcpdump抓包验证:tcpdump -i 你的网卡 udp dst host 192.168.0.5,看看是否有数据包发出

内容的提问来源于stack exchange,提问作者Dala Laa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:48:13