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
相关产品推荐
相关产品推荐

